Skocz do zawartości

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


Pomocna odpowiedź

Zrobiłem zadanie z gwiazdką, czy można tutaj coś ulepszyć?

#define zielona 5
#define czerwona 6

void setup() {

Serial.begin(9600);
pinMode(zielona, OUTPUT);
pinMode(czerwona, OUTPUT);
//ustawiamy odpowiednie piny jako wyjścia
}

void loop() {

static String od = "";
static boolean stanCz = 0;
static boolean stanZ = 0;
//tworzymy zmienne statyczne

if(Serial.available() > 0)
 {
 od = Serial.readStringUntil('\n');
 if(od == "zielona") 
   stanZ = !stanZ;
   //zmieniamy stan na przeciwny

 else if(od == "czerwona")
   stanCz = !stanCz;
   //tak samo jak wyżej

 else
   Serial.println("nieznana komenda");
   //jak sie wpisze głupotę, to program reaguje

 }
if(stanZ > 0)
 digitalWrite(zielona, HIGH);    //w zależności od stanu
else                              //zapalamy bądź gasimy diody
 digitalWrite(zielona, LOW);

if(stanCz > 0)
 digitalWrite(czerwona, HIGH);
else
 digitalWrite(czerwona, LOW);
}

EDIT

Zmieniłem, jest trochę krótszy. Mam pytanie, po wpisaniu komendy trzeba stosunkowo długo poczekać zanim zapali się odpowiednia dioda, które operacje zajmują kontrolerowi najwięcej czasu?

#define zielona 5
#define czerwona 6

void setup() {

Serial.begin(9600);
pinMode(zielona, OUTPUT);
pinMode(czerwona, OUTPUT);
}

void loop() {

static String od = "";
static boolean stanCz = 0;
static boolean stanZ = 0;

if(Serial.available() > 0)
 {
 od = Serial.readStringUntil('\n');
 if(od == "zielona") {
   stanZ = !stanZ;
   digitalWrite(zielona, stanZ);
 }

 else if(od == "czerwona") {
   stanCz = !stanCz;
   digitalWrite(czerwona, stanCz);
 }

 else
   Serial.println("nieznana komenda"); 
 }
}

Witam serdecznie

To mój pierwszy wpis na tym forum.

Na wstępie chciałbym podziękować za kurs arduino.

Mając 32 lata i będąc humanistą zainteresowałem się tą małą, ale jakże ciekawą płytką.

Wasz kurs bardzo pomaga w zrozumieniu o co chodzi w tym "tajemnym programowaniu".

Jestem na początku drogi i pewnie jeszcze długo będę się czuł jak dziecko we mgle, ale postanowiłem podzielić się rozwiązaniem zadania nr 2.4. Program zdaje się działać prawidłowo, ale wolałbym by ktoś mądrzejszy to ocenił.

#define zielona 8
#define czerwona 9

String odebraneDane = ""; // pusty ciag odebranych danych

void setup () {
 Serial.begin(9600); // inicjalizacja połaczenia z pc
 pinMode(zielona, OUTPUT); // konfiguracja wyjsc
 pinMode(czerwona, OUTPUT);

 digitalWrite(zielona, LOW); // wyłaczamy diody na starcie
 digitalWrite(czerwona, LOW); 
}
void loop () {
 if(Serial.available() > 0) { //czy arduino odebrało dane
   //jesli tak, to odczytaj je do znaku konca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 

   if (odebraneDane == "zielona"){ // jesli odebrano słowo "zielona"
     digitalWrite(zielona, HIGH); //to włączamy diode zielona
     delay(1000);
     digitalWrite(zielona, LOW);
     }


    if (odebraneDane == "czerwona") {
     digitalWrite(czerwona, HIGH); // to włącz diodę czerwoną
     delay(1000);
     digitalWrite(czerwona, LOW);
    }  
    if (odebraneDane !="czerwona" and odebraneDane!="zielona")  {   


     Serial.println("Podales zly kolor!");

    }

 }}


  • Lubię! 1

Rasted, witaj na forum, ciesze się, że kurs nadal jest pomocny 🙂 Wszystko wygląda dobrze, jedynie proponowałbym poprawić formatowanie końcówki kodu, aby była lepiej czytelna, czyli zamiast:

     if (odebraneDane !="czerwona" and odebraneDane!="zielona")  {    


     Serial.println("Podales zly kolor!"); 

    } 

 }} 

Zrobiłbym:

     if (odebraneDane !="czerwona" and odebraneDane != "zielona")  {    
     Serial.println("Podales zly kolor!"); 
    }   
 }
} 

