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?

Link do komentarza
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

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

Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

@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
Link do komentarza
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.