Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

@RakietowyKim super 🙂 Dla formalności, przy else if zamiast formatować program tak:

  if(value < 204){
    digitalWrite(red2, HIGH);
  }
  else if(value < 409){
    digitalWrite(red1, HIGH);
  }

Bezpieczniej robić tak:

  if (value < 204) {
    digitalWrite(red2, HIGH);
  } else if (value < 409){
    digitalWrite(red1, HIGH);
  }

Wtedy jest mniejsza szansa, że podczas edycji/kopiowania programów "wstrzelisz" cos przypadkiem między "}" a "else if". A takie cos może powodować dość nieprzyjemne do odszukiwania błędy.

  • Lubię! 2
Link do komentarza
Share on other sites

3 godziny temu, Treker napisał:

Wtedy jest mniejsza szansa, że podczas edycji/kopiowania programów "wstrzelisz" cos przypadkiem między "}" a "else if".

A jaki przykład takiego wstrzelenia możesz pokazać, który nie skończyłby się wyraźnym błędem kompilacji z numerem wiersza?

Edytowano przez trainee
Link do komentarza
Share on other sites

# define leftDiode 10
# define middleDiode 9
# define rightDiode 8

short int valueL = 0;
short int valueR = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(leftDiode, OUTPUT);
  pinMode(middleDiode, OUTPUT);
  pinMode(rightDiode, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  valueL = analogRead(A1);
  valueR = analogRead(A2);
  Serial.print("Left Value is: ");
  Serial.println(valueL);
  Serial.print("Right Value is: ");
  Serial.println(valueR);
  delay(1500);
  if(valueL-valueR > 20){
    digitalWrite(rightDiode, LOW);
    digitalWrite(middleDiode, LOW);
    digitalWrite(leftDiode, HIGH);
  }else if(valueL-valueR < -20){
    digitalWrite(rightDiode, HIGH);
    digitalWrite(middleDiode, LOW);
    digitalWrite(leftDiode, LOW);
  }else{
    digitalWrite(rightDiode, LOW);
    digitalWrite(middleDiode, HIGH);
    digitalWrite(leftDiode, LOW);
  }
}

Zrobiłem zadanie z diodami 4.6, wymagało by lepszej kalibracji wartości dla precyzji ale spełnia swoje zadanie w miarę. Sprawdzone latarką. 

Edytowano przez RakietowyKim
  • Lubię! 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

Witam,

mam dwa pytania:

Cytat

 napiecie = odczytanaWartosc * (5.0/1024.0); //Przeliczenie wartości na napięcie

Zwróć uwagę, że zmienna napięcie została zadeklarowana jako typ float, czyli taką, która pozwala na przechowywanie liczb zmiennoprzecinkowych. Liczby dzielone przez siebie w powyższym kodzie zostały zapisane z dopiskiem ".0", jest to informacja dla kompilatora, aby traktował je jako liczby zmiennoprzecinkowe. Inaczej wynik takiej operacji byłby całkowity!

Chciałem sprawdzić właśnie co się stanie jeżeli zapisze bez .0 (czyli 5/1024). Z kursu wynika, że wyświetlany wynik powinien być liczbą całkowitą (czyli np. zamiast 1,8 V będzie 2V). U mnie cały czas wyświetla się tylko 0.00 (pomimo zmieniania wartości potencjometru). Z czego może to wynikać?

drugie pytanie dotyczy tego eksperymentu:

Cytat

Zadanie domowe 4.2

Jeśli będziesz miał szczęście (dużo zakłóceń w otoczeniu), to możliwe będzie wykonanie bardzo widowiskowego eksperymentu. Wykorzystaj połączony wcześniej układ z 5 diodami. Odłącz przewód idący do potencjometru i pozostaw go w powietrzu.

Co się dzieje, gdy zbliżasz rękę do przewodu (nie dotykając końcówki)? U mnie, przy przewodzie wiszącym w powietrzu świeciły się 3 diody, jednak wystarczyło zbliżyć rękę na odległość 2cm od kabla i zapalały się wtedy wszystkie diody. Masz pomysł dlaczego tak się dzieje?

