Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

(edytowany)

Witam, chciałbym się też pochwalić zadaniem 4.5 zadziałało, ale musiałem trochę przy tym poświęcić czasu i trochę się wspomóc forum 😉

#define zolta 8  // przypisanie nazw do pinów
#define zielona 9
#define czerwona 10
#define przycisk 3
#define pin_odczyt A4

int odczyt = 0; // zmienna potrzebna do odczytu z potencjometru
String podana_liczba = ""; // zmienna typu string podawana na terminalu
int podana_liczba_int = 0; // zmienna potrzebna do zmiany liczby ze stringa na int
int proby = 2; // ilosc prob 
boolean jeszcze_raz = true; // zmienna potrzebna do zagrania jeszcze raz w gre

void setup() {
 pinMode (przycisk, INPUT_PULLUP); // ustawienia początkowe ledów 
 pinMode (zolta, OUTPUT);
 pinMode (zielona,OUTPUT);
 pinMode ( czerwona, OUTPUT);
 Serial.begin(9600);
}
void loop() {
  if (jeszcze_raz == true) {    // jesli jeszcze raz jest w stanie wysokim to wykonaj:
      proby = 2;
      digitalWrite (zolta, LOW); 
      digitalWrite (zielona,LOW);
      digitalWrite (czerwona, LOW);

      while(!Serial) delay(10); // czekam na otwarcie okna dialogowego
      Serial.println ( "Przekrec potencjometr i nacisnij przycisk");

      while(digitalRead(przycisk) == HIGH) delay(20); // czekam na wcisniecie przycisku 
      odczyt = analogRead(pin_odczyt); // odczyt wartosci z potencjometru
      Serial.println ("podaj liczbe \n powinna byc w zakresie od 0 - 1023"); 
      Serial.println ( " Wygrasz jeżeli pomylisz się nie więcej niż o 50");
      Serial.println ( "Powodzenia"); 
  }

  while (Serial.available() == 0); // czekamy na podanie liczby
  podana_liczba = Serial.readStringUntil('\n');
  podana_liczba_int = podana_liczba.toInt(); // przeksztalcenie liczby typu string na int

  if ( odczyt - podana_liczba_int <=50 && odczyt-podana_liczba_int >= -50) { // jesli liczba mieści sie w zakresie to wygrałeś
    Serial.println (" Wygrałes, ustawiona liczba to: " );
    Serial.println (odczyt);
    digitalWrite( zielona, HIGH);
    digitalWrite( zolta, LOW);
    Serial.println( "Jesli chcesz grac jeszcze raz nacisnij przycisk");
    while(digitalRead(przycisk) == HIGH) delay(20);
    delay(500); // opóźnienie dla przycisku żeby nie przeskoczył do kolejnej linijki kodu zbyt szybko
    jeszcze_raz = true; // zaczynamy od nowa

  } else {
     if (proby > 0){
        jeszcze_raz = false; // nie zaczynamy od nowa
        digitalWrite ( zolta, HIGH);
        digitalWrite ( czerwona, LOW);
        //proby = proby -1;
        Serial.println (" niestety liczba jest z poza zakresu zostało Ci: ");
        Serial.println (proby);
        Serial.println ( "prob, podaj liczbe");
        proby = proby -1; // przypisanie nowej wartosci dla proby 
     }  else { // bez prób
        digitalWrite(czerwona, HIGH); 
        digitalWrite(zolta, LOW);
        Serial.println ( " przegrales, ustawiona liczba to:");
        Serial.println (odczyt);
        Serial.println ("jesli chcesz zagrac jeszcze raz, nacisnij przycisk");
        while(digitalRead(przycisk) == HIGH) delay(20);
        jeszcze_raz = true;
        
     }
    
     delay (500); // opóźnienie do wciskania przycisku gdy wartosc byla mniejsza przechodzil odrazu za daleko w programie
  }
  

}

 

Edytowano przez kristof900
źle wstawiony kod

Udostępnij ten post


Link to post
Share on other sites

