Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Ś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 do komentarza
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 do komentarza
Share on other sites

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

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 do komentarza
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 do komentarza
Share on other sites

int dane = 0;

void setup() {
Serial.begin(9600);
pinMode(6, OUTPUT);
}

void loop() {
dane = analogRead(A5);

if(dane < 200){
  digitalWrite(6, HIGH);
  Serial.println(dane);
  while(dane < 200) {}
  
}else{
  digitalWrite(6, LOW);
}
}

Próbuję zrobić zadanie 4.4, żeby wiadomość jakie napięcie jest na A5 pokazała się tylko raz. Niestety ten kod nie działa i nie wiem dlaczego. Kiedy zgaszę światło rzeczywiście pokazuje mi się jakaś liczba poniżej 200 tylko raz i dioda się zapala, ale działa to wszystko tylko raz. Kiedy następnie zapalam światło, to dioda nadal świeci : - /  Ma ktoś może jakiś pomysł dlaczego to nie gra?

Link do komentarza
Share on other sites

Bo nie sprawdzasz pinu analogowego w petli while...gdy zaswiecisz swiatlo to wartosc wzrosnie, ale Ty caly czas znajdujesz sie w while bo sprawdzasz wartosc ktora zostala zapisana przed wejsciem w while...poprostu tworzysz petle nieskonczona...raz wpadniesz i juz nigdy nie wyjdziesz...

if(dane < 200){
  digitalWrite(6, HIGH);
  Serial.println(dane);
  while(analogRead(A5) < 200) {}

Tak to ma byc

Link do komentarza
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.