Skocz do zawartości

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


Pomocna odpowiedź

Witam, otóż w trakcie pisania kodu, który pozwoli mi odpalać diody poprzez odpowiednie słowa w monitorze portu szeregowego dzieje się dziwna rzecz. Po wpisaniu słowa "czerwona" odpala mi się dioda czerwona na 1 sek i gaśnie i od razu zapala mi się dioda zielona mimo iż nie była wywoływana. Co więcej jej stan jest określony jako LOW więc nie mam pojęcia co może się dziać. Proszę o pomoc 🙂 

(edytowany)
#define czerwona 10
#define zielona 9

String odebraneDane = ""; //Pusty ciąg odebranych znaków

void setup() {
  Serial.begin(9600); //Rozpoczęcie komunikacji
  
  pinMode(zielona,OUTPUT); //Wyjscie
  pinMode(czerwona,OUTPUT);

  digitalWrite(zielona,LOW); //Zielona wyłączona
  digitalWrite(czerwona,LOW); //Czerwona wyłączona
}

void loop() {

  if(Serial.available() > 0) { //Czy arduino odebrało dane 
    //Jeśli tak to odczytujemy dane do końca lini
    odebraneDane = Serial.readStringUntil('\n');

    if(odebraneDane == "czerwona") {// Jesli odebrane słowo brzmi "czerwona"
    digitalWrite(czerwona,HIGH); //Zapal czerwoną diodę
    delay(1000); 
    digitalWrite(czerwona,LOW); //Zgas czerwoną diodę
    digitalWrite(zielona,LOW);
    }
    
    if(odebraneDane == "zielona"); {// Jeśli odebrane słowo brzmi "zielona"
    digitalWrite(zielona,HIGH); //Zapal zieloną diodę
    delay(1000); //Czekaj 1 sek
    digitalWrite(zielona,LOW); //Zgas zieloną diodę
    }
  }
}

 

Edytowano przez Gieneq
(edytowany)
1 godzinę temu, Bartroz napisał:

    if(odebraneDane == "zielona"); {// Jeśli odebrane słowo brzmi "zielona"

tutaj na końcu masz średnik, czyli ta instrukcja jest ignorowana

 

#define czerwona 10
#define zielona 9

String odebraneDane = ""; //Pusty ciąg odebranych znaków

void setup() {
  Serial.begin(9600); //Rozpoczęcie komunikacji
  
  pinMode(zielona,OUTPUT); //Wyjscie
  pinMode(czerwona,OUTPUT);

  digitalWrite(zielona,LOW); //Zielona wyłączona
  digitalWrite(czerwona,LOW); //Czerwona wyłączona
}

void loop() {

  if(Serial.available() > 0) { //Czy arduino odebrało dane 
    //Jeśli tak to odczytujemy dane do końca lini
    odebraneDane = Serial.readStringUntil('\n');

    if(odebraneDane == "czerwona") {// Jesli odebrane słowo brzmi "czerwona"
      digitalWrite(czerwona,HIGH); //Zapal czerwoną diodę
      delay(1000); 
      digitalWrite(czerwona,LOW); //Zgas czerwoną diodę
      digitalWrite(zielona,LOW);
    }
    
    if(odebraneDane == "zielona"); // Ignoruje tą instrukcję - by działało usuń średnik
    
    
    { // A to interpretuje jako zwykły blok kodu, który ma klamry dla ułatwienia czytelności
      digitalWrite(zielona,HIGH); //Zapal zieloną diodę
      delay(1000); //Czekaj 1 sek
      digitalWrite(zielona,LOW); //Zgas zieloną diodę
    }
  }
}

P.S. używaj opcji "Wstaw kod programu", łatwiej się czyta 😉 

Edytowano przez H1M4W4R1
  • Pomogłeś! 1

Dokładnie, jak kolega wyżej, wstawiłeś średnik przed klamra warunku i tu babol. I wszystko dzieje się jak piszesz, zapali się czerwona na 1s,zgasnie i potem zapali się zielona 😛

  • Lubię! 1
  • 4 tygodnie później...
(edytowany)

Ja zadanie z gwiazdką ugryzłem w taki sposób:

#define zielona 10 //definicja zielonej
#define zolta 11 //definicja żółtej
int stan_zielona = 0; //przypisanie stanów
int stan_zolta = 0; //przypisanie stanów
String daneW = "";  //pusty ciąg odebranych znaków

void setup() {
  Serial.begin(9600); //włącznie komunikacji
  pinMode(zolta, OUTPUT); //ustawienie output
  pinMode(zielona, OUTPUT); //ustawienie output

  digitalWrite(zolta, LOW); //ustawienie stanu wyjścia
  digitalWrite(zielona, LOW); //ustawienie stanu wyjścia
 
}

void loop() {
if(Serial.available() > 0) { // jeżeli coś odebrało
daneW = Serial.readStringUntil('\n'); 
  if(daneW == "ZIELONA") { //jeżeli wpisano zielona
    if(stan_zielona == 0) { //jeżeli stan zielonej jest zero czyli wyłączona
      digitalWrite(zielona, HIGH); //włącz diodę
      delay(1000);
      stan_zielona = 1; //zmień stan na włączone
      Serial.println("WŁĄCZONO ZIELONĄ"); //wyślij komunikat o włączeniu
    }
    else{ //jeżeli stan zielonej jest inny niż zero
     digitalWrite(zielona, LOW); //wyłącz diodę
      delay(1000);
      stan_zielona = 0; //zmień stan na wyłączone
      Serial.println("WYŁĄCZONO ZIELONĄ"); //wyślij komunikat o wyłączeniu
    }
    
  }

  if(daneW == "ZOLTA") {
    if(stan_zolta == 0) {
      digitalWrite(zolta, HIGH);
      delay(1000);
      stan_zolta = 1;
      Serial.println("WŁĄCZONO ŻÓŁTĄ");
    }
    else{
     digitalWrite(zolta, LOW);
      delay(1000);
      stan_zolta = 0;
      Serial.println("WYŁĄCZONO ŻÓŁTĄ");
    }

    
  }

  if(daneW != "ZIELONA" & daneW != "ZOLTA"){ //jeżeli wpisano cokolwiek innego niż zielona lub żółta
  Serial.println("NIEPOPRAWNY KOLOR"); //wyświetl komunikat
  
  }
}

else { //jeżeli nic nie wpisano pozostań w pustej pętli
}

}

 

Myślę że w przyszłości ogarnę lepsze rozwiązanie, ale to działa 🙂

Edytowano przez kuba663

Taka mala poprawka...w warunkach uzywamy podwojnego znaku ampersand czyli "&&"...co oznacza ze oba warunki maja byc spelnione...natomiast pojedynczy znak oznacza pobranie adresu zmiennej...

if(daneW != "ZIELONA" & daneW != "ZOLTA")  //zle!!
  
}

  if(daneW != "ZIELONA" && daneW != "ZOLTA")  //dobrze!!

