Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

(edytowany)

Smaruje zadanie 4.5

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.

i wywala mi expected primary-expression before '=' token przy #define przycisk = 11 

o co chodzi?? przecież w tym miejscu jest wszystko ok..

 

#define czer = 8
#define pom = 9
#define ziel = 10
#define przycisk = 11
	int wartosc = 0;
String odebrane = "";
	bool send = false;
void setup() {
Serial.begin(9600);
pinMode(czer, OUTPUT);
pinMode(pom, OUTPUT);
pinMode(ziel, OUTPUT);
pinMode(przycisk, INPUT_PULLUP);
}
	void loop() {
wartosc = analogRead(A5);
if (digitalRead(przycisk) == LOW){
  Serial.println("Podaj liczbe:");
  delay(1000);
  if(Serial.available()>0) {
    odebrane = Serial.readStringUntil('\n'); 
  }
}
}
	

Edytowano przez Screwdriv

Udostępnij ten post


Link to post
Share on other sites

A po co znak.= przy #define?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
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 🙂 

Udostępnij ten post


Link to post
Share on other sites

Warto przepuścić ten kod przez np. clang-format, a potem używać jakiegoś poludzkiego edytora zamiast tej namiastki w Arduino IDE.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

@Screwdriv tak to właśnie bywa, dlatego czasami warto napisać kod od nowa zamiast kopiować 😉 Grunt, że problem rozwiązany - powodzenia w dalszych eksperymentach!

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

Pytanko są jakieś lepsze potencjometry które pasują tej płytki?  Bo ten z zestawu się popsuł po jednym obrocie i wskazuje ciagle 5V i musiałęm się ratować jakimś starym i tak się zdziwiłem, że działa

81759380_624719514940605_7849697502520410112_n.jpg

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
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 😉

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