Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

Siema, dopiero zaczynam przygode z programowaniem 🙂 mogłby ktoś mi powiedzieć gdzie mam błąd ?

tj. zadanie 4.5 lekko przerobione bo sa 3 diody symbolizujące szanse "proby" za każdym razem gdy zle odpowiemy jedna z tych diód gaśnie.

ogólnie program działa tak że jak trafimy to działa poprawnie jak odpowiemy zle to za piewszym razem działa poprawnie natomiast jak odpowiem zle drugi raz to na ekran wywala mi jakbym mail proby 2 i 1 i dodatkowo pisze pokrec potencjometrem :/

//przypisane pinów 
#define led_czerwona1 9
#define led_czerwona2 10
#define led_czerwona3 11
#define led_zielona 8 
#define przycisk 7
#define pin_odczyt A5


int adc=0; // odczyt z potecjonometru
String podana_liczba = ""; //liczba podana przez gracza 
int podana_liczba_int=0; // przskalowanie na  int ? 
byte proby = 3; //ilosc prob
boolean od_nowa = true; 
void setup() {


pinMode(przycisk,INPUT_PULLUP);
pinMode(led_zielona,OUTPUT);
pinMode(led_czerwona1,OUTPUT);
pinMode(led_czerwona2,OUTPUT);
pinMode(led_czerwona3,OUTPUT);
Serial.begin(9600);
}
void loop() {
 if(od_nowa=true) //jesli rozpoczynamy gre od nowa
 {
   proby=3;
   digitalWrite(led_zielona,LOW); //zgaszamy wszystkie diody
   digitalWrite(led_czerwona1,HIGH);
   digitalWrite(led_czerwona2,HIGH);
   digitalWrite(led_czerwona3,HIGH);

   while(!Serial)delay(10); //czekamy na otwarcie serial monitora
   Serial.println("pokreć potencjonometrem");


   adc=analogRead(pin_odczyt); // szczytujemy wartosc z potecjonometru 
  }

 while(Serial.available() ==0); //czekamy na podanie liczby 

 podana_liczba=Serial.readStringUntil('\n');
 podana_liczba_int=podana_liczba.toInt(); // zamieniamy ze String na int 



 if(adc-podana_liczba_int<=50 && adc-podana_liczba_int >= -50)
 {
Serial.println("trafiłeś! udało ci sie wygrać");
digitalWrite(led_zielona,HIGH);
digitalWrite(led_czerwona1,LOW);
digitalWrite(led_czerwona2,LOW);
digitalWrite(led_czerwona3,LOW);
od_nowa=true;
Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
while(digitalRead(przycisk)==HIGH); delay(20);

 }
else {
if (proby==3)
{

 od_nowa=false;
 digitalWrite(led_czerwona1,LOW);
 proby --;
 Serial.println("nie udało ci się trafić ale masz jeszcze szanse");
 Serial.println("ilosc szans: ");
 Serial.println(proby);
Serial.println("podaj kolejna liczbe");
while(Serial.available()==0) delay(20);
}
if(proby==2)
{

 od_nowa=false;
 digitalWrite(led_czerwona1,LOW);
 digitalWrite(led_czerwona2,LOW);
 proby--;
Serial.println("nie udało ci się trafić ale masz jeszcze szanse");
 Serial.println("ilosc szans: ");
 Serial.println(proby);
Serial.println("podaj kolejna liczbe");
while(Serial.available()==0) delay(20);
}

if(proby==1)
{

 digitalWrite(led_czerwona1,LOW);
 digitalWrite(led_czerwona2,LOW);
 digitalWrite(led_czerwona3,LOW);

 proby --;
 od_nowa=true;
 Serial.println("nie udało ci się trafić");
 Serial.println("wykorzystales wszystkie swoje szanse");

Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
while(digitalRead(przycisk)==HIGH); delay(20);
}

}

delay(5);





}

Udostępnij ten post


Link to post
Share on other sites

Dawiddk1, witam na forum 🙂 Nie sprawdziłem całości, bo od razu zatrzymałem się na jednej linii. Pomysł nad tym zapisem:

if(od_nowa=true) //jesli rozpoczynamy gre od nowa 

Udostępnij ten post


Link to post
Share on other sites

Racja był błąd

tak powinno być:

if(od_nowa==true) //jesli rozpoczynamy gre od nowa

Jednak nie zmieniło to faktu że w momencie w którym popełnie błąd 2 raz odrazu czyta mi też nastepnego if i zgasza wszstkie diody bez mozliwosci odpowiedzenia drugi raz :/

Udostępnij ten post


Link to post
Share on other sites

Dawiddk1, no to lecimy dalej, skoro to nie było to, to spróbuj ładniej sformatować kod, wyrównać wcięcia, nawiasy itd. Będzie łatwiej analizować całość - teraz kod jest trochę rozsypany 😉

Udostępnij ten post


Link to post
Share on other sites

Już wszystko odkryłem! 🙂 Troche to zaplątałem w if ... Napewno można łatwiej ale ja nie wiem jak :/

//przypisane pinów
#define led_czerwona1 9
#define led_czerwona2 10
#define led_czerwona3 11
#define led_zielona 8
#define przycisk 7
#define pin_odczyt A5


int adc = 0; // odczyt z potecjonometru
String podana_liczba = ""; //liczba podana przez gracza
int podana_liczba_int = 0; // przskalowanie na  int ?
byte proby = 3; //ilosc prob
boolean od_nowa = true;
void setup() {


 pinMode(przycisk, INPUT_PULLUP);
 pinMode(led_zielona, OUTPUT);
 pinMode(led_czerwona1, OUTPUT);
 pinMode(led_czerwona2, OUTPUT);
 pinMode(led_czerwona3, OUTPUT);
 Serial.begin(9600);
}
void loop() {
 if (od_nowa == true) //jesli rozpoczynamy gre od nowa
 {
   proby = 3;
   digitalWrite(led_zielona, LOW); //zgaszamy wszystkie diody
   digitalWrite(led_czerwona1, HIGH);
   digitalWrite(led_czerwona2, HIGH);
   digitalWrite(led_czerwona3, HIGH);

   while (!Serial)delay(10); //czekamy na otwarcie serial monitora
   Serial.println("pokreć potencjonometrem");


   adc = analogRead(pin_odczyt); // szczytujemy wartosc z potecjonometru
 }

 while (Serial.available() == 0); //czekamy na podanie liczby

 podana_liczba = Serial.readStringUntil('\n');
 podana_liczba_int = podana_liczba.toInt(); // zamieniamy ze String na int



 if (adc - podana_liczba_int <= 50 && adc - podana_liczba_int >= -50)
 {
   Serial.println("trafiłeś! udało ci sie wygrać");
   digitalWrite(led_zielona, HIGH);
   digitalWrite(led_czerwona1, LOW);
   digitalWrite(led_czerwona2, LOW);
   digitalWrite(led_czerwona3, LOW);
   od_nowa = true;
   Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
   while (digitalRead(przycisk) == HIGH); delay(20);
 }
 else {
   if (proby == 3)
   {
     if (adc - podana_liczba_int <= 50 && adc - podana_liczba_int >= -50)
     {
       Serial.println("trafiłeś! udało ci sie wygrać");
       digitalWrite(led_zielona, HIGH);
       digitalWrite(led_czerwona1, LOW);
       digitalWrite(led_czerwona2, LOW);
       digitalWrite(led_czerwona3, LOW);
       od_nowa = true;
       Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
       while (digitalRead(przycisk) == HIGH); delay(20);

     }
     else
     {
       od_nowa = false;
       digitalWrite(led_czerwona1, LOW);
       proby --;
       Serial.println("nie udało ci się trafić ale masz jeszcze szanse");
       Serial.println("ilosc szans: ");
       Serial.println(proby);
       Serial.println("podaj kolejna liczbe");
     }
   }

   while (Serial.available() == 0); //czekamy na podanie liczby
   podana_liczba = Serial.readStringUntil('\n');
   podana_liczba_int = podana_liczba.toInt(); // zamieniamy ze String na int

   if (proby == 2)
   {
     if (adc - podana_liczba_int <= 50 && adc - podana_liczba_int >= -50)
     {
       Serial.println("trafiłeś! udało ci sie wygrać");
       digitalWrite(led_zielona, HIGH);
       digitalWrite(led_czerwona1, LOW);
       digitalWrite(led_czerwona2, LOW);
       digitalWrite(led_czerwona3, LOW);
       od_nowa = true;
       Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
       while (digitalRead(przycisk) == HIGH); delay(20);
     }
     else
     {
       od_nowa = false;
       digitalWrite(led_czerwona1, LOW);
       digitalWrite(led_czerwona2, LOW);
       proby--;
       Serial.println("nie udało ci się trafić ale masz jeszcze szanse");
       Serial.println("ilosc szans: ");
       Serial.println(proby);
       Serial.println("podaj kolejna liczbe");
     }
   }

   while (Serial.available() == 0); //czekamy na podanie liczby
   podana_liczba = Serial.readStringUntil('\n');
   podana_liczba_int = podana_liczba.toInt(); // zamieniamy ze String na int

   if (proby == 1)
   {
     if (adc - podana_liczba_int <= 50 && adc - podana_liczba_int >= -50)
     {
       Serial.println("trafiłeś! udało ci sie wygrać");
       digitalWrite(led_zielona, HIGH);
       digitalWrite(led_czerwona1, LOW);
       digitalWrite(led_czerwona2, LOW);
       digitalWrite(led_czerwona3, LOW);
       od_nowa = true;
       Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
       while (digitalRead(przycisk) == HIGH); delay(20);

     }
     else
     {
       digitalWrite(led_czerwona1, LOW);
       digitalWrite(led_czerwona2, LOW);
       digitalWrite(led_czerwona3, LOW);

       proby --;
       od_nowa = true;
       Serial.println("nie udało ci się trafić");
       Serial.println("wykorzystales wszystkie swoje szanse");
       Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
       while (digitalRead(przycisk) == HIGH); delay(20);
     }
   }

 }
 delay(20);
}

