Skocz do zawartości

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


Pomocna odpowiedź

   #define zielona 8
   #define czerwona 10
   #define zolta 9
   String odebraneDane = "";
   boolean czer = false;
   boolean ziel = false;
   boolean zol = false;
   boolean poczatek = false;

   void setup() {
     Serial.begin(9600); //Uruchomienie komunikacji
     pinMode(czerwona, OUTPUT);
     pinMode(zielona, OUTPUT);
     pinMode(zolta, OUTPUT);
     pinMode(7, INPUT_PULLUP);


     digitalWrite(czerwona, LOW);
     digitalWrite(zielona, LOW);
     digitalWrite(zolta, LOW);

   }

   void loop() {
     if(poczatek ==false){
     Serial.println("Wpisz prosze nazwe koloru diody: zielona, czerwona lub zolta");
     Serial.println("Ponowny wpis nazwy koloru spowoduje wygaszenie diody");
     Serial.println("Nacisniecie przycisku spowoduje wygaszenie zapalonych diod");
     Serial.println("Napisz 'wlacz wszystkie kolory' - wlacza wszystkie diody");
     Serial.println("Napisz 'wlacz dwa kolory' - wlacza czerwony i zielony");
     poczatek = !poczatek;
     while(Serial.available() == false){}
     }

     if(Serial.available() > 0){
       odebraneDane = Serial.readStringUntil('\n');
         if(odebraneDane == "zielona"){
           ziel = !ziel;
            digitalWrite(zielona, ziel);
            if(ziel == true){
            Serial.println("wlaczenie diody zielonej");
            }
            if(ziel == false){
             Serial.println("wylaczenie diody zielonej");

            }
         }   
         else if(odebraneDane == "czerwona"){
           czer = !czer;
            digitalWrite(czerwona, czer);
            if(czer == true){
            Serial.println("wlaczenie diody czerwonej");
            }
            if(czer == false){
             Serial.println("wylaczenie diody czerwonej");

            }
         }
         else if(odebraneDane == "zolta"){
           zol = !zol;
           digitalWrite(zolta, zol);
           if(zol == true){
            Serial.println("wlaczenie diody zoltej");
            }
            if(zol == false){
             Serial.println("wylaczenie diody zoltej");

            }
         }
         else if(odebraneDane == "wlacz wszystkie kolory"){
             digitalWrite(zielona, HIGH);
             digitalWrite(czerwona, HIGH);
             digitalWrite(zolta, HIGH);
             Serial.println("wlaczono wszystkie diody");
             ziel = true;
             czer = true;
             zol = true;
         }
         else if(odebraneDane == "wlacz dwa kolory"){
           digitalWrite(zielona, HIGH);
             digitalWrite(czerwona, HIGH);

           Serial.println("wlaczono czerwony i zielony");
           ziel = true;
           czer = true;
           if(zol==false){
             Serial.println("zolta nie swieci");
           }
           if(zol==true){
             Serial.println("zolta takze swieci");
           }
         }  
         else {
           Serial.println("Nieprawidlowy kolor.Wpisz zielona, czerwona albo zolta");
         }

     }



     if(digitalRead(7) == LOW){
             digitalWrite(zielona, LOW);
             digitalWrite(czerwona, LOW);
             digitalWrite(zolta, LOW);
             Serial.println("wygaszenie diod wymuszone przyciskiem");
             ziel = false;
             czer = false;
             zol = false;
             delay(1000);
       }
    } 
  • Lubię! 1
Link to post
Share on other sites

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 😉

Link to post
Share on other sites

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?

Link to post
Share on other sites

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?

Link to post
Share on other sites

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); 


}          
}          
          }
}
}
    }
}




Link to post
Share on other sites

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 😉

Link to post
Share on other sites

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?

Link to post
Share on other sites

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?

Link to post
Share on other sites

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.

Link to post
Share on other sites

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

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.