Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

53 minuty temu, Screwdriv napisał:

nie jest skończone, nie czepiać się nierównych nawiasów 😛

chciałem sprawdzić czy nie ma błędów i skompilować to co nabazgrałem.

@Screwdriv pamiętaj, że równe nawiasy to nie jest coś co robi się na koniec (przed wrzuceniem programu na forum). Ładne formatowanie kodu ma pomagać głównie Tobie (podczas pisania i późniejszego analizowania programu). Nie ma absolutnie żadnych podstaw do tego, aby nawet w testowym szkicu (szczególnie tak krótkim) trzymać bałagan. Jesteś dopiero na początku swojej drogi z Arduino, warto zadbać o takiego drobiazgi od samego początku, bo później szybko się pogubisz 🙂 

Link do komentarza
Share on other sites

Dzień dobry wszystkim 🙂

To mój pierwszy post na forum. Na początku chciałbym podziękować i pochwalić kurs- napisany jasno i przejrzyście!

Aktualnie doszedłem do zadania 4.5, poniżej moja propozycja wzbogacona o małe ułatwienie w razie gdyby ktoś lubił grać na kodach 😄

#define zielona 8
#define zolta 9
#define czerwona 10
#define przycisk 7
#define potencjometr A5
  
int poten=0;
String dana="";
int proby=3;
int dana_int=0;
int wznowienie=0;

void setup() {
pinMode(zielona, OUTPUT);
pinMode(zolta, OUTPUT);
pinMode(czerwona, OUTPUT);
pinMode(przycisk, INPUT_PULLUP);
digitalWrite(zielona, LOW);
digitalWrite(zolta, LOW);
digitalWrite(czerwona, LOW);
Serial.begin(9600);
}

void loop() {
if (wznowienie==0){
    Serial.println("Przekręć potencjometr i wcniśnij przycisk aby zacząć grę.");    //jeśli wciśniemy reset to wraca do tego miejsca
    wznowienie++;
  }
else{
  if(digitalRead(przycisk)==LOW){
    Serial.println("Podaj liczbę z zakresu 0-1023. Możesz się pomylić o +/-50. Powodzenia!");   //po wciśnięciu przycisku wyświetla napis 
    while(digitalRead(przycisk)==LOW){                                                          //i czeka dzięki while
      delay(25);
    }
  }
 
        if (Serial.available()>0){
         poten=analogRead(potencjometr);
         dana=Serial.readStringUntil('\n');               // ten "if" powoduje zczytanie z klawiatury znaku (liczby)
         dana_int=dana.toInt();                          // i przetworzenie jej ze string na int oraz wyświetla tą liczbę
         Serial.println("Twoja liczba to: " + dana);

            if (dana=="L"){
             Serial.println("Niespodzianka: " +(String)poten+ " :D");          //jeśli wpiszemy "L" to wyświetli się aktualna 
              }                                                                //wartość potencjometru
 
            if(poten+50>=dana_int && poten-50<=dana_int && dana!= "L"){
             digitalWrite(zielona, HIGH);
             digitalWrite(zolta, LOW);                                         // ten "if" powoduje zapalenie zielonej diody w momencie
             digitalWrite(czerwona, LOW);                                      // poprawnego wpisania liczby (+/-50 potencjometr)
             Serial.println("Gratulacje! Wygrałeś! :D");
             Serial.println("Jeśli chcesz zagrać ponownie, wciśnij reset.");
              }
           else{
              if (dana!="L"){
               proby--;
               digitalWrite(zielona, LOW);                                    //jeśli nie wpiszemy poprawnej liczby to zapali się żółta dioda
               digitalWrite(zolta, HIGH);                                     //i zostaje odjęta próba (od ustalonych 3)     
               digitalWrite(czerwona, LOW);                                 
               Serial.println("Niestety, podana liczba jest błędna. Spróbuj ponownie.");
               Serial.println("Pozostały Ci: "+(String)proby+" próby");
               }
              }
            if (proby==0 && dana!="L"){
             digitalWrite(zielona, LOW);                                      //jeśli próby dojdą do 0 zapala się czerwona dioda i przegrywamy
             digitalWrite(zolta, LOW);                                        //wyświetla się również podpowiedź jak podejrzeć
             digitalWrite(czerwona, HIGH);                                    // aktualną wartość potencjometru
             Serial.println("GAME OVER");                      
             Serial.println("Jeśli chcesz zagrać ponownie, wciśnij reset.");   
             Serial.println("// Jeśli chcesz wygrać- w następnej rundzie po wciśnięciu przycisku wpisz 'L' :)");                 
              }
          }
        }
}

 