@Treker rozumiem. Chciałbym jednak wiedzieć jaka jest różnica w stosowaniu i w jakim przypadku by to nie zadziałało  😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
6 godzin temu, spider_pajak napisał:

jaka jest różnica w stosowaniu i w jakim przypadku by to nie zadziałało

To są dwie zupełnie różne rzeczy i trudno mówić o różnicach - to tak jakbyś zapytał jaka jest różnica między mlekiem a olejem napędowym i kiedy z oleju nie będzie można zrobić twarożku.

Inaczej: 2 * 2 to 4, prawda? 2 + 2 to też 4, prawda? Czy więc pytanie, w jakim przypadku nie zadziała dodawanie zamiast mnożenia ma jakikolwiek sens?

A tak w ogóle to użycie & zamiast && (o ile pozwoli na to kompilator) zadziała, jeśli co najmniej jedna ze stron jest zerem. W pozostałych przypadkach zadziała albo nie zadziała.

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites

@ethanak skoro są to dwie zupełnie różne rzeczy to bym chciał wiedzieć jaka jest różnica i dlaczego nie powinienem tego stosować, a nie na zasadzie "nie bo nie".

 

12 godzin temu, ethanak napisał:

Inaczej: 2 * 2 to 4, prawda? 2 + 2 to też 4, prawda? Czy więc pytanie, w jakim przypadku nie zadziała dodawanie zamiast mnożenia ma jakikolwiek sens?

Ma sens, ponieważ tu jest jasne że w innym przypadku, np. 2*3 jest różne od 2+3. Jeśli & i && się czymś różni to bym chciał wiedzieć czym i kiedy które stosować 😉 Jeśli trzeba stosować && to ok, ale czy & też się stosuje w takim programowaniu? Jeśli tak to proszę o przykład 😉

Udostępnij ten post


Link to post
Share on other sites
8 godzin temu, spider_pajak napisał:

to dwie zupełnie różne rzeczy to bym chciał wiedzieć jaka jest różnica i dlaczego nie powinienem tego stosować, a nie na zasadzie "nie bo nie".

@spider_pajak to dość skomplikowane do wytłumaczenia na tym etapie nauki, bo to są naprawdę zupełnie różne rzeczy, które mają tylko "przypadkowo" zbieżny zapis. A co najgorsze operacje na bitach to temat, który jest dla wielu początkujących chyba najtrudniejszy do zrozumienia. W praktyce ten operator "&" mógłby mieć zupełnie inny zapis typu "$^%^%" i wtedy raczej nie miałbyś żadnej wątpliwości, że to nie jest to samo co "&&" 😉

Zapis "&&" jest operatorem, który stosuje się przy warunkach i za jego pomocą możesz sprawdzić czy warunek po prawej i po lewej jest jednocześnie spełniony. Pojedynczy "&" to operator matematyczny (taki jaki plus, minus czy znak mnożenia). W tym przypadku wykonujesz jednak sumę logiczną na bitach liczb. Nie sprawdzasz więc czy warunek po prawej i lewej jest spełniony tylko obliczasz nową liczbę na zasadzie "warunek A" & "warunek B". Przykład działania tego operatora (na liczbach binarnych): 1010 & 1100 = 1000. Czyli, w zapisie dziesiętnym, w wyniku działania 10 & 12 otrzymujemy 8. Operatory bitowe znajdziesz nawet w kalkulatorze w Windowsie:

5b593-2020-02-03_06-34-05-7875.png

Reasumując, "&&" to operator logiczny do warunków, a "&" to operator bitowy do wykonywania koniunkcji na bitach dwóch (lub więcej liczb). To co mogę polecić do poczytania to (szczególnie pierwszy link):

Naprawdę na ten moment najlepiej byłoby uwierzyć, że w warunkach trzeba używać "&&" i przejść dalej, bo nawet w ramach odpowiedzi nie możemy pokazać jakiegoś bardziej rozbudowanego przykładu, bo nie znasz jeszcze wielu innych innych aspektów programowania. Do tego, "co gorsze" później okaże się, że pojedynczy & ma inne, jeszcze bardziej zawiłe zastosowanie. To trochę tak jak z rozwiązywaniem równań kwadratowych. W szkole uczymy się, że jak delta wychodzi ujemna to nie ma rozwiązania równania, a później na studiach dowiadujemy się, że to nie jest prawdą, ale nikt tego od razu nie wprowadza, aby nie było zbyt trudno 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, Treker napisał:

