Skocz do zawartości
Komentator

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

Pomocna odpowiedź

@miki61  Witamy na forum i dziękujemy za zwrócenie uwagi.

Dnia 12.07.2019 o 16:48, miki61 napisał:

 'zmienna3' jest bez int ? 

Jest to błąd, zmienna powinna mieć swój typ. 

Dnia 12.07.2019 o 16:48, miki61 napisał:

2.4. z instrukcja return(0)

Twoje rozwiązanie działa, super! Tylko może pomyśl jeszcze jak zrobić, żeby po niepoprawnym podaniu danych program wskazał błąd i umożliwił wprowadzenie ich jeszcze raz. Jak wpisuje się hasło na jakiejś stronie to zazwyczaj po pierwszej nieudanej próbie strona się nie zamyka 😄

I taka drobna uwaga, to akurat nie ma wpływu na logikę tego rozwiązania ale w przypadku, gdy mamy kilka warunków i jeden domyślny (taki który spełni się gdy poprzednie warunki nie spełniły się) to dobrze jest stosować konstrukcję if / else if / else. Nie ma jej w tej części kursu, dlatego nie jest to błąd, ale warto się z tym zapoznać. Oznacza to, że w Twoim kodzie mógłbyś zamienić w warunku dla czerwonej diody  if na else if. W ten sposób te 3 warunki będą tworzyć jeden blok warunkowy.

Jakie to ma znaczenie? W działaniu tego kodu żadne, ale możesz spotkać się z sytuacją, że dany "else" nie jest wrażliwy na poprzednie warunki. Bo w twoim przypadku pierwszy if nie ma wpływu na działanie ostatniego else. Wpływ na else ma tylko if przy czerwonej diodzie. Można to zinterpretować tak: Jeżeli kolor zielony to zrób to. (logiczna przerwa). Jeżeli kolor czerwony to zrób tamto, ale jeżeli kolor inny (czyli inny niż czerwony) to zrób coś innego. Zaś w bloku else if dla warunku else byśmy to odczytali jako: Jeżeli kolor nie jest ani czerwony ani zielony to zrób to.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@miki61 gratuluję czujności - brakujący typ zmiennej został dodany 😉

Udostępnij ten post


Link to post
Share on other sites

Nie wiedziałem jak sobie poradzić ze zmienną boolean więc zrobiłem zadanie na inny sposób i działa

#define red 5  
#define blue 6
#define green 7  //przypisanie diod
#define button 4  //przypisanie przycisku

String kolor = "";  //wprowaniedze zmiennej String
void setup() {

  pinMode(red,OUTPUT);  
  pinMode(blue,OUTPUT);
  pinMode(green,OUTPUT);  //diody na wyjscie

  digitalWrite(red,LOW);
  digitalWrite(blue,LOW);
  digitalWrite(green,LOW);  //WYLACZAMY DIODY

  Serial.begin(9600); //ustawienie predkosci transmisji
  Serial.println("która dioda ma zostać zmieniona?"); //pytamy o cel
}

void loop() {

  if(Serial.available()>0){  //jesli odebrane dane sa wieksze od 0
    kolor = Serial.readStringUntil('\n');  //przypisz odebrane dane zmiennej kolor 

   if(kolor == "red"){
    if(digitalRead(red)==HIGH){
      digitalWrite(red,LOW);
    }else{
      digitalWrite(red,HIGH);
    }
   }else{
    if(kolor=="blue"){
      if(digitalRead(blue)==HIGH){
        digitalWrite(blue,LOW);
      }else{
        digitalWrite(blue,HIGH);
      }
    }else{
      if(kolor=="green"){
        if(digitalRead(green)==HIGH){
          digitalWrite(green,LOW);
        }else{
          digitalWrite(green,HIGH);
        }
      }else{
        Serial.println("zła komenda");
      }
    }
   }
    


  }
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
#define zielona 9
#define czerwona 8
String odebraneDane = "";
boolean zielonaLow = true;
boolean czerwonaLow = true;
void setup() {
  Serial.begin(9600); // uruchomienie komunikacji
  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');
    // Serial.println("Witaj " + odebraneDane + "!");
    if (odebraneDane == "zielona" && zielonaLow == true) {

      digitalWrite(zielona, HIGH);
      zielonaLow = false;
      
    } else  if (odebraneDane == "zielona" && zielonaLow == false) {
      digitalWrite(zielona, LOW);
      zielonaLow = true;
      
    } else    if (odebraneDane == "czerwona" && zielonaLow == true) {
      digitalWrite(czerwona, HIGH);
      czerwonaLow = false;

    } else    if (odebraneDane == "czerwona" && zielonaLow == false) {
      digitalWrite(czerwona, LOW);
      czerwonaLow = true;

    } else {
      Serial.println("Błędny kolor");
    }

  }
}

Czy w dalszej części kursu jest poruszany temat innych IDE niż ten od Arduino?

Ja do tej pory próbowałem dwóch(PlaftormIO w Atomie, oraz Eclipse), w tym pierwszym miałem cały czas problemy z kompilacja. Natomiast w Eclipsie miałem problem z terminalem i wprowadzaniem danych. 

1. Terminal nie pokazywał  tekstu w momencie gdy go pisałem.

2. Terminal przyjmował dane zaraz po tym jak przestałem pisać, zanim nacisnąłem enter.