(to tak tylko na marginesie😉)

(edytowany)

Ale nie trzeba mu było o tym mówić 🙂

Teraz biedny siedzi, czyta posty i wstydzi się odpowiedzieć... a to takie sprzeczne z PPF 😞

 

 

Edytowano przez ethanak
  • Lubię! 1
1 godzinę temu, ethanak napisał:

Jesteś tego pewien?

(to tylko tak na marginesie) 🙂

Alez Panie kolego @ethanak ...mi chodzilo tylko i wylacznie o uzycie tego znaku do "laczenia" warunkow...😉

 

1 godzinę temu, Krawi92 napisał:

Pobranie adresu, iloczyn bitowy 

Tak jest...jest mi ten znaczek juz dobrze znany w operacjach na bitach...😉

 

1 godzinę temu, ethanak napisał:

@Krawi92 to było pytanie do kolegi @farmaceuta 🙂 Spaliłeś 😞

 

E tam spalil...zycie mi uratowal!😂haha

 

1 godzinę temu, ethanak napisał:

Ale nie trzeba mu było o tym mówić 🙂

Teraz biedny siedzi, czyta posty i wstydzi się odpowiedzieć... a to takie sprzeczne z PPF 😞

Moja zwloka z odpowiedzia wynika z tego ze przylazl transport mebli do domu i ktos to musi skrecic...czyli wiadomo kto..🤕

Nie no na szczescie juz wiem  ze ampersandu uzywamy do pobrania adresu, operacje bitowe, "laczenie" warunkow...😉

#define green 8
#define red 9

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

void setup() {
  Serial.begin(9600); // Uruchomienie komunikacji
  pinMode(green, OUTPUT); //konfiguracja Wyjść
  pinMode(red, OUTPUT);

  digitalWrite(green, LOW); // wyłączamy diody
  digitalWrite(red,LOW);
}

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

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

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

ja mam mianowicie taki kod i działa mi tylko dioda czerwona przy wywołaniu w monitorze szeregowym , czy coś tu jest źle wpisane ?

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