@spider_pajak to dość skomplikowane do wytłumaczenia na tym etapie nauki, bo to są naprawdę zupełnie różne rzeczy, które mają tylko "przypadkowo" zbieżny zapis. A co najgorsze operacje na bitach to temat, który jest dla wielu początkujących chyba najtrudniejszy do zrozumienia. W praktyce ten operator "&" mógłby mieć zupełnie inny zapis typu "$^%^%" i wtedy raczej nie miałbyś żadnej wątpliwości, że to nie jest to samo co "&&" 😉

Naprawdę na ten moment najlepiej byłoby uwierzyć, że w warunkach trzeba używać "&&" i przejść dalej, bo nawet w ramach odpowiedzi nie możemy pokazać jakiegoś bardziej rozbudowanego przykładu, bo nie znasz jeszcze wielu innych innych aspektów programowania. 

 

Skąd założenie, że nie znam operacji bitowych i dopiero zaczynam przygodę z programowaniem? 😉 Tak się składa, że na studiach miałem programowanie i dużo rzeczy co jest z tym związane, znam podstawy, jednak nie Arduino. Obecnie zajmuje się też programowaniem sterowników PLC gdzie operacje na bitach to podstawa 😉 

1 godzinę temu, Treker napisał:

Zapis "&&" jest operatorem, który stosuje się przy warunkach i za jego pomocą możesz sprawdzić czy warunek po prawej i po lewej jest jednocześnie spełniony. Pojedynczy "&" to operator matematyczny (taki jaki plus, minus czy znak mnożenia). W tym przypadku wykonujesz jednak sumę logiczną na bitach liczb. Nie sprawdzasz więc czy warunek po prawej i lewej jest spełniony tylko obliczasz nową liczbę na zasadzie "warunek A" & "warunek B". Przykład działania tego operatora (na liczbach binarnych): 1010 & 1100 = 1000. Czyli, w zapisie dziesiętnym, w wyniku działania 10 & 12 otrzymujemy 8.

Myślę, że to dla mnie dobre i wystarczające wytłumaczenie. Dziwne tylko, że kompilator pozwala na zapis & w przypadku gdy nie operujemy na bitach, tylko np na matematycznych porównaniach.

Udostępnij ten post


Link to post
Share on other sites
17 minut temu, spider_pajak napisał:

Dziwne tylko, że kompilator pozwala na zapis & w przypadku gdy nie operujemy na bitach, tylko np na matematycznych porównaniach.

Kompilator pozwala na takie zagranie, bo myśli, że chcesz sprawdzić czy wynik operacji A & B jest prawdziwy, a za prawdę uznaje wszystko co jest równe lub większe od 1. Mógłbyś też np. specjalnie użyć warunku typu "if (losowa & 0b00000001)", który sprawdzałby czy wylosowana wartość jest nieparzysta, bo warunek byłby prawdziwy, jeśli "losowa" byłaby liczbą, która ma najmniej znaczący bit równy 1. Nie ma to jednak żadnego związku z operatorem && 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Bo dla kompilatora wszystko co jest liczbą całkowitą lub na taką da się bezpośrednio przekształcić jest po prostu paczką bitów. Co ciekawsze: odróżnienie "prawda" i "fałsz" polega na tym, że prawdą jest wszystko co nie jest zerem. Dlatego wyrażenie '0b10 && 0b01' będzie prawdą (bo po obu stronach mamy prawdę czyli liczby różne od zera) a '0b10 & 0b01' da w wyniku 0 (co doskonale wiesz, bo jak sam stwierdziłeś znasz podstawy operacji na bitach).