W moim przypadku po odłączeniu przewodu diody zaczęły migać w pewnej sekwencji a dokładniej najpierw migały dwie zewnętrzne potem dwie w środku i potem jeszcze dwie inne (i tak się to cały czas powtarzało). Miganie diod nie ulegało żadnej zmianie przy zbliżaniu palca do przewodu. Ciekawi mnie czemu diody migały w takiej sekwencji a nie świeciły się np. 3 a potem po zbliżeniu palca wszystkie tak jak w opisanym kursie?

(Odnośnie przykładu z kursu) Nasuwa się pytanie czemu potem świeciły wszystkie diody jak w kodzie są warunki, że może się świecić tylko jedna dioda? Nie wiem też czemu po zbliżeniu palca zapaliły się wszystkie diody. 

Link do komentarza
Share on other sites

24 minuty temu, Wojtek777 napisał:

Witam,

mam dwa pytania:

Chciałem sprawdzić właśnie co się stanie jeżeli zapisze bez .0 (czyli 5/1024). Z kursu wynika, że wyświetlany wynik powinien być liczbą całkowitą (czyli np. zamiast 1,8 V będzie 2V). U mnie cały czas wyświetla się tylko 0.00 (pomimo zmieniania wartości potencjometru). Z czego może to wynikać?

Np. ze złego podłączenia potencjometru...możliwe że do wyjścia potencjometru podpisałeś masę...

Link do komentarza
Share on other sites

16 godzin temu, Wojtek777 napisał:

Z kursu wynika, że wyświetlany wynik powinien być liczbą całkowitą (czyli np. zamiast 1,8 V będzie 2V). U mnie cały czas wyświetla się tylko 0.00 (pomimo zmieniania wartości potencjometru).

@Wojtek777 pokaż dla formalności cały program testowy 🙂

16 godzin temu, Wojtek777 napisał:

Miganie diod nie ulegało żadnej zmianie przy zbliżaniu palca do przewodu.

Czy na pewno przewód był podłączony do (odpowiedniego) wyjścia Arduino? Nie odłączyłeś go przypadkiem "po drugiej stronie"?

16 godzin temu, Wojtek777 napisał:

(Odnośnie przykładu z kursu) Nasuwa się pytanie czemu potem świeciły wszystkie diody jak w kodzie są warunki, że może się świecić tylko jedna dioda? Nie wiem też czemu po zbliżeniu palca zapaliły się wszystkie diody. 

W tamtym programie jest tylko minimalne opóźnienie. Pętla wykonywana jest bardzo szybko, więc w praktyce na pewno na raz świeciła tylko jedna dioda, jednak przełączanie działo się tak szybko, że ludzkie oko tego nie dostrzegało. jeśli zwiększysz opóźnienie np. do 200 ms to powinieneś widzieć, że jednocześnie świeci tylko jedna dioda.

Link do komentarza
Share on other sites

kod wygląda następująco

int odczytanaWartosc = 0;
float napiecie = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  odczytanaWartosc = analogRead(A5);
  napiecie = odczytanaWartosc * (5/1024);
  Serial.println(napiecie);
  delay(200);
}

Jeżeli wcześniej było 5.0/1024.0 wszystko było ok. Potem sprawdziłem 5.0/1024 i też było ok ale jak pisze już 5/1024 to wyskakują w terminalu same 0.00.

Przewód był  (i jest bo teraz jeszcze raz zmontowałem układ). Przewód odłączyłem wtedy przy potencjometrze. Teraz też sprawdziłem gdybym odłączył go przy pinie A5 i sytuacja taka sama czyli miganie diodami.

Teraz już rozumiem czemu wydawało mi się, że świeciło kilka diod na raz ale dalej nie rozumiem czemu po zbliżeniu palca miałaby się zwiększyć ilość świecących diod.

Link do komentarza
Share on other sites

20 godzin temu, Wojtek777 napisał:

Chciałem sprawdzić właśnie co się stanie jeżeli zapisze bez .0 (czyli 5/1024). Z kursu wynika, że wyświetlany wynik powinien być liczbą całkowitą (czyli np. zamiast 1,8 V będzie 2V). U mnie cały czas wyświetla się tylko 0.00 (pomimo zmieniania wartości potencjometru). Z czego może to wynikać?

