Skocz do zawartości

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


Pomocna odpowiedź

(edytowany)

  

1 godzinę temu, Krawi92 napisał:

dla mnie nie ma żadnej różnicy w działaniu

No cóż...

Wyobraź sobie, dwa działania: a*b  i a+b. Załóżmy, że między nimi nie ma żadnej różnicy.

Sprawdźmy:

2*2 to 4

2+2 to 4

A więc nie ma różnicy między dodawaniem i mnożeniem?

 

Edytowano przez ethanak
  • Lubię! 1
(edytowany)

Dziękuje za objaśnienie farmaceuta, teraz wiem dlaczego jeżeli zastosuje pierwsza wersje kodu, to nie do końca wszystko działa.

Edytowano przez Mateo
  • Lubię! 1
(edytowany)

Jeśli w stawie średnik w linijce kodu, (który jest poniżej) pomiędzy nawias okrągły, a nawias rozpoczynający pętle

to gdy jest średnik Serial.println z ostatniego "else" jest wysyłany w nieskończoność w monitorze portu szeregowego

a jeśli go nie ma to wszystko działa ok, czyli czeka na odbiór jakiś danych i dopiero po odbiorze jest wyświetlana wiadomość.

Chciałbym się dowiedzieć co zmienia ten średnik w tym miejscu, z góry dzięki za odpowiedź.

 

if (Serial.available() > 0) {

 

a tu cały kod

#define zielona  8 
#define niebieska  9 
boolean ONzielona = 0;
boolean ONniebieska = 0;
String dane = "";
void setup() {
pinMode(zielona, OUTPUT);
pinMode(niebieska, OUTPUT);
digitalWrite(zielona, LOW);
digitalWrite(niebieska, LOW);
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
dane = Serial.readStringUntil('\n');
if(dane == "zielona"){
  ONzielona =! ONzielona;
  digitalWrite(zielona, ONzielona);
}else if (dane == "niebieska"){
  ONniebieska =! ONniebieska;
  digitalWrite(niebieska, ONniebieska);
}else{
  Serial.println("nie ma takiej diody");
  

   }
  }
 
}//koniec pentli loop

 

Edytowano przez Mateo
25 minut temu, Mateo napisał:

Chciałbym się dowiedzieć co zmienia ten średnik w tym miejscu, z góry dzięki za odpowied

Srednik ma za zadanie poinformowanie kompilatora gdzie konczy sie rozkaz...jesli nie dasz srednika to ten pierwszy if jest polaczony z blokiem kodu w nawiasach klamrowych...jesli go dasz to jak bys odcial sie od tego kodu i on zostaje wykonany bez wzgledu na if bo nie jest z nim polaczony...

  • Pomogłeś! 1
  • 2 tygodnie później...

Witajcie,

w końcu po kilku dniach się udało 🙂 🙂 . Połączyłem zadanie 2.4 i 2.5. Poniżej mój kod:

#define zielona 8 
#define czerwona 9

String odebraneDane = "";


boolean wlaczonaZielona = LOW; //deklaracja stanu diody zielonej w zmiennej boolean
boolean wlaczonaCzerwona = LOW; //deklaracja stanu diody czerwonej w zmiennej boolean
void setup() 
{
Serial.begin(9600);
while(!Serial); //konieczne do Arduino Leonardo, sprawdzenie portu
pinMode(zielona, OUTPUT); //stan pinu dioda zielona
pinMode(czerwona, OUTPUT); //stan pinu dioda czerwona

digitalWrite(zielona, LOW); //dioda zielona off, musi być zgodne z deklaracją zmiennej boolean
digitalWrite(czerwona, LOW); //dioda czerwona off, musi być zgodne z deklaracją zmiennej boolean
}

void loop() 
{
if(Serial.available() > 0) //sprawdzenie onecności danych na wyjściu z portu szeregowego
{
  odebraneDane = Serial.readStringUntil('\n'); //przypisanie danych do zmiennej

  if (odebraneDane == "zielona") //pętla warunkowa
  {
    delay(200); 
    wlaczonaZielona = !wlaczonaZielona; //przypisanie stanu przeciwnego dla zmiennej bolean
    digitalWrite(zielona, wlaczonaZielona); //stan diody zgodnie ze zmienną ON/OFF
  }

  if (odebraneDane == "czerwona") //analogicznie jak dla zielonej
  {
    delay(200);
    wlaczonaCzerwona = !wlaczonaCzerwona;
    digitalWrite(czerwona, wlaczonaCzerwona);
  }

  if (odebraneDane != "zielona" && odebraneDane != "czerwona") //sprawdzenie poprawności wpisanych danych
  {
    Serial.println("Wpisz prawidłowy kolor diody");
  }
}
}

 

  • Lubię! 1