Poza tym naprawdę warto zajrzeć sobie choćby z ciekawości do wykazu operatorów w C++ (nie, nie ma takiego języka jak Arduino). I nie uwierzę, że ktoś kto na studiach miał choćby podstawy programowania w dowolnym języku (C/C++, PHP, Python, Java, JavaScript) nie odróżniał operatorów bitowych od logicznych. [Ciach, zdanie usunięte na podstawie PPF].

 

Edytowano przez Treker
PPF

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Poprawiona wersja 4.4. Musiałem podejrzeć na forum inne rozwiązania, bo miałem problem z ciągłym wyświetlaniem wartości odczytanych, kiedy dioda świeciła. Myślałem że i tutaj zadziała "pusta pętla" do oczekiwania na włączenie diody... 

int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC
int prog = 0; //Próg włączenia światła - ustawiany potencjometrem
float napiecie = 0;// Warotsc przeliczona na napiecie

void setup() {
  Serial.begin(9600);
  pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED
}

void loop() {
  odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC
  prog = analogRead(A4);//Odczytanie wartości z ADC
  if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu?
    digitalWrite(8, HIGH);//Włączenie diody
    napiecie = analogRead(A5);//Odczytanie wartosci
    napiecie = napiecie * (5.0 / 1024.0); //Przeliczenie wartości na napięcie
    Serial.println(napiecie);//Wysyłamy zmierzone napięcie
    while (odczytanaWartosc < prog) {//Zatrzymujemy sie w petli aby wysłac zmierzone napiecie tylko raz
      odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC
      prog = analogRead(A4);//Odczytanie wartości z ADC
      delay(50);//Opóźnienie
    }
  }
  else {
    digitalWrite(8, LOW);//Wyłączenie diody
  }

  delay(50);//Opóźnienie
}

 

Edytowano przez Vova
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
#define przycisk 7
#define zielona 8
#define pomaranczowa 9
#define czerwona 10

int pozycja = 0;//Pozycja potencjometru odczytana z ADC
int gra = 3;// Ilosc mozliwosci
String liczba = ""; // Drukuj tekst w ""
int liczba_int = 0; // Konwersacja liczby
void setup() {
  Serial.begin(9600);//Nawiazanie komunikacji
  pinMode(7, INPUT_PULLUP); //Konfiguracja wyjsc
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(A5, INPUT);
}

void loop() {
  if (digitalRead(przycisk) == LOW) { //Gdy przycisk wcisniety
    pozycja = analogRead(A5); //Sprawdzamy pozycje potencjometra
    Serial.println("PODAJ LICZBE");//Drukuj tekst
    digitalWrite(zielona, LOW); //Diody nie swieca
    digitalWrite(pomaranczowa, LOW);
    digitalWrite(czerwona, LOW);
    delay(200);//Opoznienie
    Serial.println(pozycja);//Drukuj pozycjre potencjometra
  }
  if (Serial.available() > 0) { //Gdy wpisano liczbe
    liczba = Serial.readStringUntil('\n');
    liczba_int = liczba.toInt();//Konwersacja tekstu
    pozycja = analogRead(A5); //Sprawdzamy pozycje potencjometra
    if (liczba_int - pozycja <= 50 && liczba_int - pozycja >= -50) { //Gdy odczytane wartosci misccza sie w zakresie
      digitalWrite(zielona, HIGH); //Wlaczamy diode zelona
      delay(2000);//Opoznienie
      digitalWrite(zielona, LOW);
      gra = gra - 1; //O jedna mozliwosc mniej
      Serial.println("pozstalo"   +   String (gra)  +  " prob ");//Drukuj tekst
      
    }else{
      digitalWrite(czerwona, HIGH); //Wlacza sie dioda czerwona
      gra = gra - 1; //O jedna mozliwosc mniej
      delay(2000);//Opoznienie
      digitalWrite(czerwona, LOW); //Wylacza sie dioda czerwona
      Serial.println("pozstalo"   +   String (gra)  +  " prob ");//Drukuj tekst
 
    }else if (gra = 1) {//Gdy zostala 1 mozliwosc
      digitalWrite(pomaranczowa, HIGH);//Wlacz dide pomaranczowa
      Serial.println("pozstalo"   +   String (gra)  +  " prob ");//Drukuj tekst
      delay(1000);//Opoznienie
      digitalWrite(pomaranczowa, LOW);//Wylacz diode pomaranczowa
      
    }else if (gra = 0) {//Gdy wyczerpano wszystkie mozliwosci
      digitalWrite(pomaranczowa, HIGH);//Wlacz diode pomaranczowa i czerwona
      digitalWrite(czerwona, HIGH);
      Serial.println("Koniec gry, wcisnij przycisk");//Drukuj tekst
      
      while (digitalRead(przycisk) == HIGH) {//czekaj na wcisniecie przycisku
        delay(25);
      }
    }
  }
}

