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

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.

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

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

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ść)

Już wszystko jasne... (choć nie do końca).

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

Jaka jest różnica miedzy ' a " ?

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

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 😃

Mechano, która wersja Arduino IDE i skąd pobierana?

Na pewno masz wybraną dobrą płytkę podczas kompilacji?

  • Lubię! 1

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

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.

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