Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Witam

Też nie miałem styczności z programowaniem, tylko z kursem elektroniki 1 i 2 oraz kurs techniki cyfrowej. Nie wiem jak inni napisali to zadanie z gwiazdką (oprócz użytkownika Wnuczus), ale ja napisałem w ten sposób (bez &&) i działa, może to będzie dla Pana zrozumiałe? (od laika)

String odebraneDane = "";
boolean czerwona = false;
boolean zielona = false;

void setup () {
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

void loop (){
 if(Serial.available() > 0)
 {
 odebraneDane = Serial.readStringUntil('\n');
  if (odebraneDane == "zielona")
  {   
   if (zielona == false)
     {
       digitalWrite(8, HIGH);
       boolean (zielona = true);   
     }
  else
     {
     digitalWrite(8, LOW);
     boolean (zielona = false);
     }
  }

     
  if (odebraneDane == "czerwona")
  {
   if (czerwona == true)
     {
       digitalWrite(9, LOW);
       boolean (czerwona = false);   
     }
  else
     {
     digitalWrite(9, HIGH);
       boolean (czerwona = true);
     }
  }
 }
}

Później przeczytałem kod "Wnuczus" i spróbowałem napisać podobny:

String odebraneDane = "";


void setup () {
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

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

     
   if (digitalRead(9) == LOW && odebraneDane == "czerwona")
  {   
       digitalWrite(9, HIGH);
  }
  else
   {  
     digitalWrite(9, LOW);
    }
  }
}
    

też działa.

Ale nie używam #define, bo nie ogarniam tego:)

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
9 godzin temu, radekwrc napisał:

Ale nie używam #define, bo nie ogarniam tego:)

@radekwrc #define to nic trudnego 😉 Kojarzysz funkcję Znajdź i zamień z dowolnego edytora tekstowego? To działa praktycznie identycznie. Kompilator wyszukuje konkretnego słowa w kodzie programu i podmienia je na wartość, którą zadeklarowałeś w #define. Czyli w praktyce poniższy kod można sobie tłumaczyć jako znajdź wszystkie wystąpienia słowa "LEDPIN" i zamień je na "13" 🙂

#define LEDPIN 13

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dziękuję za odpowiedzi i zainteresowanie się tematem. Zanim przeczytałem komentarze rozwiązanie zadania 2.4 zarobiłem na zasadzie dodania jednej linijki kodu

#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 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 == "zielona") { //Jeśli odebrano słowo "zielona"
      digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(zielona, LOW); 
    }
     if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
      digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
      delay(1000);
      digitalWrite(czerwona, LOW);
    }else{
   Serial.println("Zły wybór"); 
    }
   }
  }

No i wiadomo że to nie działało tak jak powinno, i od tego się zaczęło.  W moim rozumieniu jeżeli stosujemy "else " to program w nim zawarty wykonuje się w wypadku, gdy powyższe warunki ( czyli 2 wcześniejsze "if-y") nie są spęłnione. Nie mogę zrozumieć dla czego przy wpisaniu "czerwona" ,  zapala się dioda , ale odrazy mam komunikat "Zły wybór". Do  zadania 2.5* nawet zaczynałem pisać bo zupełna pustka w głowie jak się do tego zabrać nie ogarniając nawet prostszych rzeczy😨 

 

 

Edytowano przez Vova

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, Vova napisał:

Nie mogę zrozumieć dla czego przy wpisaniu "czerwona" ,  zapala się dioda , ale odrazy mam komunikat "Zły wybór".

@Vova, z całości wpisu nie do końca rozumiem czy to już Ci działa. Z tego cytatu powyżej rozumiem, że problem nadal nie jest rozwiązany i program nie działa jak powinien? Jeśli ten kod, który wrzuciłeś jest rozwiązaniem zadania 2.4 to jest błędny, już mówię dlaczego. Konstrukcja if...else… działa w ten sposób, że jeśli spełniony jest warunek to wykonywany jest fragment pod "if (...)" w nawiasach { }. Bloku else nie trzeba dodawać (wówczas przy braku spełnienia warunku nic się nie dzieje). Jeśli jednak jest dodany to przy niespełnieniu warunku w ifie będzie wykonany ten fragment kodu w { } pod else.

Zatem kod, który wstawiłeś działać powinien źle, gdy odebraneDane == "zielona". Przy "czerwona" powinien działać dobrze, zapalić czerwoną i nic więcej nie robić. W tym złym przypadku program:
1. Najpierw sprawdza pierwszego ifa. Skoro spełniony (zakładam teraz, że tak) to wykonuje ten fragment kodu (zapala zielonego LEDa).
2. Sprawdza drugiego ifa, skoro tamten był spełniony, bo == "zielona" to znaczy, że ten drugi if nie jest spełniony. Zatem nie jest wykonany fragment kodu, który zapala czerwonego LEDa, ale w tym ifie już masz blok else, więc on się wykona (bo odebraneDane nie jest == "czerwona"). A w nim jest wysłanie komunikatu "Zły wybór" 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
2 godziny temu, Vova napisał:

No i wiadomo że to nie działało tak jak powinno, i od tego się zaczęło.  W moim rozumieniu jeżeli stosujemy "else " to program w nim zawarty wykonuje się w wypadku, gdy powyższe warunki ( czyli 2 wcześniejsze "if-y") nie są spęłnione.

Teraz w twoim programie pierwszy blok "if" i drugi blok "if-else" działają osobno. Jeśli chcesz, żeby ostatni else odnosił się do poprzednich "if-ów" wystarczy, że dopiszesz do drugiego warunku dodatkowe else:

if(warunek1) {
}
else if(warunek2) {
}
else {
  //teraz twój else zadziała, jeśli oba wcześniejsze warunki nie zostaną spełnione
}

 

Edytowano przez Shog

Udostępnij ten post


Link to post
Share on other sites

Bhoy67. Tak, masz racje. Działa źle przy wpisaniu "zielona". pomyliłem się. 

Udostępnij ten post


Link to post
Share on other sites

No to odpowiedź jak to rozwiązać masz już podaną pod moim postem 🙂 Ja w swoim poprzednim nie chciałem od razu podawać gotowca 😄

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Bhoy67  Stwierdziłem, że skoro w kursie o składni "else if" nie było do tej pory mowy, to lepiej podać gotowca. @Vova wiedział co chce zrobić, brakowało mu jedynie tego narzędzia 🙂

Edytowano przez Shog

Udostępnij ten post


Link to post
Share on other sites

@Shog, spoko, nie przyczepiłem się 🙂 Raczej tłumaczyłem się za siebie czemu tego nie napisałem wcześniej 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Witam. Pokażcie mi, proszę, błędy w poniższym kodzie

#define zielona 8

String odebraneDane = ""; //Pusty ciąg odebranych dan  
boolean zielona = false
 
void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(zielona, OUTPUT); //Konfiguracja wyjść
  digitalWrite(zielona, LOW); //Wyłączamy diody
}
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 == "zielona") { //Jeśli odebrano słowo "zielona"
      if (zielona == false) // Jeżeli zielona w stanie niskim
      digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
      boolean zielona = true // Zapisujemy stan zielonej
    }else{
      digitalWrite(zielona, LOW); // W przeciwnym wypadku wyłączamy diode
      boolean zielona = false // zapisujemy stan diody
    }
   }
 }

961216241_Beztytuu.thumb.png.66606c06dadb408fc3315f9d9b456b50.png

Często przy moich próbach  pojawia się ten sam błąd i podświetlona jedna z pierwszych linijek kodu. A jak usune spacje między "zelona" i "8" to już nie jest podświetlona. O co tu chodzi?

Ten kod to miało być rozwiązanie zadania 2.5* na wzór kolegi  " radekwrc" ( chyba właśnie w tym rozwiązaniu zobaczyłem jakieś światełko w tunelu) tylko że z jedną diodą.

Edytowano przez Vova

Udostępnij ten post


Link to post
Share on other sites

Ależ proszę.

#define zielona 8
boolean zielona = false

Co to ma znaczyć?

Pierwsza linijka oznacza, że w całym programie trzeba zamienić ciąg znaków "zielona" na "8". Dlatego też drugą linijkę kompilator zobaczy jako:

boleean 8 = false

Pomijając brak średnika na końcu... nie uważasz, że nie ma to większego sensu?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Vova napisz własnymi słowami jak rozumiałeś ten fragment, który zacytował wyżej @ethanak - łatwiej będzie nam zrozumieć Twój tok rozumowania i naprowadzimy Cie na właściwe tory 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Pierwsza linijke rozumiem że jak mam  "#define zielona 8"  to w dalszej cześci programu wpisując "zielona" program odczytuje to jak "pin 8"

Drugą linijką " boolean zielona = false " w globalnych zmiennych deklarujemy stan "zielonej" (czyli pinu 8 ) jako niski... A czy ma to sens? Sam nie miałem pomysłu  w jaki sposób wykorzystać zmienną " boolean" . Żadnych przykładów wyżej nie widziałem. Podejrzałem kod wstawiony przez kolegę " radekwrc", wydawało mi się że zaczynam coś z tego rozumieć i skoro u niego działa . . .

  Do czwartej części tego kursu chyba nie dotrę 😕 

Edytowano przez Vova

Udostępnij ten post


Link to post
Share on other sites

"zielona" nie może przyjąć żadnego stanu, bo w tym przypadku jest tylko ciągiem znaków, na który program podmienia cyfrę 8 jeśli znajdzie ja w programie. Musisz określić dodatkową zmienną, o innej "nazwie", na przykład boolean stan_zielonej = true / false. I wtedy możesz określać stan Led za pomocą tej zmiennej na przykład w taki sposób:

 

digitalWrite(zielona, stan_zielonej);

Program zrozumie to tak: "zielona" zamieni na 8, stan_zielonej natomiast na true lub false (w praktyce w kolejności HIGH lub LOW) 

Udostępnij ten post


Link to post
Share on other sites
#define dioda 8
String odebraneDane = ""; // Pusty ciąg odebranych danych
boolean stanDiody = false; // Przypisanie zielonej stanu

void setup() {
  Serial.begin(9600); // Uruchomienie komunikacji
  pinMode(dioda,OUTPUT); // Konfiguracja wyjścia

  digitalWrite(dioda, LOW); //Dioda w stanie niskim
}

void loop() {
  if(Serial.available() > 0) { // Czy Arduino odebrało dane
    //Jeśli tak, odczytujemy je doznaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n');
    if (odebraneDane == "dioda") { //Jeśli wpisane "dioda"
    digitalWrite(dioda, true); //Wlączamy diode 
    boolean stanDiody = true; // Przypisujemy stan diody wysoki
    }
    if (dioda == true){  //Jeżeeli stan diody wysoki
    digitalWrite(dioda, false); //Wylączamy diode
    boolean stanDiody = false; // Przypisujemy stan diody niski
   }
 }
}

Działa tylko pierwszy if ???

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!

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