Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

Hej, to mój pierwszy projekt, który wklejam, także chciałem się przywitać 😉

Na początku chciałbym podziękować za kurs, bo jest cholernie wciągający i czas przy nim leci jak szalony.

A teraz chciałbym się pochwalić działającym zadaniem 4.5.

Dodałem kilka ulepszeń od siebie. Przede wszystkim sygnalizację na 3 dodatkowych diodach gasnących w miarę utraty żyć. Zrobiłem też zabezpieczenie przed resetowaniem gry w jej czasie (co dodawało u mnie extra szanse), no i kilka pierdółek świetlnych dla efekciarstwa 😃 Jak ogarnę obsługę głośniczka, to może jeszcze dorzucę jakieś efekty dźwiękowe 🙂

Mam natomiast problem którego nie mogę rozwiązać: jak program oczekuje jeszcze na wciśnięcie przycisku, to wszystkie znaki jakie wtedy wpiszę, po wciśnięciu przycisku wychodzą na monitor i odbierają jedną szansę :/ Jest na to jakieś rozwiązanie?

//4.5
//wskazniki
#define red 8 //fail
#define orange 9 //utrata życia
#define green 10 //wygranko
//życia
#define life1 2
#define life2 3
#define life3 4
//przycisk
#define button 6

int proby = 0; //ilosc żyć
int wartosc = 0; //wartosc na dzielniku
int konwersja = 0; //konwerter odpowiedzi String do konwersja int
String odpowiedz = ""; //odpowiedz
//pamięci
boolean loose = ""; // pamietaj ze przegrana/wygrana
boolean reset = ""; //pamietaj że układ był resetowany

void setup() {
 //sygnalizacja stanu
 pinMode(red, OUTPUT);
 pinMode(orange, OUTPUT);
 pinMode(green, OUTPUT);
 //przycisk
 pinMode(button, INPUT_PULLUP);
 //życia
 pinMode(life1, OUTPUT);
 pinMode(life2, OUTPUT);
 pinMode(life3, OUTPUT);
 //sterowanie wyświetlaczem i komunikacją
 Serial.begin(9600);
 Serial.println("Ustaw pozycję potencjometru i zatwierdź przyciskiem");

 proby = 0; //pozostałe proby
 reset = true; //pozwolenie na użycie przycisku
}

