Skocz do zawartości

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


Pomocna odpowiedź

@YURYS nie zauważyłem, że odpisałeś - wiadomość trafiła na nową kartę. 

Dobry pomysł z dodatkową zmienną 🙂 

23 godziny temu, YURYS napisał:

bool, jak i boolean, czy one automatycznie ustawiają się na początek na stan logiczny 0 czyli 0V, a potem zamieniają się między stanami logicznymi 0 i 1,

Zmienne deklarowane globalnie mają domyślnie wartość 0. Jak sprawdzisz kod źródłowy bibliotek Arduino albo poczytasz dokumentacje to zauważysz że bool i boolean to to samo (boolean jest aliasem boola). Lepiej używać typ bool, bo jest bardziej podstawowy i uniwersalny.

Druga sprawa to jak są zdefiniowane stany true i false? Przez wartosc niezerową i zero. Wiec domyślnie bool zmienna; ma wartość 0 czyli false. True może być nawet 127 - bool jest zapisany na 8 bitach (ale nie pamiętam czy ze znakiem...).

https://www.arduino.cc/reference/en/language/variables/data-types/boolean/

https://www.arduino.cc/reference/en/language/variables/data-types/bool/

https://www.arduino.cc/reference/en/language/variables/constants/constants/

image.thumb.png.353815427f5d41ba2b9e55d7b38c65af.png

Więc nawet warunek w pętli while(123) {} sprawi że będzie kręcić się w nieskończoność 🙂 

  • Lubię! 1
  • Pomogłeś! 1
Link to post
Share on other sites

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 🙂 

Link to post
Share on other sites
#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
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

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
Link to post
Share on other sites

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

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.