Skocz do zawartości

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


Pomocna odpowiedź

Nie wiem co zrobić aby tylko raz wypisywał wiadomość o otwartym oknie.

Pusta pętla while w tym wypadku nie dzdiała ( lub nie wiem jak ją zastosować)

Program wygląda tak.

#define led1 3
#define led2 4
#define led3 11
#define led4 10
#define przycisk1 2 
#define przycisk2 12

void setup() {
 Serial.begin(9600); 
 pinMode(led1, OUTPUT); 
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(przycisk1, INPUT_PULLUP); 
 pinMode(przycisk2, INPUT_PULLUP); 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
}


void loop() {
 if (digitalRead(przycisk1) == LOW) { 
   digitalWrite(led4, HIGH); 
   digitalWrite(led1, LOW); 
 } else {
   digitalWrite(led4, LOW); 
   digitalWrite(led1, HIGH); 
   Serial.println("Uwaga! Alarm! Okno nie jest zamkniete!");

 }
 if (digitalRead(przycisk2) == LOW) { 
   digitalWrite(led3, HIGH); 
   digitalWrite(led2, LOW); 
 } else { 
   digitalWrite(led3, LOW);
   digitalWrite(led2, HIGH); 
   Serial.println("Uwaga! Alarm! Okno 2 nie jest zamkniete!");

   }
} 

__________

Komentarz dodany przez: Treker

Kody programów zamieszczamy w tagach . Popraw proszę.

Link to post
Share on other sites

Autsajder1983, spróbuj wykorzystać dodatkowe zmienne, które będą zapamiętywały, czy wyświetlono już komunikat. Jeśli nie, to zostanie wyświetlony, w przeciwnym wypadku będziemy czekać do zamknięcia okna w spokoju.

Link to post
Share on other sites

Możesz przykładowo zaraz za linijką wysyłającą komunikat ustawić wartość zmiennej CzyWyslano na 1. Nie chce dawać Ci od razu gotowego rozwiązania - próbuj dalej z tą podpowiedzią 🙂

Link to post
Share on other sites

Witam, wpisałem poniższe komendy:

Serial.begin(9600);

Serial.println("Witaj na Forbocie!");

i niestety w terminalu, zamiast liter, pojawiają mi się cyfry.

Dodam, że mam płytkę DFRobot UNO V3.

Co mam zrobić, aby mieć poprawne komunikaty? W terminalu mam ustawione 9600 baud (czyli jest zgodna wartość)

Link to post
Share on other sites
Serial.println("Witaj na Forbocie!");

To mi wygląda na cudzysłów, a nie apostrof? Więc o co chodzi z:

Komunikaty zamknąłem w pojedynczym ' a nie w podwójnym "
?

Między ' a " jest duża różnica w języku C. Więc ma prawo źle działać.

Link to post
Share on other sites

Podczas kompilacji programu z wpisywanym imieniem arduino wypluwa błąd o treści:

czesc2Zmienne.ino:19:25: error: 'class HardwareSerial' has no member named 'readStringUntill'

Kod programu tutaj:

String odebraneDane = ""; //pusty ciag odebranych znakow
void setup() {
 // put your setup code here, to run once:
Serial.begin(9600); //ustawienie predkosci transmisji
}

void loop() {
 // put your main code here, to run repeatedly:
if(Serial.available() > 0) { //czy arduino odebrało dane
 odebraneDane = Serial.readStringUntill('/n'); //jesli tak to
// odczytaj je do znaku końca linii i zapisz w zmiennej 
//odebraneDane
 Serial.println("Witaj " + odebraneDane + "!"); //wyswietl komunikat
 }
}

To samo mam przy drugim programie sterującym diodami led przez terminal błąd ten sam, kod tutaj:

#define zolta 8
#define czerwona 10

String odebraneDane = ""; //pusty ciag odebranych znakow
void setup() {
 // put your setup code here, to run once:
Serial.begin(9600); //ustawienie predkosci transmisji

pinMode(zolta, OUTPUT);
pinMode(czerwona, OUTPUT);

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

void loop() {
 // put your main code here, to run repeatedly:
if(Serial.available() > 0) { //czy arduino odebrało dane
 odebraneDane = Serial.readStringUntill('/n'); //jesli tak to
// odczytaj je do znaku końca linii i zapisz w zmiennej 
//odebraneDane
if (odebraneDane == "zółta" ) {
  digitalWrite(zolta, HIGH); //wlacz diode zielona
  delay (1000);
  digitalWrite(zolta, LOW);
}
 if (odebraneDane == "czerwona") {
   digitalWrite(czerwona, HIGH);
   delay(1000);
   digitalWrite(czerwona, LOW);
 }
}
}

Z góry dzięki za pomoc, wcześniej nie miałem żadnych problemów z kursem 😃

Link to post
Share on other sites

Prawidłowa nazwa tej funkcji to: readStringUntil czyli jedno L na końcu.

Co ciekawe w dokumentacji Arduino, na liście funkcji klasy Stream, readStringUntil występuje chyba jako artefakt. W opisie składni jest już tylko readString(terminator) co by znaczyło, że w zależności od sposobu wywołania readString może czekać albo do timeoutu gdy jest wywołana bez argumentu lub aż do napotkania znaku terminator, gdy dostała go od nas w argumencie.

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

marek1707, jak zawsze jesteś Marku niezastąpiony. Dzięki, nie zwróciłem uwagi na literówkę...

Mechano, teraz wszystko powinno działać. Rozumiem, że kod pisałeś samodzielnie? Bo w artykule nie widzę tego błędu.

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

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.