void loop() {

 if (digitalRead(button) == LOW && reset == true) { //jeśli przycisk wciśnięty a układ ma pozwolenie na reset
   digitalWrite(red, HIGH); //zamrugaj na powitanie
   delay(100);
   digitalWrite(red, LOW);
   delay(100);
   digitalWrite(orange, HIGH);
   delay(100);
   digitalWrite(orange, LOW);
   delay(100);
   digitalWrite(green, HIGH);
   delay(100);
   digitalWrite(green, LOW);
   delay(100);

   //załaduj życia
   digitalWrite(life1, HIGH);
   delay(300);
   digitalWrite(life2, HIGH);
   delay(300);
   digitalWrite(life3, HIGH);
   delay(300);

   //początek gry
   Serial.println("Podaj liczbę!"); //wyślietl pytanie
   wartosc = analogRead(A5); //zczytaj wartość
   //Serial.println(wartosc); //TEST: wyswietl wartosc odczytu żeby sprawdzic poprawnosc działania
   reset = false; //wyłącz pozwolenie na reset

   if (loose == true) //dodatkowo jeżeli poniesiono porażkę/wygranko
     proby = 0; //resetuj proby
     proby = proby + 3; //dodaj 3 życia
 }

 if (Serial.available() > 0 && reset == false) { //sprawdź, czy pozwolenie na reset nie jest aktywowane
   odpowiedz = Serial.readStringUntil('\n'); //odpowiedz z odczytu
   konwersja = odpowiedz.toInt(); //konwertuj (odpowiedz)string do (odpowiedz)int
   if (konwersja <= wartosc - 51 || konwersja >= wartosc + 51) { //jeżeli wpisana liczba pomniejszona o 50 jest mniejsza od potencjometrowej
     proby = proby - 1;

     Serial.println ("Błędna odpowiedź!");
     Serial.println ("pozostałe proby:"); 
     Serial.println (proby);

     digitalWrite(orange, HIGH); //mrugnij diodą pomarańczową
     delay(500);
     digitalWrite(orange, LOW);
     delay(50);
   }
   else if (konwersja >= wartosc + 50 || konwersja <= wartosc + 50) { //gdy wpisalem wartosc poprawną
     Serial.println ("Wybrałeś liczbę: " + odpowiedz + ""); //jak jest bez "" to wcina ilosc liter którą wpisuję
     Serial.println("Gratulacje! Prawidłowa odpowiedź!");
     Serial.println ("Wylosowana liczba to:");
     Serial.println (wartosc);
     Serial.println("Ustaw potencjometr i naciśnij przycisk, aby rozpocząć ponownie grę!");
     digitalWrite(green, HIGH);
     loose = true;
     reset = true;
   }
   if (proby == 0) { //błąd był- średnik
     Serial.println("Przegraleś!");
     digitalWrite(red, HIGH);
     loose = true; //zapamiętaj, że przegrana
     if (loose == true) //a dodatkowo jeżeli przegrana
       Serial.println ("Wylosowana liczba to: "); //wyświetl to
       Serial.println (wartosc);
       Serial.println("Naciśnij przycisk, aby rozpocząć ponownie grę!"); 
   }
   if (proby == 2) { //sterowanie LEDami żyć3
     digitalWrite(life3, LOW);
     delay(50);
     digitalWrite(life3, HIGH);
     delay(50);
     digitalWrite(life3, LOW);
     delay(50);
     digitalWrite(life3, HIGH);
     delay(50);
     digitalWrite(life3, LOW);
   }
   if (proby == 1) {//sterowanie LEDami żyć2
     digitalWrite(life2, LOW);
     delay(50);
     digitalWrite(life2, HIGH);
     delay(50);
     digitalWrite(life2, LOW);
     delay(50);
     digitalWrite(life2, HIGH);
     delay(50);
     digitalWrite(life2, LOW);
   }
   if (proby == 0) {//sterowanie LEDami żyć1
     digitalWrite(life1, LOW);
     delay(50);
     digitalWrite(life1, HIGH);
     delay(50);
     digitalWrite(life1, LOW);
     delay(50);
     digitalWrite(life1, HIGH);
     delay(50);
     digitalWrite(life1, LOW);
     reset = true; //dopiero teraz możesz zrestetowac gre
   }
 }
}

Udostępnij ten post


Link to post
Share on other sites

som90, witam na forum 🙂 Cieszę się, że kursy się podobają - powodzenia w dalszej nauce!

jak program oczekuje jeszcze na wciśnięcie przycisku, to wszystkie znaki jakie wtedy wpiszę, po wciśnięciu przycisku wychodzą na monitor
Aby uniknąć tego musiałbyś tuż po wciśnięciu przycisku odczytać wszystkie dane z bufora i nic z nimi nie zrobić 😉

Przy okazji, czy tutaj się nie pomyliłeś? Taki zapis sprawia, że po przegranej wykonywana jest tylko pierwsza linijka znajdująca się pod instrukcją warunkową. Pozostałe dwie wykonują się zawsze, bo nie zamknąłeś ich w nawiasach klamrowych, aby "spiąć je z warunkiem" 😉

     if (loose == true) //a dodatkowo jeżeli przegrana 
       Serial.println ("Wylosowana liczba to: "); //wyświetl to 
       Serial.println (wartosc); 
       Serial.println("Naciśnij przycisk, aby rozpocząć ponownie grę!"); 

Udostępnij ten post


Link to post
Share on other sites

Witam serdecznie..., takie coś mi wyszło z zadania 4.4, być może było, ale działa..., postaram się powalczyć z 4.5

