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

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

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😉)

Link to post
Share on other sites

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

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.