Dzięki wielkie! 🙂

Udostępnij ten post


Link to post
Share on other sites

Dawiddk1, super - nauczka na przyszłość - od razu warto ładnie formatować kod 😉

Udostępnij ten post


Link to post
Share on other sites

zadanie 4.2

Proste następuje branie sygnału analogowego z powietrza(tak zwana Elektro statyczność) i co złapie to takie dane poda dlatego układy typu mos fet są bardzo czułe i można łatwo uszkodzić

zadanie 4.4

ja to bym zrobił tak

int dane = 0;
int prog = 0;
float napiecie = 0;
int wyswietl = 0;
void setup() {
 Serial.begin(9600);// połącz sie z komputerem
 pinMode(8, OUTPUT);// ustaw pin 8 jako wyjście
 }

void loop() {
 dane = analogRead(A5);// pobieramy sygnał analogowy
 napiecie = dane*(5.0/1023.0);// zamieniamy sygnały analogowe na napięcie
 prog = analogRead(A4); // ustawiamy czułość diody 
if(dane < prog){// jeśli ustawimy sygnał mniejszy od rezystancji
digitalWrite(8, HIGH);// włącz diodę 
if(wyswietl == 0){// jeśli wyświetli diodę
Serial.println(napiecie);//wypisz w monitorze 
wyswietl = 1;// zamień dane wyświetl by pokazać raz napięcie
}
}
else{// jeśli sygnał jest większy od rezystancji 
 digitalWrite(8, LOW);// wyłącz diodę
 wyswietl = 0;// zamień dane by znów moc wyświetlić dane diody
}
delay(50);// odczekaj by wszystko fajnie fungowało :)

zadanie 4.5 jeszcze myślę

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Udostępnij ten post


Link to post
Share on other sites

mistus, witam na forum 🙂 Dzięki za podzielenie się Twoimi kodami - pamiętaj na przyszłość, aby wszystkie programy wklejone w post obejmować tagami . Będą one wtedy czytelniejsze 🙂

Udostępnij ten post


Link to post
Share on other sites

Trochę się na męczyłem nad zadaniem 4.5 i niestety przyznam się ze musiałem skorzystać z pomocy forum dokładnie z dwóch funkcji nie znałem ich toINT() i && tej drugiej funkcji nie rozumie jak by mógł ktoś mi ja wytłumaczyć był bym wdzięczny

ps. tam gdzie plus w komentarzu trzeba wykasować

#define przycisk 8// nadanie pina nazw 
#define czerwona 7
#define zolta 6
#define zielona 5
int wcisniety = 0;
int potencjometr = 0;
String wpis = "";
int zapis = 0;
int pruba = 3;
int tekst = 0;
int informacja = 3;
void setup() {
 Serial.begin(9600);
 pinMode(przycisk, INPUT_PULLUP); //ustawienie przycisku jako wejście
 pinMode(czerwona, OUTPUT);// ustawienie diod jako wyjście
 pinMode(zolta, OUTPUT);
 pinMode(zielona, OUTPUT);
 digitalWrite(przycisk, HIGH);// wpisanie przyciskowi stanu wysokiego
 digitalWrite(czerwona, LOW);// wpisanie dioda stanu niskiego
 digitalWrite(zolta, LOW);
 digitalWrite(zielona, LOW);
 }

void loop() {
 if(tekst == 0){//rozpoczęcie tekstu
   Serial.println("Część jak masz na imię graczu");
   Serial.println("po wpisaniu imienia wciśnij przycisk działa jak enter");
   tekst = 1;//zakończenie tekstu
 }
 if (digitalRead(przycisk) == LOW){//załączenie gry oraz przywitanie
   delay (500);
   digitalWrite(czerwona, LOW);//wyłącz diody po wykonaniu gry
   digitalWrite(zielona, LOW);
   if (wcisniety == 0);//jeśli jest wciśnięty przycisk 2 razy i następne
   potencjometr = analogRead(A5);//wpisz dane potencjometru
   Serial.println(potencjometr);//+ dodatkowo normalnie nie pokazuje wyniku potencjometru
   (200);
   Serial.println("wylosowałeś jaka liczbę");//zapytaj gracza jaka to liczba
   pruba = 3;// odpal 3 prób
 }
 wcisniety = 1;//zakończ wciśniecie przycisku
 Serial.flush();// kasuj z bufora
 while(Serial.available() > 0){// sprawdź czy coś jest w buforze
 wpis = Serial.readStringUntil('\n');// wpisz dane z bufora do wpis
 Serial.println(wpis);//+ dodatkowe normalnie nie ma pokazuje imię wpisane   
 zapis = wpis.toInt();// zamienia String na Int i wpisuje do zapis
 }
 if(informacja > 2){//wciśnięcie raz przycisku 
   if (digitalRead(przycisk) == LOW){
     delay(200);
   Serial.println("Witam ciebie ja nazywam sie Bob");
   Serial.println(" Witaj w grze Szczęściarz");
   Serial.println("Zasady są proste ustaw potencjometr w jakieś pozycji");
   Serial.println("wciśnij enter czyli nasz przycisk i zgadnij jaka jest liczba na potencjometrze");
   Serial.println("zakres strzału to od 0 - 1023");
   Serial.println("ale nie martw się masz 3 szanse i możesz pomylić się o +/-50"); 
   informacja = informacja -1;// zakończenie działania pierwszego kliknięcia
 }
}
 if (zapis > 0){// jeśli trafiłeś świeci dioda zielona
   if(potecjometr-50<=zapis && potencjometr+50>=zapis){
     Serial.println("Brawo trafiłeś jeśli jeszcze raz chcesz spróbować szczęścia kliknij przycisk");
     digitalWrite(zielona, HIGH);
     zapis = 0;

   }
   else if (zapis > 0){// jeśli nie masz dwie szanse
     Serial.println("Nie udało się spróbuj jeszcze raz");
     if (pruba > 1){
     digitalWrite(zolta , HIGH);
     delay(1000);
     digitalWrite(zolta, LOW);
     delay(1000);
     zapis = 0;
     pruba = pruba -1;
     }
     else if (pruba == 1){// nie udało się zapal czerwona diodę
       if(zapis > 0){
        Serial.println("to nie twój dzień proponuje bys zaczął od nowa");
        Serial.println("jeśli chcesz wciśnij przycisk");
        digitalWrite(czerwona, HIGH);
       }
        zapis = 0;

     }
   }
 }
 wcisniety = 0;

Udostępnij ten post


Link to post
Share on other sites

&& to operator logiczny AND. Muszą być spełnione oba warunki żeby if się wykonywał. Poczytaj kurs techniki cyfrowej.

Pozdrawiam.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dzięki znam bramki logiczne nie rozumiałem tylko tego symbolu znam symbol & ale pojedynczy tyczy przynajmniej według książki która polecam "Arduino 65 Praktycznych przykładów arduino"

liczb binarnych w systemie dwójkowym czyli mam rozumieć ze dwa operatory tycza liczb dziesiętnych ?

Udostępnij ten post


Link to post
Share on other sites

Operator && działa na wartościach logicznych. Działa jak AND w algebrze Boole'a.

Udostępnij ten post


Link to post
Share on other sites

Hejka, to mój pierwszy post tutaj.

Zgodnie z zadaniem domowym 4.6 zrobiłem działający czujnik światła określający jego źródło.

int lewa = 0; 
int prawa = 0;
int poziom = 0;
void setup() {
 Serial.begin(9600);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);

}

void loop() {
 lewa = analogRead(A4);
 prawa = analogRead(A5);

 lewa = map(lewa, 400, 850, 1, 5); //wartości ustalone doświadczalnie
 prawa = map(prawa, 400, 850, 1, 5);

 poziom = lewa - prawa;
 poziom = map(poziom, -4, 4, 1, 5); //ustalenie różnicy między stronami

 Serial.println(poziom); //kontrolnie wyświetlam różnicę
 delay(50);

 digitalWrite(8, LOW); //wyłączenie wszystkich diod
 digitalWrite(9, LOW);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
 digitalWrite(12, LOW);


// włączenie odpowiedniej diody
 if (poziom == 1) { 
   digitalWrite(12, HIGH);
 } else if (poziom == 2) {
   digitalWrite(11, HIGH);
 } else if (poziom == 3) {
   digitalWrite(10, HIGH);
 } else if (poziom == 4) {
   digitalWrite(9, HIGH);
 } else if (poziom == 5) {
   digitalWrite(8, HIGH);
 }
}

Udostępnij ten post


Link to post
Share on other sites

krzyska, witam na forum 🙂 Dzięki za podzielenie się Twoim rozwiązaniem. W przyszłości ostatni, długi warunek warto byłoby zamienić na instrukcję switch...case. Jednak oczywiście w aktualnej formie też jest poprawnie 😉

Udostępnij ten post


Link to post
Share on other sites

zadanie 4.6 tyle ze na 6 diodach by pokazać jak robić z wyższa liczba diod zwłaszcza że kolega wyżej pokazał jak zrobić na 5

#define czerwony 10// nadaje nazwy pinom
#define zolty
#define zielony 8
#define zielona 7
#define zolta 6
#define czerwona 5
int lewa = 0;// ustawiam zmienne dla lewej i prawej strony
int prawa = 0;
void setup() {
 pinMode(czerwony, OUTPUT);// ustawiam piny diod jako wyjścia
 pinMode(zolty, OUTPUT);
 pinMode(zielony, OUTPUT);
 pinMode(zielona, OUTPUT);
 pinMode(zolta, OUTPUT);
 pinMode(czerwona, OUTPUT);
 }

void loop() {
 lewa = analogRead(A3);// odczytuje stan na lewej stronie
 prawa = analogRead(A4);// odczytuje stan na prawej stronie
 lewa = map(lewa, 50,800,0,3);// nadaje przedziały lewej stronie
 prawa = map(prawa, 50,800,0,3);// nadaje przedziały prawej stronie
 digitalWrite(czerwony, LOW);// wyłączam diody lub zmieniam pozycje świecenia
 digitalWrite(zolty, LOW);
 digitalWrite(zielony, LOW);
 digitalWrite(czerwona, LOW);
 digitalWrite(zolta, LOW);
 digitalWrite(zielona, LOW);
   if (lewa > prawa){// porównuje lewa do prawej
     if (lewa == 1){// zaświecam odpowiednie diody
       digitalWrite(czerwony, HIGH);
     }
     else if (lewa == 2){
       digitalWrite(zolty, HIGH);
     }
     else if (lewa == 3){
       digitalWrite(zielony, HIGH);
     }
   }
   else if (prawa > lewa){// porownuje prawa do lewej
     if (prawa == 1){// zaswiecam odpowiednie diody
       digitalWrite(czerwona, HIGH);
     }
     else if (prawa == 2){
       digitalWrite(zolta, HIGH);
     }
     else if (prawa == 3){
       digitalWrite(zielona, HIGH);
     }
   }
}
  • 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!

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...