#define dioda 8 //definiowanie pinu 8
int swiatlo = 0; //zmienna czujnika swiatla
float prog = 0; //zmienna potencjometru
String v = ""; //zmienna napięcia
boolean swieci = false; //sprawdzamy czy swieci
void setup() {
 pinMode(dioda, OUTPUT); //inicjujemy diode
 Serial.begin(9600); //inicjujemy UART
}
void loop() {
 swiatlo = analogRead(A5); //odczyt swiatla
 prog = analogRead(A4); //odczyt napięcia
 v = (prog * (5.0 / 1023.0)); // przeliczenie voltów
 if (swieci == false) { //sprawdzmy czy swieci
   if (swiatlo < prog) { //jesli wartosc napiecia na dzielniku jest mniejsza od wartosci potencjometru
     digitalWrite(dioda, HIGH); //dioda wlaczona
     Serial.println(v); // wyswietl na monitorze napiecie
     swieci = true; //wlaczona czyli prawda
     delay(250); // opoznienie 250
   }
 }
 else if (swiatlo > prog)  { //jeszcze jesli wartosc napiecia na dzielniku jest wieksza od potencjometru
   digitalWrite(dioda, LOW); //dioda wylaczona
   swieci = false; //wylaczona czyli falsz
 }
}

Pozdrawiam

PS Swietny kurs 🙂.

Udostępnij ten post


Link to post
Share on other sites

bartleo, witam na forum, cieszę się, że kurs się podoba - powodzenia w dalszej nauce 🙂

Udostępnij ten post


Link to post
Share on other sites
int foto1 = 0; //zmienna do przechowywania adc fotorezystora1
int foto2 = 0; //zmienna do przechowywania adc fotorezystora2

byte foto1map = 0;
byte foto2map = 0;

void setup() {
 for(int x=2; x<=6; x++) { pinMode(x, OUTPUT); } //ustawienie portów od 2 do 6 jako wyjscia

   for(int x=2; x<=6; x++) { digitalWrite(x, HIGH); } //ustawienie wyjsc na stan wysoki

      Serial.begin(9200);
}
void loop() {

 foto1 = analogRead(A5);// wartosc czujnika swiatla
  foto2 = analogRead(A4); // wartosc potencjometru

     Serial.print("Napiecie czujnika1 :  ");
       Serial.println(foto1*(5.0/1023.0));
         Serial.print("Napiecie czujnika2 :  ");
           Serial.println(foto2*(5.0/1023.0)); //wyswietlenie wartosc napiecia czujnikow
      delay(200);

           foto1map = map(foto1, 100, 700, 4, 2);
           foto2map = map(foto2, 100, 700, 4, 6); //mapowanie czujnikow

            Serial.print("mapowanie czujnika1 :  ");   
               Serial.println(foto1map);
                 Serial.print("mapowanie czujnika2 :  ");
                   Serial.println(foto2map);  //wyswietlenie wartosc mapowania czujnikow
               delay(200);

         if(foto1map == foto2map) { 
             digitalWrite(4, LOW); 
                 for(int x=2; x<=6; x++) { digitalWrite(x, HIGH); }} 

 if((foto1map <= 4) && (foto1map <= foto2map)) { //ustawienie linijki w prawo
             for(int a=4; a>=2; a--) { digitalWrite(a, HIGH); }
                     digitalWrite(foto1map, LOW); }


 if((foto2map >= 4) && (foto2map >= foto1map)) {  //ustawienie linijki w lewo
             for(int b=4; b<=6; b++) { digitalWrite(b, HIGH); }
                     digitalWrite(foto2map, LOW); }    

}

Witam, nie rozumiem dlaczego w (ustawienie linijki w prawo) dioda led 4 nie jest w stanie wysokim, a w (ustawienie linijki w lewo) jest w ok.

Udostępnij ten post


Link to post
Share on other sites

peter-wawa1, trochę ciężko analizować Twój program przy takim formatowaniu i braku komentarzy. Możesz dokładniej opisać jakiego efektu się spodziewałeś, a co dokładnie się dzieje inaczej?