Można też zamiast 3 osobnych if'ów skorzystać z konstrukcji if else, wtedy uda się zrealizować całość bez ostatniego warunku 🙂

Treker, dziękuję za uwagi.

Pamiętam, że próbowałem użyć else, ale coś nie działało mi prawidłowo. Nie mam teraz czasu sprawdzać tego "doświadczalnie", więc pozwalę sobie po prostu zapytać:

Czyli zamiast warunku:

if (odebraneDane !="czerwona" and odebraneDane!="zielona") 

...wystarczy jak użyję instrukcji else i zadziała ona do obu if'ów?

Co do klamerek to fakt, często kompilator "krzyczy", że jakiejś nie domknąłem itp, więc dopisuję je już bez zwracania uwagi na formatowanie. Postaram się zwrócić na to większa uwagę.

Ja zrobiłem tak:
#define zielona 8
#define czerwona 9

String odebraneDane = "";
boolean stanCzerwonej = false;
boolean stanZielonej = false;

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") {
     stanZielonej = !stanZielonej;
   }

   if (odebraneDane == "czerwona") {
     stanCzerwonej = !stanCzerwonej;
   }

   if (odebraneDane != "czerwona" && odebraneDane != "zielona") {
     Serial.println("Nieprawidlowy kolor! Wpisz 'zielona' lub 'czerwona'.");
   }

   digitalWrite(zielona, stanZielonej);
   digitalWrite(czerwona, stanCzerwonej);
 }

}

Może być?

Igor możesz mi wytłumaczyć czemu użyłeś && and i to działa? Przecież żeby and się zgadzało dwie wartości muszą być prawdziwe. zamieniłęm to na or || i nie działa i nie rozumiem dlaczego. Z góry dzięki

...wystarczy jak użyję instrukcji else i zadziała ona do obu if'ów?

Nie wiem gdzie chcesz ją użyć, więc ciężko odpowiedzieć. Zachęcam jednak do testów w praktyce, w tym wypadku powinna wystarczyć konstrukcja tego typu:

if (...) {

} else if (...) {

} else {

}
Co do klamerek to fakt, często kompilator "krzyczy", że jakiejś nie domknąłem itp, więc dopisuję je już bez zwracania uwagi na formatowanie.

Najbezpieczniej od razu stawiać dwa nawiasy klamrowe {}, później cofać kursorem i pisać już w ich wnętrzu. Inaczej szybko można się pogubić i później trzeba właśnie dopisywać klamerki w losowych miejscach.

Igor możesz mi wytłumaczyć czemu użyłeś && and i to działa? Przecież żeby and się zgadzało dwie wartości muszą być prawdziwe. zamieniłęm to na or || i nie działa i nie rozumiem dlaczego. Z góry dzięki

Odpowiem za Igora. Sprawdź, co dokładnie robi ten warunek, nie ma sensu zamieniać "na ślepo" AND z OR'ami. W tym przypadku chcemy sprawdzić, czy odebraneDane nie zawierają słowa czerwona i nie zawierają słowa zielona. Najlepiej rozpisywać sobie takie warunki pełnym zdaniem, wtedy widać, co dokładnie się dzieje podczas ich wykonywania 🙂

boolean stan = false;
void setup() {
 pinMode(7, OUTPUT);
}
void loop() {
   stan = !stan;
   digitalWrite(7, stan);
}

Tak napisany kod spowoduje, ze dioda będzie swieciła cały czas. Jednak jesli zmieie na true:

boolean stan = true;
void setup() {
 pinMode(7, OUTPUT);
}
void loop() {
   stan = !stan;
   digitalWrite(7, stan);
}

dioda świeci nadal.

Proszę o interpretację zapisu:

boolean stan = false;

oraz

boolean stan = true;

Dzięki

"dioda będzie swieciła cały czas"

Nieprawda. Dioda świeci przez połowę czasu a przez drugą połowę jest zgaszona, niezależnie od tego czy zaczniesz od true czy false. Procesory są szybkie a ten sterowany Twoim programem zmienia stan diody kilkaset tysięcy razy na sekundę. Nie masz szans tego zauważyć i widzisz tylko jakąś wartość średnią. Dla pewności wywal z pętli negację stanu. Wtedy raz dostaniesz ciemność (gdy zaczniesz od false) a raz jasność i ta jasność będzie silniejsza niż to co masz teraz, bo będzie stanem true przez 100% czasu.

Albo po prostu wstaw jakieś opóźnienie np. delay(500) do pętli.

  • Lubię! 1
  • 2 tygodnie później...

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