Skocz do zawartości

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


Pomocna odpowiedź

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
Link do komentarza
Share on other sites

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
Link do komentarza
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" 🙂

Link do komentarza
Share on other sites

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
Link do komentarza
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

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
Link do komentarza
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
Link do komentarza
Share on other sites

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
Link do komentarza
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) 

Link do komentarza
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 ???

Link do komentarza
Share on other sites

Dlaczego sądzisz że nie działa?

Przeanalizuj sobie, jak działa Twój program:

Jeśli odebrane dane to słowo "dioda", należy włączyć diodę i nadać zmiennej "stanDiody" wartość true (czyli 1). Owszem, zdarza się to wtedy, gdy wpisujesz do monitora serial słowo "dioda". Jak rozumiem, dioda się zapala.

Następnie jeśli liczba 8 równa się true należy wyłączyć diodę i nadać zmiennej "stanDiody" wartość false (czyli 0). Taka sytuacja nigdy nie zachodzi, gdyż true to inaczej 1, a rzadko się zdarza aby osiem było równe jeden. Jak rozumiem dioda nie gaśnie.

Już wiesz jaki błąd popełniłeś?

Teraz jeśli go poprawisz zauważysz, że przestanie działać pierwszy if... ale o tym porozmawiamy jak poprawisz.

 

Edytowano przez ethanak
  • Lubię! 1
Link do komentarza
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...

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.