Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Średnio jeden wieczór schodzi na jeden artykuł... Po tym zaczyna się bonanza, bo co najmniej przez tydzień męczę zadania domowe 😣 
4.4 i 4.6 jakoś poszło, ale niemiłosiernie namęczyłem się z zad.: 4.5 i choć nadal mam problemy z działaniem tej gierki, to cieszę się - jako tako działa.
Nie obyło się bez Googla i dodatkowej literatury. Kursik mocno przymusza do myślenia, ale to oczywiście zaleta... 😉
Aż z radości wkleję tutaj mój kod:

4.5:

#define przycisk 8
#define zielona 9
#define zolta 10
#define czerwona 11
#define potencjometr A5

int stan_gry = 2;
int odczyt_potencjometru = 0;
int wpisane_przez_gracza = 0;
int granica_bledu = 50;

void setup() {
  pinMode(przycisk, INPUT_PULLUP);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(czerwona, OUTPUT);
  digitalWrite(zielona, LOW);
  digitalWrite(zolta, LOW);
  digitalWrite(czerwona, LOW);
  Serial.begin(9600);
}

void loop() {

  if (stan_gry == 2) {
    delay(300);
    digitalWrite(zielona, LOW);
    digitalWrite(zolta, LOW);
    digitalWrite(czerwona, LOW);
    Serial.println("Witaj w grze polegającej na odgadywaniu wskazań potencjometru.");
    Serial.println("Dowolnie przekręć pokrętło potencjometru i naciśnij");
    Serial.println("przycisk na płytce stykowej.\n");
    while (digitalRead(przycisk) == HIGH) {
      delay(25);
    }
    odczyt_potencjometru = analogRead(potencjometr);
    Serial.println("Teraz odgadnij, na jaką wartość ustawiłeś potencjometr. Masz dwie szanse.");
    Serial.println("Wpisz tą liczbę powyżej i kliknij przycisk 'Wyślij'.\n");
    while (Serial.available() == 0) {}
    wpisane_przez_gracza = Serial.parseInt();
    if ((odczyt_potencjometru <= wpisane_przez_gracza + granica_bledu) && (odczyt_potencjometru >= wpisane_przez_gracza - granica_bledu)) {
      Serial.println("Brawo! Odgadłeś za pierwszym razem.");
      Serial.println("Naciśnij przycisk na płytce stykowej, aby rozpocząć od nowa.\n");
      digitalWrite(zielona, HIGH);
      digitalWrite(zolta, LOW);
      digitalWrite(czerwona, LOW);
      while (digitalRead(przycisk) == HIGH) {
        delay(25);
        Serial.read();
      }
      stan_gry = 2;
    } else {
      Serial.read();
      stan_gry = 1;
    }
  }

  if (stan_gry == 1) {
    Serial.println("Niestety nie zgadłeś. Masz jeszcze jedną szansę.");
    Serial.println("Wpisz liczbę powyżej i kliknij przycisk 'Wyślij \n");
    digitalWrite(zielona, LOW);
    digitalWrite(zolta, HIGH);
    digitalWrite(czerwona, LOW);
    odczyt_potencjometru = analogRead(potencjometr);
    while (Serial.available() == 0) {}
    wpisane_przez_gracza = Serial.parseInt();
    if ((odczyt_potencjometru <= wpisane_przez_gracza + granica_bledu) && (odczyt_potencjometru >= wpisane_przez_gracza - granica_bledu)) {
      Serial.println("Brawo! Odgadłeś za drugim razem.");
      Serial.println("Naciśnij przycisk na płytce stykowej, aby rozpocząć od nowa.\n");
      digitalWrite(zielona, HIGH);
      digitalWrite(zolta, LOW);
      digitalWrite(czerwona, LOW);
      while (digitalRead(przycisk) == HIGH) {
        delay(25);
      }
      stan_gry = 2;
    } else {
      Serial.println("Niestety za drugim razem też nie zgadłeś. Koniec.");
      Serial.println("Naciśnij przycisk na płytce stykowej, aby rozpocząć od nowa.\n");
      digitalWrite(zielona, LOW);
      digitalWrite(zolta, LOW);
      digitalWrite(czerwona, HIGH);
      while (digitalRead(przycisk) == HIGH) {
        delay(25);
      }
      Serial.read();
      stan_gry = 2;
    }
  }

}



 

Link to post
Share on other sites

@enikan Przejrzałem kod i widzę, że zauważyłeś o co chodzi w tym algorytmie 🙂 Można jeszcze go zmniejszyć ale na początek to naprawdę dobrze. Ogólnie istotą programu jest pętla (najlepiej while), która służy do zbliżania się do wyniku, a sam algorytm można nazwać algorytmem bisekcji - tu lektura googla. Jest dobrze, tak trzymaj 💪

  • Pomogłeś! 1
Link to post
Share on other sites

@Wiktor-IT 

Przetwornik ADC jest "wbudowaną" funkcją mikrokontrolera (w przypadku tego kursu). Nie jest to żaden osobny układ...

Proponuje jeszcze raz na spokojnie przeczytać cały rozdział i wtedy wszystko się rozjaśni. 