A tak wyszło 4.6 (dla wartości mapowania 1, 5 nie działało, dopiero 1, 6 działa jak powinno):

#define dioda1 2
#define dioda2 3
#define dioda3 4
#define dioda4 5
#define dioda5 6
#define foto_lewy A4
#define foto_prawy A5


int lewa = 0;
int prawa = 0;
int data = 0;
int odjete = 0;

void setup() {
  Serial.begin(9600);
  pinMode(dioda1, OUTPUT);
  pinMode(dioda2, OUTPUT);
  pinMode(dioda3, OUTPUT);
  pinMode(dioda4, OUTPUT);
  pinMode(dioda5, OUTPUT);
  digitalWrite(dioda1, LOW);
  digitalWrite(dioda2, LOW);
  digitalWrite(dioda3, LOW);
  digitalWrite(dioda4, LOW);
  digitalWrite(dioda5, LOW);

}

void loop() {

  lewa = analogRead(foto_lewy);
  prawa = analogRead(foto_prawy);
  Serial.println("To jest lewy " + (String)lewa);
  Serial.println("To jest prawy " + (String)prawa);
  odjete = analogRead(foto_prawy) - analogRead(foto_lewy);
  odjete = map(odjete, -1000, 1000, 1, 6);
  delay(50);

  if (odjete == 1) {
    digitalWrite(dioda1, HIGH);
    digitalWrite(dioda2, LOW);
    digitalWrite(dioda3, LOW);
    digitalWrite(dioda4, LOW);
    digitalWrite(dioda5, LOW);
  }
  if (odjete == 2) {
    digitalWrite(dioda1, LOW);
    digitalWrite(dioda2, HIGH);
    digitalWrite(dioda3, LOW);
    digitalWrite(dioda4, LOW);
    digitalWrite(dioda5, LOW);
  }
  if (odjete == 3) {
    digitalWrite(dioda1, LOW);
    digitalWrite(dioda2, LOW);
    digitalWrite(dioda3, HIGH);
    digitalWrite(dioda4, LOW);
    digitalWrite(dioda5, LOW);
  }
  if (odjete == 4) {
    digitalWrite(dioda1, LOW);
    digitalWrite(dioda2, LOW);
    digitalWrite(dioda3, LOW);
    digitalWrite(dioda4, HIGH);
    digitalWrite(dioda5, LOW);
  }
  if (odjete == 5) {
    digitalWrite(dioda1, LOW);
    digitalWrite(dioda2, LOW);
    digitalWrite(dioda3, LOW);
    digitalWrite(dioda4, LOW);
    digitalWrite(dioda5, HIGH);
  }
}

Proszę o jakieś sugestie co jest w tych kodach jest zbędne i czego jest za dużo bo wiem, że takich rzeczy pewnie trochę będzie. 😉

Pozdrawiam serdecznie.

Edytowano przez Scorpo
  • 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

@Scorpo witam na forum, cieszę się, że kursy są pomocne 🙂

Twoje programy wyglądają ogólnie bardzo fajnie. Jeśli chcesz coś poprawić to warto zacząć od dodania komentarzy w drugim kodzie 😉 Do tego można by było np. pokusić się o wykorzystanie jednej długiej konstrukcji if...else (wtedy uzyskasz o jeden warunek mniej).

Link do komentarza
Share on other sites

Rany ale mnie pokarało za kopiowanie zmiennych.... bawiłęm się zadaniem 4.6... i ustawienia diód w "ifach" kopiowałem do kolejnych.... kable zmieniałem, wyjścia, diody 😂😂 a tu dalej nie świeci jak trzeba albo nie gaśnie...przecież stan jest dobrze wpisany.... a zmienna wszędzie ta sama 

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

Hej,

