Skocz do zawartości

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


Pomocna odpowiedź

34 minuty temu, Krawi92 napisał:

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

Zakladajac ze prxycisk ma wartosc 10...

if (digitalRead(10 == LOW)){

Jako argument podaje warunek ktory sie nie jest prawdziwy bo 10 nie jest rowne LOW (czyli 0) wiec rozwineie sie to do postaci

if (digitalRead(false)){

A nastepnie..

if (digitalRead(0))

Czyli chyba nie o to nam chodzilo...😉 no tak mi sie wydaje...

  • Lubię! 1
Link to post
Share on other sites

  

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

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

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

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

@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 🙂 

Link to post
Share on other sites

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

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

 

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

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.