Skocz do zawartości

Kurs Arduino - #3 - UART (komunikacja z PC), zmienne


Pomocna odpowiedź

Dzięki Elvis, faktycznie masz rację, rozbudowywałem ten program etapami, co mi przyszło do głowy i w końcu okazało się, że felerny warunek został gdzieś w środku programu. Umknęło mi to, nie ma to jak świeże oko.

Wytłumacz mi jeszcze dlaczego lepiej jest używać else if zamiast kolejnych if? Ma to jakieś znaczenie praktyczne, estetyczne, różnica w działaniu kodu?

Jedno jeszcze pytanie: co dać na końcu linii Serial.println("costam costam")????; co zamiast pytajników żeby następna linijka była pusta, a kolejny komunikat nie był jeden pod drugim?

THX 😉

Zalet używania else jest kilka:

• program dziala szybciej - jak jeden z warunków jest spełniony, pozostałych nie trzeba już sprawdzać

• używanie wielu if-ów może spowodować błędy jeśli zmodyfikujesz sprawdzaną wartość - może się okazać, że więcej niż jeden if będzie jednocześnie wykonany

• jeśli kiedyś zmienisz coś w jednym z if-ów, musisz pamiętać o zmianie i końcowego if-a. Powiedzmy zamiast "zolty", chcesz używać "żółty". W wersji z else zmieniasz wartość i gotowe. Poprzednio program powtarzał dwa razy tą samą wartość, a łatwo o tym zapomnieć

Niestety nie używam Arduino za często, więc mogę tylko zgadywać - może jest Serial.print(), które nie dodaje znaku końca linii?

Czyli rozumiem, ze w wersji z samymi if-ami w każdej pętli program sprawdza wszystkie if po kolei, nawet kiedy pierwszy pasuje to i tak leci przez wszystkie następne? tak?

Za to w wersji z else if sprawdza pierwszego ifa i jak pasuje to pomija wszystkie pozostałe else, a jak nie pasuje if to sprawdza po kolei else aż któryś spasuje i resztę pomija? Tak?

  • 1 miesiąc później...

witam serdecznie,

Oto mój program z pracy domowej, nie wiem gdzie robię błąd, gdyż zapala i gasi się tylko dioda czerwona , a zielona i komunikaty o błędnym kolorze nie działają. Z góry dziękuje za odpowiedź i pomoc.

#define zielona 2
#define czerwona 4

String odebraneDane = ""; //Pusty ciąg odebranych danych 

boolean zielonaon =false;
boolean czerwonaon =false;

void setup() { 
 Serial.begin(9600); //start komunikacji 

 pinMode(zielona, OUTPUT); //ustawienie wyjść 
 pinMode(czerwona, OUTPUT); 

 digitalWrite(zielona, LOW); //Wyłączamy diody 
 digitalWrite(czerwona, LOW); 

 Serial.print("Wybierz kolor"); 
  delay(1000); 
 Serial.print("."); 
 delay(1000); 
 Serial.print("."); 
 delay(1000); 
 Serial.println("."); 
 delay(5000); 
} 

void loop() { 


    if(Serial.available() > 0) {       //czy odebrano dane 

   odebraneDane = Serial.readStringUntil('\n'); //jesli tak zapisz do odebraneDane 
       if (odebraneDane == "czerwony") { //Jeśli wpisano czerwony 
                digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
             if(czerwonaon==false){
                      czerwonaon=true;
                      Serial.println("zapalam czerwona!");
             }else{ digitalWrite(czerwona, LOW); 
                                   Serial.println("gasze czerwona!");
                                   czerwonaon=false;

       if (odebraneDane == "zielony") { // jesli wpisano zielony 
               digitalWrite(zielona, HIGH); //załącz  diodę zieloną 
                if(zielonaon ==false){
                   zielonaon=true;
                   Serial.println("zapalam zielona!"); //Wyślij komunikat

                       }else{digitalWrite(zielona, LOW);   // wyłącz zieloną 
                             Serial.println("gasze zielona!");
                             zielonaon=false;





       if(odebraneDane != "zielony" && odebraneDane != "czerwony"){ //komunikaty błędnie wpisanego koloru 
             Serial.println("niepoprawny kolor"); 
               delay(500); 


}          
}          
          }
}
}
    }
}




Może zacznij od pozamykania nawiasów od kolejnych if i else w odpowiednim miejscu.

Ilość zamykających na końcu robi wrażenie, niestety nie za dobre 😉

  • 2 tygodnie później...

ferb01, witam na forum, a co to znaczy, że nie działa? Jakie są objawy? Umieszczaj programy bezpośrednio w postach (obejmując je tagami ) ułatwisz wtedy wszystkim analizę Twoich programó 😉

SOYER, dlaczego?

Treker, czyli taka forma jest poprawna? Wtedy zapisze do odebraneDane wszystko co będzie wpisane w konsolę?tak?

Czy wtedy linijka

odebraneDane=Serial.readStringUntil('\n")

jest zbędna?

SOYER, nie. Mylisz tutaj kilka spraw. "String odebraneDane;" to tylko deklaracja zmiennej, której można przypisać wartość początkową lub nie. W tym wypadku jej zerowanie przez =""; nic nie zmienia, bo my do tej zmiennej niczego nie dopisujemy. My ją zawsze nadpisujemy tym, co jest właśnie zwracane przez "Serial.readStringUntil('\n")", więc jej pierwotna wartość (tuż po inicjalizacji) nie robi żadnej różnicy.

Treker, masz w pełni rację jest jednak drobne ale... Tak byłoby w przypadku języka C. Jednak Arduino używa C++, a String jest klasą. Oznacza to, że kod:

String odebraneDane;

tworzy obiekt, czyli instancję klasy String. Podczas tworzenia wywoływany jest konstruktor, który przypisuje do obiektu pusty napis, więc robi to samo co ="", chociaż nieco inaczej (samo wywołanie konstruktora odbywa się przed funkcją main). Obiekt jest zawsze zainicjalizowany, nic nie zmieni dopisanie lub nie jawnego przypsiania wartości.

  • Lubię! 1

Kompletnie nie wiem o czym pisz Elvis, ale wiem jedno, miałem rację pisząc, że

String odebraneDane =""

jest nie do końca sensowne.

Pzdr

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