Też czasem miewam takie problemy jeśli próbuję robić coś z pamięci. Pozbywam się tego problemu nie tyle nazywaniem zmiennych tak żeby pamiętać do czego służą ale też zostawiając sobie notatkę z dokładniejszym opisem. Na początku kursu jest wzmianka o tym, że zapomina się do czego miała służyć dana linijka kodu po jakimś czasie . Dodatkowo zanim zacznę coś pisać to rozpracowuję to na papierze. Przy krótkich kodach to nie ma jakoś super znaczenia ale jak koduję coś dłuższego to łatwiej mi jest nie pogubić się w blokach kodu. No i jeszcze można korzystać ze stronki: https://www.tinkercad.com/ Do adruino jest bardzo pomocna bo można bardzo dokładnie prześledzić schemat podłączeń jakie się zaplanowało.

Link do komentarza
Share on other sites

@wnuczus w zestawach znajdują się standardowe potencjometry montażowe, która raczej nie powinny się psuć (no, chyba, że ktoś je przypadkiem spali). Jeśli potencjometr uszkodził się mechaniczne to zgłoś reklamację do Botlandu, na pewno coś zaradzą. Jeśli chodzi o stosowanie innych potencjometrów to są dostępne albo takie małe (tzw. montażowe) albo takie, jak ten, który masz u siebie na biurku - on też powinien pasować do płytki stykowej. Nic innego, pośredniego raczej nie znajdziesz. Oczywiście są różne potencjometry, ale tutaj piszę o tych popularnych modelach.

Link do komentarza
Share on other sites

Hej,

 

Oceńcie kod w porównaniu do zaproponowanych rozwiązań forumowiczów.

Jest pierwsze rozwiązanie, ktore przyszło mi do głowy. Chciałbym uzyskać wskazówki czy moje rozwiązanie jest lepsze gorsze od innych? Chodzi o samodoskonalenie czy w dobrym kierunku idę wymyślając trochę inne rozwiązania.

Z góry dzięki Pozdrawiam

Zadanie  4.4

int czujnik = 0;
int pot = 0;
int napiecie = 0;

void setup () {
  Serial.begin(9600);
  pinMode(12, OUTPUT);        
  pinMode(8, OUTPUT);  }
  
  void loop(){
    czujnik = analogRead(A5);
    pot = analogRead(A4);
  
  if(czujnik < pot) {
    digitalWrite(12, HIGH);
    napiecie = pot *(5.0/1024.0);
    Serial.println (napiecie);
      
      while(czujnik < pot)  { 
      czujnik = analogRead (A5);
      pot = analogRead (A4);    
    }}  
        else digitalWrite(12, LOW);
      
  delay(50);                 }

 

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

@digitalpll witam na forum 🙂

Pierwsza wskazówka: popracuj koniecznie nad formatowaniem kodu, bo w tej chwili jest nieczytelny. Nawiasy powinny pomagać w utrzymaniu porządku, a teraz jest u Ciebie zamieszanie. 

Tutaj w złym miejscu "zamykasz" funkcję:

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

Tutaj pojawia się dziwne "}}" - nie widać na pierwszy rzut oka czy to błąd, czy poprawna konstrukcja:

      while(czujnik < pot)  { 
      czujnik = analogRead (A5);
      pot = analogRead (A4);    
    }}  

Rozumiem, że program działa (i to się chwali), ale dbanie o poprawne formatowanie programów jest równie ważne. Przy obecnej formie bardzo łatwo o błąd podczas późniejszego rozbudowywania kodu. Na koniec przypominam też o komentarzach - warto coś dopisać, bo za jakiś czas nie będziesz sam pamiętał co robi ten program 😉

Link do komentarza
Share on other sites

Witam

Niestety mam problem z moim Arduino. Wgrałem program na miernik napięcia (który wcześniej działał),

int odczytanaWartosc = 0;
float napiecie = 0;


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

void loop() {
  odczytanaWartosc = analogRead(A5);
  napiecie = odczytanaWartosc * (5.0/1024.0);
  Serial.println(napiecie);
  delay(500);
}

i na monitorze portu szeregowego cały czas mam wartości ok. 3V,  pomimo że nie do płytki nie wpiąłem nic oprócz oczywiście kabla usb!

Taki problem mam na różnych programach, które wcześniej działały :

int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC
 
void setup() {
  Serial.begin(9600);
 
}
 
void loop() {
  odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC
   Serial.println(odczytanaWartosc);
   delay(1000);
}

cały czas pokazuje wartość ok 600, chociaż wszystkie piny są wolne.

Tak samo dzieje się na A4. 

Proszę administratora Trekker o pomoc.

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.