Pozdrawiam 😉

  • Lubię! 2
Link to post
Share on other sites

Uh zadanie 4.5 zrobione, zeszło mi niedzielne popołudnie 😉 Zmodyfikowałem nieco moją wersje tego zadania gdyż nie do końca rozumiałem chyba jak ma wyglądać zapalnie czerwonej diody 😄 W związku z tym zrobiłem 3 czerwone diody które symbolizują ilość popełnionych błędów. Pomarańczowa dioda zapala się w momencie popełnienia błędu a następnie jedna z czerwonych. Przy kolejnym błędzie drugie, przy ostatnim trzecim błędzie ostatnia czerwona dioda. Wiem, że mój kod nie jest jakiś super i da się go napisać lepiej - aczkolwiek korzystałem tylko z funkcji/metod opisanych do tej pory w kursie 🙂

PS. Teraz 4.6 które będzie ciekawsze 😄 Super jest Wasz kurs ❤️

#include <Arduino.h>
#define red3 12
#define red2 11
#define red1 10
#define yellow 9
#define green 8
#define button 7

int potentiometer_value = 0;
int user_input = 0;
int attempts_counter = 3;
bool is_started = false;
bool ignore_incoming_data = true;

void setup()
{
    Serial.begin(9600);
    pinMode(red1, OUTPUT);
    pinMode(red2, OUTPUT);
    pinMode(red3, OUTPUT);
    pinMode(yellow, OUTPUT);
    pinMode(green, OUTPUT);
    pinMode(button, INPUT_PULLUP);

    digitalWrite(red1, LOW);
    digitalWrite(red2, LOW);
    digitalWrite(red3, LOW);
    digitalWrite(yellow, LOW);
    digitalWrite(green, LOW);
    Serial.println("Set potentiometer and press button to start");
}

void loop()
{
    potentiometer_value = analogRead(A5); // wartosc z potencjometru
    if (ignore_incoming_data) // ignoruj odbierane dane do momentu wciśniecia przycisku
    {
        while (Serial.read() > 0) {}
    }

    if (digitalRead(button) == LOW) // jesli przycisk jest wcisniety
    {
        Serial.println("Enter a number:");
        is_started = true;            // zacznij odbieranie danych dopiero gdy przycisk został naciśnięty
        ignore_incoming_data = false; // przestań ignorować odbierane dane
        delay(200);                   // opoźnienie aby nie wyswietlać info wiele razy
    }

    if (Serial.available() > 0 && is_started) // jesli odebrano dane
    {
        user_input = Serial.readStringUntil('\n').toInt(); // pobierz wprowadzony string i konwertuj do int

        Serial.print("Your number: ");
        Serial.println(user_input);
        int min = potentiometer_value - 50;
        int max = potentiometer_value + 50;

        // Wyswietl zakres by wygrać :D
        // Serial.print("Min: ");
        // Serial.print(min);
        // Serial.print(" Max: ");
        // Serial.println(max);

        if (user_input >= min && user_input <= max) // czy odebrana liczna jest w zakresie min max
        {
            digitalWrite(green, HIGH); // zapal zielona jesli poprawa liczba
            digitalWrite(red1, LOW);
            digitalWrite(red2, LOW);
            digitalWrite(red3, LOW);
            digitalWrite(yellow, LOW);
            Serial.print("You win! You hit in range: ");
            Serial.print(min);
            Serial.print(" - ");
            Serial.println(max);
            Serial.println("Press button to reset game.");
            while (digitalRead(button) == HIGH){} // czekaj na wcisniecie przycisku
            attempts_counter = 3;        // zresetuj licznik
            ignore_incoming_data = true; // ponownie ignoruj wprowadzone dane do momentu wciśniecia przycisku
            digitalWrite(red1, LOW);     // wylacz reszte diod jesli poprawna liczba
            digitalWrite(red2, LOW);
            digitalWrite(red3, LOW);
            digitalWrite(yellow, LOW);
            digitalWrite(green, LOW);
        }
        else
        {
            digitalWrite(yellow, HIGH); // mignij pomarańczową dioda gdy bład
            delay(500);
            digitalWrite(yellow, LOW);
            attempts_counter--; // zmniejsz ilość prob o jeden
            Serial.print("Wrong. Remaining attempts: ");
            Serial.println(attempts_counter);
            if (attempts_counter == 2)
            {
                digitalWrite(red1, HIGH); // zapal pierwsza diode gdy błąd
                Serial.println("Enter a number:");
            }
            else if (attempts_counter == 1)
            {
                digitalWrite(red2, HIGH); // zapal druga diode gdy błąd
                Serial.println("Enter a number:");
            }
            else
            {
                digitalWrite(red3, HIGH); // zapal trzecia diode gdy błąd
            }
        }
        delay(50); // opoźnienie aby spowolnić odczyt ADC
    }

    if (attempts_counter == 0) // gdy skończa sie dozwolone proby
    {
        Serial.println("Game over! Press button to start again.");

        while (digitalRead(button) == HIGH) {} // czekaj na wcisniecie przycisku
        is_started = false;          // zresetuj gre
        attempts_counter = 3;        // zresetuj licznik
        ignore_incoming_data = true; // ponownie ignoruj wprowadzone dane do momentu wciśniecia przycisku
        digitalWrite(red1, LOW);     // wylacz diody po wcisnieciu przycisku - reset gry
        digitalWrite(red2, LOW);
        digitalWrite(red3, LOW);
        digitalWrite(yellow, LOW);
        digitalWrite(green, LOW);
    }
}