@pgoreczny supr, faktycznie obie części w jednym.

Mała sugestia:

8 godzin temu, pgoreczny napisał:

if (odebraneDane != "zielona" && odebraneDane != "czerwona")

to możesz zrobić blokiem else, wtedy to:

8 godzin temu, pgoreczny napisał:

if (odebraneDane == "czerwona")

wymaga zmiany na else if

A tak to super, powodzenia w kolejnych zadaniach 🙂 

  • 2 tygodnie później...
(edytowany)

Cześć! 

Wracam po długiej przerwie nadrabiając zaległości. 

Program działa, diody się przełączają, ale wywala błąd o kolorze diody pomimo, że wpisuje poprawnie - dla zielonej diody. 

Walczyłem z 30min z nawiasami i chyba dalej czegoś nie kumam.

@Treker Gorąca prośba o pomoc. Pytanie czy wogóle pomysł ma jakiś sens. Specjalnie nie chciałem korzystać z łączonego warunku tylko zrozumieć idee nawiasów i zapisu. 

#define zielona 8
#define czerwona 9
bool stanzielonej = false;
bool stanczerwonej = false;
String odebraneDane = ""; //pusty ciag danych

void setup(){
  Serial.begin(9600);
  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW);
  digitalWrite(czerwona, LOW);
  
}
void loop() {
    if(Serial.available() > 0){ //czy arduino odebrało dane
    odebraneDane = Serial.readStringUntil('\n'); //jeśli tak to odczytaj je do końca linii
      if (odebraneDane == "zielona"){
        delay(200);
        if (stanzielonej == false){
        digitalWrite(zielona, HIGH);
        stanzielonej = true;
        } 
        else {
        digitalWrite(zielona, LOW);
        stanzielonej = false;
        }
      }
      if (odebraneDane == "czerwona"){
       delay(200);
       if (stanczerwonej == false){
       digitalWrite(czerwona, HIGH);
       stanczerwonej = true;
       }
       else {
        digitalWrite(czerwona, LOW);
        stanczerwonej = false;
       }
      }
    
        else {
          Serial.println("błęny kolor diody");
        }
    }
}

 

Edytowano przez LuigiSu
12 minut temu, LuigiSu napisał:

Walczyłem z 30min z nawiasami i chyba dalej czegoś nie kumam

Jest zle podpiety ten else...jest podpiety pod if "czerwony" tylko...czyli jesli pojawi sie "zielony" to tamten else z bledem sie wykona...

(edytowany)
#define zielona 8
#define czerwona 9
bool stanzielonej = false;
bool stanczerwonej = false;
String odebraneDane = ""; //pusty ciag danych

void setup(){
  Serial.begin(9600);
  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW);
  digitalWrite(czerwona, LOW);
  
}
void loop() {
    if(Serial.available() > 0){ //czy arduino odebrało dane
    odebraneDane = Serial.readStringUntil('\n'); //jeśli tak to odczytaj je do końca linii
      if (odebraneDane == "zielona"){
        delay(200);
        if (stanzielonej == false){
        digitalWrite(zielona, HIGH);
        stanzielonej = true;
        } 
        else {
        digitalWrite(zielona, LOW);
        stanzielonej = false;
        }
      }
      if (odebraneDane == "czerwona"){
       delay(200);
       if (stanzielonej == false){
       digitalWrite(czerwona, HIGH);
       stanzielonej = true;
       }
       else {
        digitalWrite(czerwona, LOW);
        stanczerwonej = false;
       }
      } 
       if (odebraneDane != "czerwona" && odebraneDane != "zielona") {
        Serial.println("bledny kolor diody");
    }
     }
}

Cos takiego powinno dzialac jak chcesz...

Edytowano przez farmaceuta
5 minut temu, farmaceuta napisał:

define zielona 8
#define czerwona 9
bool stanzielonej = false;
bool stanczerwonej = false;
String odebraneDane = ""; //pusty ciag danych

void setup(){
  Serial.begin(9600);
  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW);
  digitalWrite(czerwona, LOW);
  
}
void loop() {
    if(Serial.available() > 0){ //czy arduino odebrało dane
    odebraneDane = Serial.readStringUntil('\n'); //jeśli tak to odczytaj je do końca linii
      if (odebraneDane == "zielona"){
        delay(200);
        if (stanzielonej == false){
        digitalWrite(zielona, HIGH);
        stanzielonej = true;
        } 
        else {
        digitalWrite(zielona, LOW);
        stanzielonej = false;
        }
      }
      if (odebraneDane == "czerwona"){
       delay(200);
       if (stanzielonej == false){
       digitalWrite(czerwona, HIGH);
       stanzielonej = true;
       }
       else {
        digitalWrite(czerwona, LOW);
        stanczerwonej = false;
       }
      } 
       if (odebraneDane != "czerwona" && odebraneDane != "zielona") {
        Serial.println("błęny kolor diody");
    }
     }
}