Witam. Pomóżcie znaleźć problem. Nie kompiluje mi się powyższy kod . Podświetlony jest pierwszy     else if     i wyskakuje błąd       exit status 1        expected '}' before 'else'. 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Sprawdź else przed tym else ifem, a właściwie całą konstrukcję tego ifa i pewnie się zorientujesz o co chodzi 😉 czyt. brakuje pewnie jakiegoś znaczka, ale sprawdź, czy konstrukcja jest poprawna

 

+ jak już dajesz pustą nieskończoną pętle while to delay tam jest zbędny

Edytowano przez BananWszyscy

Udostępnij ten post


Link to post
Share on other sites
6 godzin temu, Vova napisał:

Nie kompiluje mi się powyższy kod .

Nic dziwnego. Co ma znaczyć taka konstrukcja:
 

if (cośtam) {
	coś rób();
}
else {
	rób coś innego();
}
else {
	rób jeszcze cos innego();
}

Albo faktycznie jakiegoś nawiasu zapomniałeś (to już Ty musisz wiedzieć gdzie), albo uważasz ją za poprawną. Jeśli to drugie, to wyjaśnij jak to ma działać.

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

4.5

Co myślicie o tym? + dodałem przycisk reset, żeby można było grać wiele razy

#define czerwona 4
#define zolta 5
#define zielona 6
#define przycisk 7
#define reset 8

int i=1;
int odczytana_wartosc = 0;
String dane_uzytkownika = "";
int wartosc_uzytkownika = 0; //wartosc wpisywana przez uzytkownika

void setup() {
  Serial.begin(9600);
  pinMode(czerwona, OUTPUT); //Konfiguracja wyjść pod diodę LED
  pinMode(zolta, OUTPUT); //Konfiguracja wyjść pod diodę LED
  pinMode(zielona, OUTPUT); //Konfiguracja wyjść pod diodę LED
  pinMode(przycisk, INPUT_PULLUP); //Konfiguracja przycisku
  pinMode(reset, INPUT_PULLUP); //Konfiguracja przycisku reset
  digitalWrite(czerwona,LOW);
  digitalWrite(zolta,LOW);
  digitalWrite(zielona,LOW);
}
 
void loop() {
while(digitalRead(przycisk)==HIGH) {delay(25);}
while(i<=3)
{
Serial.println("Podaj liczbę: ");
while(dane_uzytkownika==""){dane_uzytkownika=Serial.readStringUntil('\n');}
wartosc_uzytkownika=dane_uzytkownika.toInt();
Serial.println(wartosc_uzytkownika);
odczytana_wartosc=analogRead(A4);
if(i==1 || i==2)
{
   if((wartosc_uzytkownika > (odczytana_wartosc -50)) && (wartosc_uzytkownika <(odczytana_wartosc+50)))
   {
    digitalWrite(zielona,HIGH);
    delay(4000);
    Serial.println("Udało się! Wygrałeś!");
    break;
   }
   else
   {
    digitalWrite(zolta,HIGH);
    delay(4000);
   }
}
else
{
  if((wartosc_uzytkownika > (odczytana_wartosc -50)) && (wartosc_uzytkownika <(odczytana_wartosc+50)))
  {
    digitalWrite(zielona,HIGH);
    delay(4000);
    Serial.println("Udało się! Wygrałeś!");
    break;
  }
  else
  {
    digitalWrite(czerwona,HIGH);
    delay(4000);
  }
}
digitalWrite(zolta,LOW);
dane_uzytkownika="";
i++;
}
//Serial.println(analogRead(A4)); 

while(digitalRead(reset)==HIGH) {delay(25);}
digitalWrite(czerwona,LOW);
digitalWrite(zielona,LOW);
dane_uzytkownika="";

}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zadanie 4.5 mój kod 🙂

