Skocz do zawartości

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 🙂 

(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

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

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

@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!

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.

  • 2 tygodnie później...

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

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

(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

@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 😉

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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...