Nie widzę odpowiedzi, więc odpowiem:

Tak będzie to liczba całkowita, ale nie tak jak uważasz. Komputer najpierw podzieli 5 przez 1024, a potem zaokrągli to do liczby całkowitej. Będzie to mniej więcej równoznaczne temu zapisowi:

(int) 5.0/1024; // lub
(int) 5.0/1024.0; 

Czyli 5/1024 to jakieś 0.004 po ucięciu miejsca po przecinku zostaje Ci 0. Stąd zwracanie samego zera. Komputer nie jest tak inteligentny jak Ty i zamienia na liczbę całkowitą to, co mu każesz zamienić na liczbę całkowitą (nie jest w stanie domyślić się, że chodzi Ci o wynik).

11 minut temu, Wojtek777 napisał:
 napiecie = odczytanaWartosc * (5/1024);

Problemem jest nawias, który każe najpierw policzyć wynik z dzielenia i zamienić go na liczbę całkowitą. Usunięcie powinno pomóc.

Czytaj: spróbuj tak:

napiecie = (odczytanaWartosc * 5) / 1024; // nawias jest zbędny, ale ułatwia zrozumienie co myśli komputer

Wtedy wynik powinien być prawidłowy.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Myślałem, że pyknę dzisiaj 3 ostatnie zadania i przejdę dalej.
O jakże się myliłem, o ile z dwoma fotorezystorami sobie poradziłem, to pozostałe dwa pochłonęły mnie na niemal cały dzień. 😄

4.4

int readValue = 0; //Zmienna przechowujaca odczyt ADC z A5 (dzielnik napiecia)
int prog = 0; //Zmienna przechowujaca odczyt odczyt ADC z A4 (potencjometr)
boolean info = true; //Decyzja czy wyslac info

void setup() {
  pinMode(8, OUTPUT); //Konfiguracja wyjscia pod LED
  Serial.begin(9600); //Ururchomienie transzmisji z UART
}

void loop() {
  
  readValue = analogRead(A5); //Odczyt wartosci z ADC - dzielnik
  prog = analogRead(A4); //Odczyt warosci z ADC - potencjometr

  if (readValue < prog) { //Czy jest ciemniej od ustawionego progu

    digitalWrite(8, HIGH); //Wlacz diode
    if (info) { //Jezeli trzeba wyslac komunikat
      float napiecie = readValue * (5.0 / 1023.0); //Obliczenie napieca
      Serial.print("Odczytano: "); // Komunikat
      Serial.print(napiecie);
      Serial.println(" V");
      info = false; //Kolejny komunikat jest niepotrezbny
    }
  } else {
    digitalWrite(8, LOW); //Wylaczenie diody
    info = true;  //Kolejny komunikat jest potrzebny
  }

  delay(50);
}

 

4.5

#define red 8
#define yellow1 9
#define yellow2 10
#define green 11
#define button 12

int pote = 0; //Wartosc 0-1023 odczytana z potencjometru
String liczba = ""; //Odpowiedz wprowadzona przez uart
int liczba_int = 0; //Zmienna przekonwertowana ze string na int


void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji UART
  pinMode(green, OUTPUT); //Konfiguracja pinow dla LED
  pinMode(yellow1, OUTPUT);
  pinMode(yellow2, OUTPUT);
  pinMode(red, OUTPUT);
  pinMode(button, INPUT_PULLUP); //Konfiguracja pinu pod guzik

}