#define button 8
#define red 3
#define green 5
#define yellow 7
#define adc 0

String odebraneDane = "";
int odebraneDaneInt = 0;
int odczytADC = 0;
int wieksza = 0; // odczyt ADC + 50
int mniejsza = 0; // odczyt ADC - 50
int wynik = 0; // jeżeli wpisana liczba mieści się w zakresie
int licznikProb = 0;
int start = 0;
int val = "";

void setup() {
pinMode(red,OUTPUT);
pinMode(green,OUTPUT);
pinMode(yellow,OUTPUT);
pinMode(button,INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Witaj! Zapraszam do prostej gry, naciśnij guzik aby zacząć");}

void loop(){
odczytADC = analogRead(adc); // odczyt z ADC
wieksza = odczytADC + 50; // odczyt ADC + 50
mniejsza = odczytADC - 50; // odczyt ADC - 50


while (digitalRead (button) == LOW) { // jeżeli przycisk jest wciśnie daje informacje o starcie gry 
czyszczeniebuforu(); // czyści bufor z danych wpisanych ponad 3 próby
digitalWrite (green, LOW); // czerwonaLed wyłączona
digitalWrite (red, LOW); // zielonaLed wyłączona
przycisk (); // Wyświetla informacje o zasadach gry
start = 1; // pozwala uruchomić grę od nowa po wpisaniu 3 prób, ulazeżniając zasady od wciśniecia przycisku
delay (500);}

if(Serial.available () >0){ // uruchamia pobieranie danych
if(Serial.available () >3){licznikProb = 0;} // kasuje licznik gry dla większej ilości niż 3, bufor czyści zapisane wyniki ale licznik wzrasta po każdym wpisaniu danych wiec też trzeba go wyzerować. 

if (licznikProb <= 3 && start == 1) { // 
licznikProb = licznikProb + 1; // po wpisaniu danych zwiększa licznik gry o jeden, maksymalnie do 3

if (licznikProb ==1) {
Dane ();
Serial.println ("");
Serial.println ("podałeś: " + odebraneDane);
if (odebraneDaneInt > mniejsza && odebraneDaneInt < wieksza) {wynik = 1;}
else {wynik = 0;}
if (wynik == 1){wygrana();}
if (wynik != 1){szansa();}
}

if (licznikProb ==2){
Dane ();
Serial.println(licznikProb);
Serial.println ("");
Serial.println ("podałeś: " + odebraneDane);
if (odebraneDaneInt > mniejsza && odebraneDaneInt < wieksza) {wynik = 1;}
else {wynik = 0;}
if (wynik == 1){wygrana();}
if (wynik != 1){szansa2();}
}
                    
if (licznikProb == 3){
  Dane ();
  Serial.println(licznikProb);
  Serial.println ("");
  Serial.println ("podałeś: " + odebraneDane);
  koniec();}
}
 }
  }


void Dane() {
odebraneDane = Serial.readStringUntil ('\n');
odebraneDaneInt = odebraneDane.toInt();}

void przycisk() {
Serial.println ("");
Serial.println ("Twoim zadaniem jest zgadnąć z dokładnościa +/- 50 odczyt z potenciometru");
Serial.println ("Ustaw potenciometr w dowolne miejsce");
Serial.println ("Podaj liczbę od 1 do 1022");
delay(1000);}

void wygrana() {
Serial.println ("Wygrałeś");
Serial.println ("");
digitalWrite (green,HIGH);
digitalWrite (yellow,LOW);
digitalWrite (red,LOW);
delay (1000);
Serial.println ("Naciśni guzik by zacząć od nowa");
start = 0;}

void szansa () {
Serial.println ("Niesty, nie trafiłeś ");
Serial.println ("Spróbuj jeszcze raz, masz dwie próby ");
digitalWrite (yellow,HIGH);
digitalWrite (green,LOW);}

void szansa2 () {
Serial.println ("Niesty, nie trafiłeś ");
Serial.println ("Spróbuj jeszcze raz, masz jedną próbę ");
digitalWrite (yellow,HIGH);
digitalWrite (green,LOW);}

void koniec () {
Serial.println ("Koniec gry, nasiśnij przycisk by zacząc raz jeszcze ");
digitalWrite (yellow,LOW);
digitalWrite (green,LOW);
digitalWrite (red,HIGH);
start = 0;}

void czyszczeniebuforu() {
while(Serial.available()){
       Serial.read();
}
}  

 

Edytowano przez Gieneq

Udostępnij ten post


Link to post
Share on other sites

@BananWszyscy @ethanak Diękuję za naprowadzenie na błedy. 

Oto nowy kod zadania 4.5

#define przycisk 7
#define zielona 8
#define pomaranczowa 9
#define czerwona 10

int pozycja = 0;//Pozycja potencjometru odczytana z ADC
int gra = 3;// Ilosc zsans
String liczba = ""; // Drukuj tekst w ""
int liczba_int = 0; // Konwersacja liczby
void setup() {
  Serial.begin(9600);//Nawiazanie komunikacji
  pinMode(7, INPUT_PULLUP); //Konfiguracja wyjsc
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(A5, INPUT);
}

void loop() {
  if (digitalRead(przycisk) == LOW) { //Gdy przycisk wcisniety
    delay(200);//Opoznienie
    pozycja = analogRead(A5); //Sprawdzamy pozycje potencjometra
    Serial.println("PODAJ LICZBE");//Drukuj tekst
    digitalWrite(zielona, LOW); //Diody nie swieca
    digitalWrite(pomaranczowa, LOW);
    digitalWrite(czerwona, LOW);
    delay(200);//Opoznienie

  } if (Serial.available() > 0) { //Gdy wpisano liczbe
    liczba = Serial.readStringUntil('\n');
    liczba_int = liczba.toInt();//Konwersacja tekstu
    pozycja = analogRead(A5); //Sprawdzamy pozycje potencjometra
    if (liczba_int - pozycja <= 50 && liczba_int - pozycja >= -50) { //Gdy odczytane wartosci misccza sie w zakresie
      digitalWrite(zielona, HIGH); //Wlaczamy diode zelona
      delay(2000);//Opoznienie
      digitalWrite(zielona, LOW);//Wylaczamy diode
      Serial.println("Pozstalo "   +   String  (gra)  +  " szanse ");//Drukuj tekst
      delay(100);//Opoznienie

    } else {
      digitalWrite(czerwona, HIGH); //Wlacza sie dioda czerwona
      delay(2000);//Opoznienie
      digitalWrite(czerwona, LOW); //Wylacza sie dioda czerwona
      gra = gra - 1;//O jedna szansa mniej
      delay(100);//Opoznienie
      Serial.println("Pozstalo "   +   String  (gra)  +  " szanse ");//Drukuj tekst


    } while (Serial.available() > 0) {} // Oczekiwanie na wpisanie liczby

    if (gra < 2) { //Gdy zostala 1 szansa
      digitalWrite(pomaranczowa, HIGH);//Wlacz dide pomaranczowa
      delay(1000);//Opoznienie
      digitalWrite(pomaranczowa, LOW);//Wylacz diode pomaranczowa

    } while (Serial.available() > 0) {}// Oczekiwaine na wpisanie liczby

  } if (gra < 1) { //Gdy wyczerpano wszystkie szanse
    digitalWrite(pomaranczowa, HIGH);//Wlacz diode pomaranczowa i czerwona
    digitalWrite(czerwona, HIGH);
    Serial.println("Koniec gry, wcisnij przycisk");//Drukuj tekst

    while (digitalRead(przycisk) == HIGH) {}//Czekaj na wcisniecie przycisku
    gra = 3;
  }
}

 

  • Lubię! 1

Udostępnij ten post


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!

Gość
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...