Udostępnij ten post


Link to post
Share on other sites

Może ktoś powiedzieć mi jaka jest odpowiedź do zadania 4.1 bo nie znalazłem w komentarzach. Zauważyłem, że jak potencjometr je na "maxa" obrócony i delay wynosi 0 to dioda świeci słabiej tylko nie wiem dlaczego tak się dzieje.

Udostępnij ten post


Link to post
Share on other sites

Przy okazji możecie sprawdzić moje pozostałe zadania. Chyba jedyny problem jaki z nimi mam to z 4.6 gdyż dioda najbardziej po lewej czyli na pinie 12 nie chce mi się zaświecić. Nie wiem czy to problem z programem czy po prostu nie osiągnąłem takiej różnicy na dzielnikach, żeby się zaświeciła. Z góry bardzo dziękuję

4.4

int odczytanaWartosc = 0;
int naszLimit = 0;
float napiecie = 0;

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

void loop() {
 odczytanaWartosc = analogRead(A5);
 naszLimit = analogRead(A4);
 napiecie = odczytanaWartosc * (5.0/1023.0);
 if (odczytanaWartosc < naszLimit) {
    digitalWrite(8, HIGH);
    Serial.println(napiecie);
    while (odczytanaWartosc < naszLimit){
     odczytanaWartosc = analogRead(A5);
     naszLimit = analogRead(A4);
     delay(50);
     }
 } else {
    digitalWrite(8, LOW);      
 }

 delay(50);
}

4.5

#define zielona 8
#define zolta 9
#define zolta2 10
#define czerwona 11
#define przycisk 7
String odebraneDane = "";
int naszaLiczba = 0;
boolean reset = true;
int proby = 0;
int liczba = 0; 


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

 pinMode(zielona,OUTPUT);
 pinMode(zolta,OUTPUT);
 pinMode(zolta2,OUTPUT);
 pinMode(czerwona,OUTPUT);
 pinMode(7,INPUT_PULLUP);

}
void loop () {
 if(reset == true){
   reset = !reset;
   proby = 0;
   Serial.println("Przekręć potencjometr i wciśnij przycisk");
   liczba = analogRead(A5);
   while(digitalRead(przycisk) == HIGH) {}
   digitalWrite(zielona,LOW);
   digitalWrite(zolta,LOW);
   digitalWrite(zolta2,LOW);
   digitalWrite(czerwona,LOW);
   Serial.println("Podaj liczbę:");
 }
 if(Serial.available()>0){
   odebraneDane = Serial.readStringUntil('\n');
   naszaLiczba = odebraneDane.toInt();
   if(naszaLiczba>liczba-50 and naszaLiczba<liczba+50){
     digitalWrite(zielona,HIGH);
     digitalWrite(zolta,LOW);
     digitalWrite(zolta2,LOW);
     reset = !reset;
   }
   if(naszaLiczba<liczba-50 or naszaLiczba>liczba+50){
     proby = proby+1;
     if(proby==1)
       digitalWrite(zolta,HIGH);
     if(proby==2)
       digitalWrite(zolta2,HIGH);
     if(proby==3){
       digitalWrite(czerwona,HIGH);
       reset = !reset;
     }
   }
 }
}

4.6

void setup(){
 Serial.begin(9600);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
}
void loop(){
 czujnikLewy = analogRead(A3);
 czujnikPrawy = analogRead(A5);
 roznica = czujnikLewy - czujnikPrawy;
 naszaSkala = map(roznica,-1023,1023,1,5);
 digitalWrite(8,LOW);
 digitalWrite(9,LOW);
 digitalWrite(10,LOW);
 digitalWrite(11,LOW);
 digitalWrite(12,LOW);
 if(naszaSkala == 1) //1 oznacza ze duzo wiecej swiatla po prawej stronie
   digitalWrite(8,HIGH);
 if(naszaSkala == 2)
   digitalWrite(9,HIGH);
 if(naszaSkala == 3)
   digitalWrite(10,HIGH); // 3 oznacza ze mniej wiecej po rowno swiatla
 if(naszaSkala == 4)
   digitalWrite(11,HIGH);
 if(naszaSkala == 5) //5 oznacza ze duzo wiecej swiatla po lewej stronie
   digitalWrite(12,HIGH);
 delay(50); 
}

