Skocz do zawartości

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


Pomocna odpowiedź

OK - nie wiedziałem, że autorzy Arduino IDE doszli już do tego, że napisanie "&&" może być zbyt trudne... fakt, zacofany trochę jestem.

Co nie znaczy, że Twój kod ma jakikolwiek sens. Zdanie "ciotkę parowozu przetaczać po sznyclach" jest całkiem poprawne gramatycznie, prawda?

  • 1 miesiąc później...

Witam. Mam pytanie, jeżeli sprawdzam czy Arduino otrzymało dane za pomocą:

if (Serial.available() > 0);

To rozumiem, że dane wysyłane są do płytki dopiero po naciśnięciu przycisku "Wyślij" w terminalu, a nie podczas wpisywania. Mam rację? Jeśli tak, to czemu w terminalu zaraz po wgraniu programu wyświetla mi się "Zła komenda" co sekundę? Poniżej mój kod:

#define red 8
#define green 9

String komenda = "";

void setup() {
  Serial.begin(9600);
  pinMode(red, OUTPUT);
  pinMode(green, OUTPUT);

  digitalWrite(red, LOW);
  digitalWrite(green, LOW);
  }

void loop() {

  if (Serial.available() > 0); {
  komenda = Serial.readStringUntil('\n');

  if (komenda == "zielona") {
    digitalWrite(green, HIGH);
    delay(500);
    digitalWrite(green, LOW); }
 else if (komenda == "czerwona") {
    digitalWrite(red, HIGH);
    delay(500);
    digitalWrite(red, LOW); } 
  else {
    Serial.println("Zła komenda!");
  }
 }
}

 

01.PNG

@emilzazaza, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

1 godzinę temu, emilzazaza napisał:

To rozumiem, że dane wysyłane są do płytki dopiero po naciśnięciu przycisku "Wyślij" w terminalu, a nie podczas wpisywania. Mam rację?

Tak, masz rację, ale w Twoim programie jest błąd. Między warunek, a nawias klamrowy wstrzeliłeś sobie średnik. To sprawia, że warunek właściwie nic nie robi. Usuń zbędny średnik i zobacz jak wtedy będzie działało 😉

  • Pomogłeś! 1

Cześć.Podpowie ktoś jak zrobić zadanie 2.4? dwóch automatyków nie mogło dojść, pewnie przez jakiś banał ale nie mam pomysłów już. Pozdrawiam i czekam na odpowiedź

  • 2 tygodnie później...

Wszystkie zadania zrobione 🙂 .  Przy zadaniu z gwiazdką trzeba było trochę dłużej pomyśleć ale też się samodzielnie udało. 
Pozdrawiam 😉 

  • Lubię! 1

odnośnie zadania domowego 2.2 zauważyłem ,że gdy zmienną przeniesiemy do pętli loop to przestaje być ona widoczna dla całej funkcji.

Problem rozwiązuje umieszczenie jej nad funkcją , ale nie wewnatrz niej i mam teraz pytanie odnośnie tego czy jeżeli zapiszę int zaraz nad pętlą loop to czy będzie to zmienna lokalna widoczna tylko dla niej.

@SanZamoyski tak i nie 😉 W zestawach do kursu znajdują się przyciski przystosowane do płytek stykowych - one mają tylko 2 wyprowadzenia (zamiast 4), więc nie ma opcji, aby się pomylić. Niefortunnie wykorzystaliśmy na tym schemacie bibliotekę normalnego przycisku. Wiem, że jeśli ktoś działa z innymi elementami to może mieć tam problem, będziemy to zmieniać podczas aktualizacji kursu.

 

7 godzin temu, krzym2 napisał:

Wszystkie zadania zrobione 🙂 .  Przy zadaniu z gwiazdką trzeba było trochę dłużej pomyśleć ale też się samodzielnie udało. 
Pozdrawiam 😉 

@krzym2 super, że się udało 🙂 Powodzenia w dalszych eksperymentach!

 

4 godziny temu, down napisał:

czy jeżeli zapiszę int zaraz nad pętlą loop to czy będzie to zmienna lokalna widoczna tylko dla niej.

@down zmienne deklarowane poza funkcjami (czyli np. tuż nad loop() lub na samej górze programu) będą zmiennymi globalnymi - będzie widać je w każdym miejscu programu. Jeśli chcesz, aby zmienna była widoczna tylko wewnątrz funkcji to musisz ją zadeklarować wewnątrz danej funkcji.

Witam.

Miałem niestety dłuższą wymuszoną przerwę w nauce Arduino i przez to skończyłem naukę na 3 rozdziale bez zrobienia pracy domowej.

Dzisiaj wznowiłem naukę 😀 i chcę się podzielić swoim rozwiązaniem zadanie 2.5*. Może komuś takie rozwiązanie się bardziej spodoba :

#define zielona 8
#define czerwona 9
String odebraneDane = "";
int licznik_zielony = 0;
int licznik_czerwony = 0;

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

  digitalWrite(zielona, LOW);
  digitalWrite(czerwona, LOW);
  }

void loop() {
  if(Serial.available() > 0 ){
    odebraneDane = Serial.readStringUntil('\n');

    if( odebraneDane == "zielona"){
      digitalWrite(zielona,HIGH);
      licznik_zielony = licznik_zielony + 1;
      if (licznik_zielony % 2 == 0){
         digitalWrite(zielona,LOW);
      }
    }

    if( odebraneDane == "czerwona"){
      digitalWrite(czerwona,HIGH);
      licznik_czerwony = licznik_czerwony + 1;
      if (licznik_czerwony % 2 == 0){
         digitalWrite(czerwona,LOW);
      }
    }
   
  }
 }

Pozdrawiam. 

  • Lubię! 1
  • 4 tygodnie później...
(edytowany)

Cześć, 

czemu w funkcji void loop  ,   'zmienna3' jest bez int ? 

int Zmienna = 0; //Zmienna globalna - widoczna w każdym miejscu programu
 
void setup() {
  int Zmienna2 = 0; //Zmienna lokalna - widoczna tylko w funkcji setup()
}
 
void loop() {
  Zmienna3 = 0; //Zmienna lokalna - widoczna tylko w funkcji loop()
}

edit

2.4. z instrukcja return(0)

#define zielona 8
#define czerwona 9

String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(zielona, OUTPUT); //Konfiguracja wyjść
  pinMode(czerwona, OUTPUT);
  
  digitalWrite(zielona, LOW); //Wyłączamy diody
  digitalWrite(czerwona, 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 == "zielona") { //Jeśli odebrano słowo "zielona"
      digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(zielona, LOW); 
       return(0);
    }
     
    
    if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
      digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
      delay(1000);
      digitalWrite(czerwona, LOW); 
    }
 else{
  Serial.println("zle dane");
  return(0);
 }
  }
}

 

Edytowano przez miki61
  • Lubię! 1

@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

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