Fajnie by było jak by wątek o różnych IDE był poruszony 🙂

 

Jak zwykle bardzo ciekawa lekcja!. Chociaż powiem szczerze, że nie wiem czy udało by mi się wykonać zadanie 2.5 bez szukania przykładów zastosowania boolean, gdyby nie to, że jakiś czas temu uczyłem się troszkę Javy :P. 

Ps. W opisie zadania 2.5 jest napisane " Podpowiedź: koniecznie użyj dodatkowych zmiennych typu bool, które będą pamiętały aktualny stan diod."

Ten "bool" to zamierzony ?:)

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@wariatdrogowy witam na forum 🙂 Tak, w taki sposób też można to rozwiązać. Warto jednak popróbować wersji ze zmiennymi typu boolean - to nic strasznego 😉

@Rakragul jeśli chodzi o inne IDE to opisywaliśmy właśnie to, które już znasz: PlatformIO – alternatywne środowisko dla Arduino IDE. Jeśli masz problemy z terminalem, to możesz też testowo sprawdzić innego programy tego typu: 4 alternatywy dla monitora portu szeregowego Arduino.

6 godzin temu, Rakragul napisał:

Ten "bool" to zamierzony ?:)

Tak, bo to jedno i to samo 😉 Cytując z dokumentacji Arduino: boolean is a non-standard type alias for bool defined by Arduino. It’s recommended to instead use the standard type bool, which is identical.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

2.5 

Troszkę myslałem ponieważ chciałem wykonać to na 2 if'ach oraz else i nie chciało mi wyjść i ciągle był komunikat o wybranym złym kolorze to poszukałem i po skorzystaniu z instrukcji if else działa bardzo ładnie. Kod poniżej:

#define green 8
#define red 9
#define yellow 10

String odebraneDane = ""; //Pusty ciąg odebranych danych
 
void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(green , OUTPUT); //Konfiguracja wyjść
  pinMode(red , OUTPUT);
  pinMode(yellow, OUTPUT);
  
  digitalWrite(green, LOW); //Wyłączamy diody
  digitalWrite(red, LOW);
  digitalWrite(yellow, 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 == "green") { //Jeśli odebrano słowo "zielona"
      digitalWrite(green, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(green, LOW); 
    }
    else if (odebraneDane == "yellow") {
      digitalWrite(yellow, HIGH);
      delay(1000);
      digitalWrite(yellow, LOW);
    }
    else if (odebraneDane == "red") { //Jeśli odebrano słowo "czerwona"
      digitalWrite(red, HIGH); //To włączamy diodę czerwoną
      delay(1000);  //turn off led after 1 sec
      digitalWrite(red, LOW); 
    }
 
     else 
   Serial.println("You can choose only green, red and yellow");
    
   }
   
  }


 

Udostępnij ten post


Link to post
Share on other sites

@Kuba2053 witam na forum 🙂 Jeśli działa to super! Polecam tylko poświęcić jeszcze chwilę na dopracowanie formatowania kodu. Zerknij na ten fragment:

    }
 
     else 
   Serial.println("You can choose only green, red and yellow");
    
   }
   
  }

Trochę ciężko połapać się do czego właściwie jest ten else 😉

Ogólnie, zamiast takiej konstrukcji:

    }
    else if (odebraneDane == "red") { 

bezpieczniej byłoby pisać tak:

    } else if (odebraneDane == "red") { 

Wtedy minimalizujesz szansę "wstrzelenia" jakiegoś kodu między nawias i słowo kluczowe else 😉

Udostępnij ten post


Link to post
Share on other sites

@Treker nie przesadzaj - jest to jeden z dopuszczalnych styli formatowania kodu.

Niestety - stary dobry "indent" niespecjalnie sobie radzi z C++, ale warto się z nim zapoznać (a przynajmniej przepuścić swój kod w C przez indenta i zobaczyć, co mu wyjdzie przy różnych standardowych ustawieniach).

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Oczywiście,  jest to dopuszczalny format, ale w kursach trzymałem się zaproponowanego standardu i patrząc na ogół kodu, mam jednak wrażenie, że to przejście do nowej linii to przypadek, a nie świadome stosowanie innej konwencji 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Tak rozumiem, robiłem kilka razy bo nie chciało wyjść, póżniej zastosowałem 3 diody i pomimo że było (teoretycznie) wszystko tak jak teraz to wyskakiwał błąd więc napisałem jeszcze raz i działało 😄  wiem że warto się trzymać ogólnoprzyjętych zasad ale jak poprawiałem to kolejny raz to już z lenistwa nie korygowałem tego a wiadomo najlepiej sprawdzić jak działa w praktyce 😄

 

Jeżeli chodzi o zdanie z wykorzystaniem algebry boolea to można to zrobić przy użyciu bramki AND ale czy jest możliwośc aby wykorzystać w kodzie zmienną np. "logika"

if (odebraneDane == "green") { //Jeśli odebrano słowo "green"          digitalWrite(green, logika); }

czy jest szansa zrobić to tym sposobem żeby po wpisaniu słowa green zmienna logika zmieniała swoją wartośc z 1 na 0, 0 na 1?

Edytowano przez Kuba2053
  • Lubię! 1

Udostępnij ten post


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!

Gość
Napisz odpowiedź...

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