Udostępnij ten post


Link to post
Share on other sites

Daggett, układ nie radzi sobie zbyt dobrze z pomiarem napięcia, gdy jest one bliskie napięciu zasilania (5V). Mogą wtedy wystąpić pewne zakłamania w odczytach przy maksymalnie skręconym potencjometrze. Jeśli chodzi o pozostałe programy to pamiętaj na przyszłość o większej liczbie komentarzy - będzie wtedy jeszcze lepiej 😉 Powodzenia w dalszej nauce!

Udostępnij ten post


Link to post
Share on other sites

Tak, wejścia analogowe można bez problemu wykorzystywać jako wejścia cyfrowe (trzeba odpowiednio skonfigurować pin).

Udostępnij ten post


Link to post
Share on other sites

Ciekawostka co do układu: "Lampka uruchamiana w ciemności", śmiesznym efekt otrzymamy gdy wygniemy diodę w stronę fotorezystora (w nocy to piszę gdy panuje ciemność) otrzymamy migającą diodę. Niby bzdura a cieszy, bo dioda sama daje światło które ją wyłącza a później fotorezystor sam ja włącza 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Iwanow, witam na forum!

Dokładnie tak, dlatego podkreślam zawsze, że warto robić wiele własnych eksperymentów (również tych nieopisane w kursie) - zawsze można znaleźć coś ciekawego. Gratuluję spostrzegawczości!

Udostępnij ten post


Link to post
Share on other sites

Może jest już gdzies odpowiedź na moje pytanie ale nawet nie wiem gdzie jej szukać. Wykonując kolejne ćwiczenia z Arduino składam układ z płytką potem wpisuję program na komputerze, podłączam Arduino do komputera, kompiluję i wgrywam. Mam pytanie czy można tak robić cały czas? Czy nie trzeba by zresetować Arduino po zakończonym jednym ćwiczeniu? Arduino ma wgrany poprzedni program a połączenia układu z kolejnego ćwiczenia. Czy nie trafi się tak, że się coś uszkodzi?

Udostępnij ten post


Link to post
Share on other sites

Masz rację, trzeba na to zwracać uwagę. Szczególnie zagrożone są projekty w których procesor może zrobić coś poważnie głupiego sterując swoimi wyjściami w nieprawidłowy (w sensie układu) sposób. Oczywistym przykładem jest prosty driver silnika, w którym żądanie jednoczesnej jazdy w prawo  i w lewo powoduje zwarcie zasilania i spalenie tranzystorów. Niemiła będzie też sytuacja w której wyjście procesora w dawnym układzie jest wejściem w nowym. Sygnał doprowadzony np. z przycisku czy innego scalaka napotyka wtedy sygnał z procesora i mamy konflikt, w którym nikt nie wygrywa a duży prąd może zniszczyć delikatną strukturę krzemową chipu. Robiąc też coraz większe konstrukcje istnieje możliwość, że nawet poprawne elektrycznie sygnały, ale wysyłane do innego układu spowodują uszkodzenia mechaniczne, np. ramię robota wyposażone w serwa może połamać im tryby gdy procesor sterowany dziwnym programem zacznie wysyłać komendy ustawiania poszczególnych stawów w położenia nieprzewidziane projektem.

Masz dwa wyjścia - albo wgrywać nowy program zanim zmontujesz kolejny układ, albo po zakończeniu zabawy z jednym wgrywać pusty kod. Możesz po prostu zażądać w IDE pusty program (tylko setup i loop nie robiące nic), skompilować to i wgrać. Coś takiego nie aktywuje żadnego pinu procesora i na to nowy układ powinien być odporny.

  • Lubię! 2

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