Cos takiego powinno dzialac jak chcesz...

Ano właśnie, tu mam zagwozdkę ponieważ konsola mi pokzuje zamknięcie nawiasów jakby "blok zielony" kończył się na

stanzielonej = false;
        }

stanzielonej = false;
        }

Tylko dlaczego wykonuje w takim razie else wykonuje się pomimo spełnienia pierwszego warunku. 

Tak jak wspomniałem, chciałem nie używać póki co podwójnego warunku ale zakręciłem go jeszcze inaczej. Teraz śmiga. 

Ps. Szacun, zacząłeś już odpowiadać zanim się zorientowałem że miałem błąd w kodzie i zacytowałeś jeszcze poprzedni 😄 

#define zielona 8
#define czerwona 9
bool stanzielonej = false;
bool stanczerwonej = false;
String odebraneDane = ""; //pusty ciag danych

void setup(){
  Serial.begin(9600);
  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW);
  digitalWrite(czerwona, LOW);
  
}
void loop() {
    if(Serial.available() > 0){ //czy arduino odebrało dane
    odebraneDane = Serial.readStringUntil('\n'); //jeśli tak to odczytaj je do końca linii
      if (odebraneDane == "zielona"){
        delay(200);
        if (stanzielonej == false){
        digitalWrite(zielona, HIGH);
        stanzielonej = true;
        } 
        else {
        digitalWrite(zielona, LOW);
        stanzielonej = false;
        }
      }
        else {
          if (odebraneDane == "czerwona"){
          delay(200);
          if (stanczerwonej == false){
          digitalWrite(czerwona, HIGH);
          stanczerwonej = true;
          }
          else {
          digitalWrite(czerwona, LOW);
          stanczerwonej = false;
          }
          } else {
            Serial.println("błęny kolor diody");
            }
        }
    } 
}

 

7 minut temu, LuigiSu napisał:

Tylko dlaczego wykonuje w takim razie else wykonuje się pomimo spełnienia pierwszego warunku.

bo else bylo podpiete pod drugi warunek ktory sie nie spelnia jesli pierwszy warunek jest prawda wiec automatycznie pierwszy if i else sie wykonaja... poza tym kod tory zrobiles teraz moze i sie wykonuje ale mozesz uzyc warunku else if...bedzie bardziej czytelny, ale to ta na marginesie..wazne ze dziala😉

  • Lubię! 1
Dnia 25.10.2021 o 08:34, Gieneq napisał:

to dobry sposób, a nawet jest lepszy:


digitalWrite(!digitalRead(pin), pin);

lepszy będzie, jak się zamieni miejscami argumenty funkcji digitalWrite() 😜

  • 4 tygodnie później...

Część, napisałem ten program, że jak przycisk jest wciśnięty (okno zamknięte) to świeci się zielona dioda, a jak nie to czerwona i na monitorze pokazuje się "Uwaga, okno jest otwarte". 

Z tego co rozumiem, by ten tekst nie pokazywał się non stop, trzeba wstawić "while" w taki sposób, by zablokować programowi przejście do następnego zadania (żeby się zatrzymał na tym nie wykonanym warunku while, i nie krążył w kółko i nie pisał tysiąc razy "uwaga....").

Zatem, jeśli się nie mylę, warunkiem tego while ma być coś co nie jest spełnione. 

Moje pytanie brzmi, dlaczego w takim razie, w tym warunku jest napisane, "kiedy digitalRead == HIGH"?

Jeśli to się ma pokazywać, kiedy przycisk nie jest wciśnięty, to wtedy na tym wyjściu jest HIGH i warunek jest spełniony więc program powinien iść dalej, a nie zatrzymać się. 

Dla mnie bardziej logiczne wydaje się żeby w tym warunku było "LOW", no bo skoro gdy nie jest wciśnięty jest na wyjściu HIGH, to warunek nie jest spełniony i program powinien się zatrzymać.

Zatem dlaczego działa z HIGH, a nie z LOW?

Ciężko to wytłumaczyć, ale mam nadzieję, że zdjęcie programu pomoże...

IMG_20211229_192650.jpg

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