Skocz do zawartości

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


Pomocna odpowiedź

Krigare, witam na forum 🙂

Zaczynając od końca:

LOW = false = 0

HIGH = true = 1

Łączenie kilku tekstów ze zmiennymi, to dość złożony temat i łatwo można wpaść w problem "dziwnych błędów". Więcej na ten temat znajdziesz w dokumentacji Arduino: https://www.arduino.cc/en/Tutorial/StringAdditionOperator

Tak właściwie, to w Twoim przykładzie "plusy" są zbędne - wszystko może być jednym ciągiem:

Serial.println("Nie ma takiego koloru. \n Prawidlowy kolor to:  \n zielona \n czerwona");
Link to post
Share on other sites

Moj program, trochę nad nim siedziałem żeby wszystko działało ok:-))

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

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

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

        }
     }
     if(odebraneDane != "czerwona" && odebraneDane != "zielona" && odebraneDane != "zolta" && odebraneDane !="wlacz wszystkie kolory" && odebraneDane !="wlacz dwa kolory"){
       Serial.println("Nieprawidlowy kolor.Wpisz zielona, czerwona albo zolta");
     }
     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;
     }
     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");
       }
     }

 }



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




}   




Link to post
Share on other sites

Dlaczego w tym programie kiedy wpisuję "zielona" wszystko działa dobrze, zaś kiedy wpisze "czerwona" to również działa lecz wyświetla sie komunikat z podprogramu else.

#define zielona 8
#define czerwona 9

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

void setup() {
 Serial.begin(9600); //Uruchomienie komunikacji
 pinMode(zielona, OUTPUT); //Konfiguracja wyjść
 pinMode(czerwona, OUTPUT);

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

void loop() {
 if(Serial.available() > 0) { //Czy Arduino odebrano dane
   //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 

   if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
     digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
     delay(1000);
     digitalWrite(czerwona, LOW); 
   }

   if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona"
     digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
     delay(1000);
     digitalWrite(zielona, LOW); 
   }
   else {
    Serial.println("Nie ma takiego koloru!!!"); 
   }
 }
}
Link to post
Share on other sites

klimek13 else zawsze odnosi się do poprzedzającego if-a. Więc jeśli napisałeś else po zielonej to wpisując czerwona program uważa, że to właśnie else do zielonej i wywala zadany komunikat... Użyj jeszcze jednego if(warunek) zamiast else...

Link to post
Share on other sites

Nie jeszcze jednego if-a, tylko jeszcze jednego else. To odnosi się od obydwu programów. Jeśli mamy kolejne warunki, które są rozłączne (jak jest zielone to nie czerwone, ani nie żółte) używamy konstrukcji "else if". Dzięki temu program jest nieco wydajniejszy, a co najważniejsze nie ma potrzeby pisania skomplikowanego wyrażenia na końcu do obsługi innych przypadków - więc zamiast:

if(odebraneDane != "czerwona" && odebraneDane != "zielona" && odebraneDane != "zolta" && odebraneDane !="wlacz wszystkie kolory" && odebraneDane !="wlacz dwa kolory"){

używamy po prostu else.

Link to post
Share on other sites

Kurcze jakoś nie moge sobie tego dalej wyobrazić. Dopiero zaczynam sie tego uczyć. Mógłbyś mi napisać ten mój program przerobiony? Byłbym wdzięczny bo wtedy bym jasno widział jaka jest różnica i gdzie robię błąd.

Link to post
Share on other sites

Proponowałbym coś takiego:

    if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
     ....
   }
   else if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona"
     ....
   }
   else {
     ....
   }
Link to post
Share on other sites

Wpisałem taki długi warunek if-a bo po wpisaniu "wlacz dwa kolory" lub "wlacz wszystkie kolory" działało ale wywalało mi "nieprawidłowy kolor" w komunikatach.

Jesli po twoim else dam komunikat o nieprawidłowym kolorze, to po wpisaniu "wlacz dwa kolory" wyswietli mi ten komunikat....

Link to post
Share on other sites

Ale przecież else odnosi się do innych warunków niż były wpisane wcześniej w programie... więc skoro wcześniej nie wpisałem warunku dotyczącego "wlacz dwa kolory" i "wlacz wszystkie kolory" to program zaliczy te komendy do else i wywali wpisanie nieprawidłowego koloru....

Link to post
Share on other sites

Sorry ale nie łapię, dalej trzymam się tego co napisałem w poprzednim poście...

Jak program może nie zaliczyć "wlacz dwa kolory" do else skoro w if-ach ich nie było?

Zaczynam dopiero, nie znam niuansów....

Link to post
Share on other sites

Musisz najpierw sprawdzić wszystkie poprawne wartości zmiennej odebraneDane, czyli czerwona, zielona, zolta, "wlacz dwa kolory", czy jakiekolwiek wartości uznasz za istotne. Na końcu jeśli wartość jest inna umieszczasz else i wypisujesz komunikat o błędzie.

Link to post
Share on other sites

no właśnie w programie sprawdzałem wartości zmiennej odebraneDane:

if(odebraneDane != "czerwona" && odebraneDane != "zielona" && odebraneDane != "zolta" && odebraneDane !="wlacz wszystkie kolory" && odebraneDane !="wlacz dwa kolory"){ 
       Serial.println("Nieprawidlowy kolor.Wpisz zielona, czerwona albo zolta"); 
     } 

jak to można zrobić krócej nie wiem, jak zmienić kolejność? kolejność if-ów? kolejność w warunku? dodatkowa zmienna?

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.