void loop() { //Ustawienie pozycji poczatkowej
  digitalWrite(green, LOW);
  digitalWrite(yellow1, LOW);
  digitalWrite(yellow2, LOW);
  digitalWrite(red, LOW);

  Serial.println("Witaj w grze!");
  Serial.println("Ustaw potencjomentr i odgadnij jego wartość");
  Serial.println("Masz 3 próby");
  Serial.println(" ");
  Serial.println("Przekręć potencjometr i naciśnij przysick");
  pote = analogRead(A5); //Odczyt wartosci potencjometru

   while (digitalRead(button) == HIGH) {} //Kiedy wcisnieto przycisk
    delay(50);
    Serial.println("Podaj liczbę od 0 do 1023");
    Serial.println("Masz trzy próby");
    while(Serial.available() == 0) {} //Czekaj na nowe dane (przy > 0 leci automatycznie)
    liczba = Serial.readStringUntil('\n'); //Odczyt danych z portu
    liczba_int = liczba.toInt(); //Konwersja danych z portu do zmiennej liczbowej

    if(liczba_int - 50 <= pote && liczba_int + 50 >= pote) { //Warunek wykonywany jezeli liczba jest do +/-50 taka jak wartosc odczytana z potencjometru
      digitalWrite(green, HIGH); //Wlaczenie zielonej diody
      Serial.println("Wygrałeś!");
      Serial.print("Ustawiona wartość to: ");
      Serial.println(pote); //Wyswietlenie aktualnej wartosci potencjometru
      delay(5000);
    } else {
      digitalWrite(yellow1, HIGH); //Wlaczenie zoltej diody
      Serial.println("Niestety - zła liczba");
      Serial.println("Spróbuj jeszcze raz - zostały Ci dwie próby");
      while(Serial.available() == 0) {} //Czekaj na nowe dane
      liczba = Serial.readStringUntil('\n'); //Odczyt danych z portu
      liczba_int = liczba.toInt(); //Konwersja odebranych danych do zmiennej liczbowej
      if(liczba_int - 50 <= pote && liczba_int + 50 >= pote) { //Porownanie liczbe w kolejnej probie
        digitalWrite(yellow1, LOW); //Wylaczenie pierwszej zoltej diody
        digitalWrite(green, HIGH); //Wlaczenie zielonej diody
        Serial.println("Wygrałeś!");
        Serial.print("Ustawiona wartość to: ");
        Serial.println(pote); //Wyswietlenie aktualnej wartosci potencjometru
        delay(5000);
      } else {
        Serial.println("Niestety - zła liczba");
        Serial.println("Spróbuj jeszcze raz - została Ci ostatnia próba");
        digitalWrite(yellow1, HIGH); //Zapalenie obu zoltych diod
        digitalWrite(yellow2, HIGH); 
        while(Serial.available() == 0) {} //Czekaj na nowe dane
        liczba = Serial.readStringUntil('\n'); //Odczyt danych z portu
        liczba_int = liczba.toInt(); //Konwersja odebranych danych do zmiennej liczbowej
        if(liczba_int - 50 <= pote && liczba_int + 50 >= pote) { //Porownianie liczby w ostatniej probie
          digitalWrite(yellow1, LOW); //Wylaczenie obu zoltych diod
          digitalWrite(yellow2, LOW);
          digitalWrite(green, HIGH); //Wlaczenie zielonej diody
          Serial.println("Wygrałeś!");
          Serial.print("Ustawiona wartość to: ");
          Serial.println(pote); //Wyswietlenie aktualnej wartosci potencjometru
          delay(5000);
        } else {
          digitalWrite(yellow1, LOW); //Wylaczenie obu zoltych LEDow
          digitalWrite(yellow2, LOW);
          digitalWrite(red, HIGH); //Wlaczenie czerwonej diody
          Serial.println("Koniec Gry");
          Serial.println("Niestety - przegrałeś!");
          Serial.print("Ustawiona wartość to: ");
          Serial.println(pote); //Wyswietlenie aktualnej wartosci potencjometru
          delay(5000);
        }
      }
    }
   

}

 

4.6

#define leftLED 8 //Zdefioniowanie pinow
#define midLeft 9
#define midLED 10
#define midRight 11
#define rightLED 12

int readLeft = 0; //Zmienna do odczytu ADC z A5
int readRight = 0; //Zmienna do odczytu ADC z A4
int fotoSuma = 0; //Zmienna z sumy z odczytow A4+A5

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji UART
  pinMode(leftLED, OUTPUT); //Konfiguracja LED
  pinMode(midLeft, OUTPUT);
  pinMode(midLED, OUTPUT);
  pinMode(midRight, OUTPUT);
  pinMode(rightLED, OUTPUT);
}