image.thumb.png.2afb4023690048d1412817c1309c1fb2.pngimage.thumb.png.69d52d8e92dc08ea9f98eae61cb3cabd.png 

 

Edytowano przez omeniq
  • Lubię! 2
Link to post
Share on other sites

Dobra mam zadanie 4.6 😄 Myśle że działa nawet fajnie - podrzucam filmik oraz nieco skomentowany kod.

#include <Arduino.h>

#define red1 8
#define red2 9
#define yellow1 10
#define yellow2 11
#define green1 13
#define green2 12

int foto_down_map = 0;
int foto_up_map = 0;

void setup()
{
    Serial.begin(9600);
    pinMode(red1, OUTPUT);
    pinMode(red2, OUTPUT);
    pinMode(yellow1, OUTPUT);
    pinMode(yellow2, OUTPUT);
    pinMode(green1, OUTPUT);
    pinMode(green2, OUTPUT);
}

void loop()
{
    foto_down_map = map(analogRead(A5), 0, 1023, 0, 15); // przeskaluj zakres na 0-14 - dolny fotorezystor
    foto_up_map = map(analogRead(A4), 0, 1023, 0, 15); // jw - grny fotorezystor

    digitalWrite(yellow1, LOW); // wylącz wszyskie diody jeśli brak mocniejszego źrodla swiatla
    digitalWrite(yellow2, LOW);
    digitalWrite(red1, LOW);
    digitalWrite(red2, LOW);
    digitalWrite(green1, LOW);
    digitalWrite(green2, LOW);

    Serial.print("UP: ");
    Serial.println(foto_up_map);
    Serial.print("DOWN: ");
    Serial.println(foto_down_map);

    if (foto_down_map > foto_up_map) // jesli wartosc dolnego foto wieksza do gorengo to znak ze swiatla wiecej na dole
    { // dolny ma czerwone diody
        if ((foto_down_map - foto_up_map) == 1) // jesli roznica pomedzy dolny a gornym jest rowna jeden
        {
            digitalWrite(yellow1, HIGH); // zapal zolta diode ktora jest blizej skrajnej czerwonej
            digitalWrite(red2, HIGH); // zapal srodkowa czerwona dioda
            digitalWrite(red1, LOW); // wylacz skrajna czerwona diode
            digitalWrite(green1, LOW); // wylaczamy zielona
        }
        else if ((foto_down_map - foto_up_map) > 1) // jesli roznica pomiedzy dolnym a gornym jest wieksza od jeden
        { // to znak ze swiatlo jest najmocniejsze z tej strony
            digitalWrite(yellow1, LOW); // wylaczamy wiec zolta diode
            digitalWrite(red1, HIGH); // zapal skrajna czerwona
            digitalWrite(red2, LOW); // wylaczamy srodkowa czerwona
            digitalWrite(green1, LOW); // wylaczamy zielona
        } 
    }
    else if (foto_up_map > foto_down_map) // jesli wartosc gornego foto jest wieksza niz dolnego to znak ze swiatla wiecej u gory
    { // gorny ma zielone diody
        if ((foto_up_map - foto_down_map) == 1) // jesli roznica pomiedzy gornym a dolnym jest rowna jeden
        {
            digitalWrite(yellow2, HIGH); // zapal zolta diode ktora jest blizej skrajnej zielonej
            digitalWrite(red1, LOW); // wylacz czerwona diode
            digitalWrite(green1, LOW); // wylacz skrajna zielona diode
            digitalWrite(green2, HIGH); // zapal skrajna zielona diode
        }
        else if ((foto_up_map - foto_down_map) > 1) // jesli rozncia pomiedzy gornym a dolnym jest wieksza od jeden
        {
            digitalWrite(yellow2, LOW); // wylacz zolta diode
            digitalWrite(red1, LOW); // wylacz czerwona diode
            digitalWrite(green2, LOW); // wylacz srodkowa zielona diode
            digitalWrite(green1, HIGH); // zapal skrajna zielona diode
        }
    } else if (foto_down_map > 0 && (foto_down_map - foto_up_map) == 0) // jesli roznica pomiedzy gora a dolem jest zero to znak ze natezenie swiatła jest podobne
        { // wtedy zapal tylko dwie srodkowe zolte diody ALE tylko wtedy gdy pojawilo sie jakies zrodło swiatła wieksze niz zero - dzieki temu zolte diody nie swieca sie non stop
            digitalWrite(yellow1, HIGH);
            digitalWrite(yellow2, HIGH);
            digitalWrite(red1, LOW);
            digitalWrite(red2, LOW);
            digitalWrite(green1, LOW);
        }
    delay(50);
}

 

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.