Skocz do zawartości
Komentator

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

Pomocna odpowiedź

@wojtomir zadaj też pytania w komentarzu do danego artykułu to postaramy się pomóc - zobaczysz jak Ci pójdzie dalej, może to tylko drobne początkowe problemy, które da się szybko rozwiązać 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zadanie domowe nr 2.5*:

#define zielona 8
#define czerwona 9


String odebraneDane = ""; //Pusty ciąg odebranych danych
boolean stanZielona = false;
boolean stanCzerwona = false;

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

  digitalWrite(zielona, LOW); //Wyłączenie diod
  digitalWrite(czerwona, LOW);
}

void loop() {
  if(Serial.available() > 0) { //Czy Arduino odebranło dane
    odebraneDane = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona"
      if (stanZielona == false) { //Jeżeli dioda zielona jest wyłączona
        digitalWrite(zielona, HIGH); //To włącz diodę zieloną
        stanZielona = true; //Informacja o stanie diody zielonej - włączona
      } else { //W przeciwnym wypadku
        digitalWrite(zielona, LOW); //Wyłącz diodę zieloną
        stanZielona = false; //Informacja o stanie diody zielonej - wyłączona
      }
    } else if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
      if (stanCzerwona == false) { //Jeżeli dioda czerwona jest wyłączona
        digitalWrite(czerwona, HIGH); //To włącz diodę czerwoną
        stanCzerwona = true; //Informacja o stanie diody czerwonej - włączona
      } else { //W przeciwnym wypadku
        digitalWrite(czerwona, LOW); //Wyłącz diodę czerwoną
        stanCzerwona = false; //Informacja o stanie diody czerwonej - wyłączona
      }
    } else { //Jeżeli podano inne polecenie
      Serial.println("Błędne polecenie!"); //Wyświetl komunikat
    }    
  }
}

 

Edytowano przez ewgron
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@ewgron fajnie że podzieliłeś się swoim rozwiązaniem, wygląda dobrze a co ważniejsze działa 🙂 powodzenia w kolejnych zadaniach! 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Mam pytanie do zadania domowego 2.4.

#define zielona 8
#define czerwona 9

String odebraneDane = "";

void setup() {
  Serial.begin(9600);
  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

}

void loop() {
  if(Serial.available() > 0) {
    odebraneDane = Serial.readStringUntil('\n');
  }
    if (odebraneDane == "zielona") {
      digitalWrite(zielona, HIGH);
      delay(1000);
      digitalWrite(zielona, LOW);
    }

    else if (odebraneDane == "czerwona") {
      digitalWrite(czerwona, HIGH);
      delay(1000);
      digitalWrite(czerwona, LOW);
    }
    else {
      Serial.println("WYBRANO NIEPRAWIDŁOWY KOLOR SYGNALIZACJI");
    
    }  
    

  }

Kod podany wyżej działa, ale wysyła cały czas komunikat w terminalu.

Jak to rozwiązać w taki sposób, żeby wysyłał go wtedy kiedy wpiszemy błędny kolor, a nie cały czas.

Kod podany poniżej działa tak jak chcę, ale różni on się tym, że nawias klamrowy, który wcześniej wstawiłem po if(Serial.available() > 0) { odebraneDane = Serial.readStringUntil('\n'); 

teraz wstawiłem po prostu na końcu. 

#define zielona 8
#define czerwona 9

String odebraneDane = "";

void setup() {
  Serial.begin(9600);
  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

}

void loop() {
  if(Serial.available() > 0) {
    odebraneDane = Serial.readStringUntil('\n');
  
    if (odebraneDane == "zielona") {
      digitalWrite(zielona, HIGH);
      delay(1000);
      digitalWrite(zielona, LOW);
    }

    else if (odebraneDane == "czerwona") {
      digitalWrite(czerwona, HIGH);
      delay(1000);
      digitalWrite(czerwona, LOW);
    }
    else {
      Serial.println("WYBRANO NIEPRAWIDŁOWY KOLOR SYGNALIZACJI");
    
    }  
    }

    
  }

Proszę o wytłumaczenie jakie znaczenie ma ten nawias, ponieważ nie mogę zrozumieć jego istotności w kodzie.

Udostępnij ten post


Link to post
Share on other sites

@robosimon witam na forum  problem jest dość prosty - po odebraniu tego co jest w warunku coś się dzieje ale nie resetuejsz tego co sprawdzasz. Czyli kolejno: coś odebrałeś > zapisałeś do zmiennej > sprawdziłeś zgadza się > i tu trzeba tą zmienną skasować, bo będzie cały czas wyzwalać poprawny warunek, a powinno się tak stać dopiero po odebraniu nowych danych.

Drugi kod jest o tyle lepszy, że coś się wykonuje jedynie gdy odbierzesz dane z Serialu, więc już lepiej  

Poza tym polecam skrót... chyba Ctrl-T ale znadziesz to w menu - autoformatowanie, to od razu zauważysz do czego jest jaki nawias.

  • Lubię! 1
  • Pomogłeś! 1

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!

Gość
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...