void loop() {
  readLeft = analogRead(A5); //Odczyt ADC z pinu A5
  readRight = analogRead(A4); //Odczyt ADC z pinu A4
  readLeft = map(readLeft, 0, 1023, -2, 2); //Mapowanie-konwersja odczytow z lewej
  readRight = map(readRight, 0, 1023, 2, -2); //Mapowanie-konwersja odczytow z prawej
  fotoSuma = readLeft + readRight; 

  Serial.print("Lewy = "); //Wysłanie odczytow na monitor
  Serial.println(readLeft);
  Serial.print("Prawy = ");
  Serial.println(readRight);
  Serial.print("Suma = ");
  Serial.println(fotoSuma);

  if (fotoSuma == 2) {
    digitalWrite(leftLED, HIGH);
    digitalWrite(midLeft, LOW);
    digitalWrite(midLED, LOW);
    digitalWrite(midRight, LOW);
    digitalWrite(rightLED, LOW);
  } else if (fotoSuma == 1) {
    digitalWrite(leftLED, LOW);
    digitalWrite(midLeft, HIGH);
    digitalWrite(midLED, LOW);
    digitalWrite(midRight, LOW);
    digitalWrite(rightLED, LOW);
  } else if (fotoSuma == 0) {
    digitalWrite(leftLED, LOW);
    digitalWrite(midLeft, LOW);
    digitalWrite(midLED, HIGH);
    digitalWrite(midRight, LOW);
    digitalWrite(rightLED, LOW);
  } else if (fotoSuma == -1) {
    digitalWrite(leftLED, LOW);
    digitalWrite(midLeft, LOW);
    digitalWrite(midLED, LOW);
    digitalWrite(midRight, HIGH);
    digitalWrite(rightLED, LOW);
  } else if (fotoSuma == -2) {
    digitalWrite(leftLED, LOW);
    digitalWrite(midLeft, LOW);
    digitalWrite(midLED, LOW);
    digitalWrite(midRight, LOW);
    digitalWrite(rightLED, HIGH);
  } else {
    digitalWrite(leftLED, LOW);
    digitalWrite(midLeft, LOW);
    digitalWrite(midLED, LOW);
    digitalWrite(midRight, LOW);
    digitalWrite(rightLED, LOW);
  }

  delay(50);
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Czwarta lekcja pozornie prosta, swoimi zadaniami zatrzymała mnie na dobre kilkanaście godzin. Nie było łatwo, ale ostatecznie udało się! 👍

Gdyby ktoś potrzebował pomocy, poniżej podrzucam własne spostrzeżenia oraz działające kody programów do zadań domowych 😉

1️⃣ Zadanie domowe nr 4.4

int odczytanaWartosc = 0; 
int prog = 0;
 
void setup() {
  pinMode(8, OUTPUT);
  Serial.begin(9600);
}
 
void loop() {
  odczytanaWartosc = analogRead(A5);
  prog = analogRead(A4);
  
  if (odczytanaWartosc < prog) { 
     digitalWrite(8, HIGH);
     Serial.println(odczytanaWartosc); //Podanie wartości z ADC ("fotorezystor")
     while(analogRead(A5) < prog) {} //Pętla blokująca
     delay(50); //Niwelowanie zakłóceń
  } else {
     digitalWrite(8, LOW);   
  }
  
  delay(50);
}

2️⃣ Zadanie domowe nr 4.5

Najtrudniejsza praca domowa z całej lekcji 💪 Do rozwiązania tego zadania wykorzystałem zapis (".toInt") w celu zamiany ciągu znaków na wartość oraz operator ("&&"). Więcej na ten temat możecie znaleźć na oficjalnej stronie Arduino: (".toInt") [link], ("&&") [link]:

String liczbaPodana = "";

int potencjometr = 0;
int liczba = 0;
int proba = 1; //Rozpoczymany grę z liczbą prób równą 1

#define przycisk 13
#define zielona 12
#define zolta 11
#define czerwona_1 10
#define czerwona_2 9

void setup() {
  pinMode(przycisk, INPUT_PULLUP);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(czerwona_1, OUTPUT);
  pinMode(czerwona_2, OUTPUT);

  digitalWrite(zielona, LOW);
  digitalWrite(zolta, LOW);
  digitalWrite(czerwona_1, LOW);
  digitalWrite(czerwona_2, LOW);
  
  Serial.begin(9600);
  Serial.println("*** Mistrz Arduino ***");
  Serial.println();
  Serial.println("Zasady gry:");
  Serial.println("1. Przekrec potencjometrem");
  Serial.println("2. Nacisnij przycisk");
  Serial.println();
}

void loop() {
  
  while (digitalRead(przycisk) == HIGH) {} //Czekaj do momentu wciśnięcia przycisku
  delay(50);

  potencjometr = analogRead(A5);
  Serial.println("Podaj liczbe od 0 do 1023");
  Serial.println();

  while (Serial.available() == 0) {} //Czekaj do momentu podania liczby
  delay(50);
  
  if (Serial.available() > 0) {
    liczbaPodana = Serial.readStringUntil('\n');
    liczba = liczbaPodana.toInt(); //Zmiana znaków na wartość (int)
  }

  if ((potencjometr - 50 <= liczba) && (potencjometr + 50 >= liczba)) { //Warunek wygranej
    digitalWrite(zielona, HIGH);
    digitalWrite(zolta, LOW);
    digitalWrite(czerwona_1, LOW);
    digitalWrite(czerwona_2, LOW);
    
    Serial.println("Gratulacje! Wygrana!");
    Serial.println("Dokladna wartosc potencjometru to:");
    Serial.println(potencjometr);
    
  } else if (proba == 3) {
    digitalWrite(zielona, LOW);
    digitalWrite(zolta, HIGH);
    digitalWrite(czerwona_1, HIGH);
    digitalWrite(czerwona_2, HIGH);
    
    Serial.println("A to pech! Koniec gry!");
    Serial.println("Dokladna wartosc potencjometru to:");
    Serial.println(potencjometr);
    
  } else if (proba == 2) {
    digitalWrite(zielona, LOW);
    digitalWrite(zolta, HIGH);
    digitalWrite(czerwona_1, HIGH);
    digitalWrite(czerwona_2, LOW);

    proba = proba + 1;

    Serial.println("Pudlo! Ostatnia szansa!");
    Serial.println("Nacisnij przycisk");
    Serial.println();

  } else {
    digitalWrite(zielona, LOW);
    digitalWrite(zolta, HIGH);
    digitalWrite(czerwona_1, LOW);
    digitalWrite(czerwona_2, LOW);

    proba = proba + 1;
    
    Serial.println("Pudlo! Sprobuj jesze raz!");
    Serial.println("Nacisnij przycisk");
    Serial.println();
    
  }
}

3️⃣ Zadanie domowe 4.6

Nieco prostsze od poprzedniego, ale mimo wszystko zachowujące "wysoki" poziom 😀

int odczytanaWartosc_L = 0; 
int odczytanaWartosc_P = 0;

int wartosc_L = 0;
int wartosc_P = 0;

int wynik = 0;

#define dioda_L2 12 //Diody przypisane do lewgo fotorezystora
#define dioda_L1 11
#define dioda_S 10 //Dioda środkowa
#define dioda_P1 9 //Diody przypisane do prawego fotorezystora
#define dioda_P2 8

void setup() {
  Serial.begin(9600);
  
  pinMode(dioda_L2, OUTPUT);
  pinMode(dioda_L1, OUTPUT);
  pinMode(dioda_S, OUTPUT);
  pinMode(dioda_P1, OUTPUT);
  pinMode(dioda_P2, OUTPUT);

  digitalWrite(dioda_L2, LOW);
  digitalWrite(dioda_L1, LOW);
  digitalWrite(dioda_S, LOW);
  digitalWrite(dioda_P1, LOW);
  digitalWrite(dioda_P2, LOW);
}

void loop() {
  
  odczytanaWartosc_L = analogRead(A4); //Wartość lewego fotorezystora
  odczytanaWartosc_P = analogRead(A5); //Wartość prawego fotorezystora

  wartosc_L = map(odczytanaWartosc_L, 0, 1023, -2, 2);
  wartosc_P = map(odczytanaWartosc_P, 0, 1023, 2, -2);

  wynik = wartosc_L + wartosc_P;

  Serial.println("Lewy fotorezystor:");
  Serial.println(odczytanaWartosc_L);
  Serial.println("Prawy fotorezystor:");
  Serial.println(odczytanaWartosc_P);
  Serial.println();

  if (wynik >= 2) {               //Wynik większy bądź równy 2
    digitalWrite(dioda_L2, HIGH);
    digitalWrite(dioda_L1, LOW);
    digitalWrite(dioda_S, LOW);
    digitalWrite(dioda_P1, LOW);
    digitalWrite(dioda_P2, LOW);
  } else if (wynik == 1) {
    digitalWrite(dioda_L2, LOW);
    digitalWrite(dioda_L1, HIGH);
    digitalWrite(dioda_S, LOW);
    digitalWrite(dioda_P1, LOW);
    digitalWrite(dioda_P2, LOW);
  } else if (wynik == 0) {
    digitalWrite(dioda_L2, LOW);
    digitalWrite(dioda_L1, LOW);
    digitalWrite(dioda_S, HIGH);
    digitalWrite(dioda_P1, LOW);
    digitalWrite(dioda_P2, LOW);
  } else if (wynik == -1) {
    digitalWrite(dioda_L2, LOW);
    digitalWrite(dioda_L1, LOW);
    digitalWrite(dioda_S, LOW);
    digitalWrite(dioda_P1, HIGH);
    digitalWrite(dioda_P2, LOW);
  } else {                         //Wynik mniejszy niż -1
    digitalWrite(dioda_L2, LOW);
    digitalWrite(dioda_L1, LOW);
    digitalWrite(dioda_S, LOW);
    digitalWrite(dioda_P1, LOW);
    digitalWrite(dioda_P2, HIGH);
  }
  delay(50);
}
  • Lubię! 1
Link do komentarza
Share on other sites

Może i ja pochwalę się zrobionymi zdaniami, i chętnie wysłucham wskazówek 🙂

Zadanie 4.5 Z tym się dwa dni męczyłem, mam nadzieje że wszystko jest okej. Tak mi się spodobała ta gierka że przeniosę ja po świętach do realnego świata, już z obsługą OLEDa i drukowaną obudową 🙂 pochwalę się na forum rezultatem.

#define przycisk 7  // definicja nazw pinow
#define zolty 8
#define zielony 9
#define czerwony 10
int komputer = 0;       // wartosc potencjometru
String odpgracza = "";  // odpowiec z uart
int liczbagracza = 0;   // przekonwertowana odpowiedz
int zycia = 0;

void setup() {
  Serial.begin(9600);        // wlaczenie komunikacji
  pinMode(7, INPUT_PULLUP);  // konfiguracja pin switch
  pinMode(8, OUTPUT);        // 3x konfig led pin
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  delay(1100);
  Serial.println("Witaj w grze!");
  delay(500);
  Serial.println("Masz 3 proby na zgadnięcie liczby");
  delay(500);
  Serial.println("Zakres od 0 do 1023, mozesz pomylic sie o 50");
  delay(500);
  Serial.print(".");
  delay(700);
  Serial.print(".");
  delay(700);
  Serial.println(".");
  delay(700);
  Serial.println("Przekrec potencjometr i i kliknij przycisk");
  while (digitalRead(przycisk) == HIGH) {}             // pusta petla, czekaj az przycisk zostanie wcisniety
  komputer = analogRead(A5);                           // zapisz przekrecony potencjometr do zmiennej jako liczba pc
  Serial.println("Podaj liczbę z zakresu 0 do 1023");  // polecenie kompa
}

void loop() {


  while (Serial.available() == 0) {  // czekaj az zostana odebrane dane
  }
  if (Serial.available() > 0) {                // jesli dane zostaly odebrane
    odpgracza = Serial.readStringUntil('\n');  // zapisz dane do konca linii,  do zmiennej
    liczbagracza = odpgracza.toInt();          // zmien zmienna string na int
  }
  if (liczbagracza + 50 >= komputer && liczbagracza - 50 <= komputer) {  // warunke wygranej
    digitalWrite(zielony, HIGH);
    Serial.println("Brawo zgadles");
    delay(1000);
    Serial.print("Twoja liczba to: ");
    Serial.println(liczbagracza);
    delay(500);
    Serial.print("Dokladna liczba pc to: " + komputer);
    Serial.println(komputer);
    delay(2000);
    Serial.println("Jeśli chcesz zagrać ponownie, wcisnij przycisk reset");



  } else if (zycia == 0) {  // warunek pudla
    digitalWrite(zolty, HIGH);
    Serial.println("Niestety, nie trafiles. Sprobuj jeszcze raz");
    delay(2000);
    digitalWrite(zolty, LOW);
    zycia++;
    Serial.println("Podaj liczbę z zakresu 0 do 1023");  // polecenie kompa
  } else if (zycia == 1) {                               // warunek drugiego pudla
    digitalWrite(zolty, HIGH);
    Serial.println("Niestety, nie trafiles. Sprobuj jeszcze raz");
    delay(2000);
    digitalWrite(zolty, LOW);
    zycia++;
    Serial.println("Podaj liczbę z zakresu 0 do 1023");  // polecenie kompa
  } else if (zycia == 2) {                               // warunek 3 pudla
    digitalWrite(zolty, HIGH);
    Serial.println("Niestety, nie trafiles. Sprobuj jeszcze raz");
    delay(2000);
    digitalWrite(zolty, LOW);
    zycia++;
    Serial.println("Podaj liczbę z zakresu 0 do 1023");  // polecenie kompa
  } else {                                               // warunek 4 pudla, czyli to co sie dzieje jezeli zaden z warunkow nie zostanie spelniony
    digitalWrite(czerwony, HIGH);
    Serial.println("Niestety, to juz koniec");
    delay(2000);
    Serial.println("Jezeli chcesz zagrac ponownie kliknij reset");  // polecenie kompa
  }
}

Zadanie 4.6 Tutaj było stosunkowo łatwo, jedyny czasochłonny moment to ustalenie zakresów świecenia lewej i prawej strony. Ale teraz tak o tym myślę i wydaje mi się że łatwiej było by zrobić fotoR1 > fotoR2, zamiast męczyć się z dopasowaniem wartości.

#define zolty1 12  // definicja pinow
#define zolty2 11
#define zielony 10
#define czerwony1 9
#define czerwony2 8

int fotoR1 = 0;  // fotorezystorow
int fotoR2 = 0;


void setup() {
  pinMode(zolty1, OUTPUT);  // konfiguracja pinow
  pinMode(zolty2, OUTPUT);
  pinMode(zielony, OUTPUT);
  pinMode(czerwony1, OUTPUT);
  pinMode(czerwony2, OUTPUT);

  digitalWrite(zolty1, LOW);  // wylaczenie led
  digitalWrite(zolty2, LOW);
  digitalWrite(zielony, LOW);
  digitalWrite(czerwony1, LOW);
  digitalWrite(czerwony2, LOW);
}

void loop() {
  fotoR1 = analogRead(A0);  // przypisanie wartosci adc do zmiennych
  fotoR2 = analogRead(A1);

  if (fotoR1 > 100) {  // warunek 1 lewa stona

    digitalWrite(zolty1, HIGH);
    digitalWrite(zolty2, HIGH);
    digitalWrite(zielony, LOW);
    digitalWrite(czerwony1, LOW);
    digitalWrite(czerwony2, LOW);


  } else if (fotoR2 > 90) {  // warunek 2 prawa strona

    digitalWrite(zolty1, LOW);
    digitalWrite(zolty2, LOW);
    digitalWrite(zielony, LOW);
    digitalWrite(czerwony1, HIGH);
    digitalWrite(czerwony2, HIGH);


  }

  else if (fotoR1 > 40 && fotoR2 > 40) {  // warunek 3 srodek

    digitalWrite(zolty1, LOW);
    digitalWrite(zolty2, LOW);
    digitalWrite(zielony, HIGH);
    digitalWrite(czerwony1, LOW);
    digitalWrite(czerwony2, LOW);
  } else {  // bez tego ciagle swiecila zielona, bo nigdzie nie było komendy wyłącz tą diode
    digitalWrite(zolty1, LOW);
    digitalWrite(zolty2, LOW);
    digitalWrite(zielony, LOW);
    digitalWrite(czerwony1, LOW);
    digitalWrite(czerwony2, LOW);
  }
}

 

Edytowano przez Abraxos
  • Lubię! 1
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.