Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Dzięki za odpowiedź i linka 🙂 To teraz kolejne pytanie -> czwarta część kursu ukaże się przed 22.05, rozumiem, że ta "wyjęta część materiału" z tej części kursu zostanie wydana wcześniej? 🙂

Udostępnij ten post


Link to post
Share on other sites

htfhere, trudne pytanie 🙂 Wyjęta "miniczęść" ukażę się poza harmonogramem, może wcześniej, może później. Jednak są to bardziej ciekawostki/drobnostki nie wpływające na odbiór pozostałych części kursu.

Udostępnij ten post


Link to post
Share on other sites

Witam. I jak kursanci, ktoś podzieli się rozwiązaniami zadań domowych?

Ja swoje wrzucam poniżej.

Ad.

Zadanie domowe nr 2.3

Przerób powyższy program w taki sposób, aby w przypadku błędnego koloru wysyłał odpowiedni komunikat przez terminal. Swoim rozwiązaniem podziel się w komentarzu!

Na początku rozwiązałem to za pomocą rozbudowania struktury if i dopisania na końcu kodu z kursu, jednego else. I działało, chodź jak się po chwili okazało nie dokładnie tak jak powinno. Dopiero zastosowanie funkcji case i odpowiednie przypisanie wartości zmiennej będącej przełącznikiem case dało pożądany rezultat:)

//Zadanie domowe 2.3
//Gdy wpisany zły kolor diody, wyświetla komunikat o błędzie
//

#define GREEN 8
#define RED 9

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

void setup() {
 Serial.begin(9600); //Ustawienie prędkości transmisji ilość baudów
 //Inicjalizacja połączenia z PC
 pinMode(GREEN, OUTPUT); //Konfiguracja wyjść
 pinMode(RED, OUTPUT);

 digitalWrite(GREEN, LOW); //Wyłączamy diody
 digitalWrite(RED, LOW);
}

void loop() {
 // put your main code here, to run repeatedly:
 if (Serial.available() > 0) {//Czy Arduino odebrało dane
 //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 

   int wybor = 0;

   if (odebraneDane == "green") {
     wybor = 1;
   }
   else {
     if (odebraneDane == "red") {
       wybor = 2;
     }
   }

   Serial.println("wybor = '");
   Serial.println(wybor);
   Serial.println("'");

   switch (wybor) {
     case 1:
       digitalWrite(GREEN, HIGH); //To włączamy diodrę GREEN
       delay(1000);
       digitalWrite(GREEN, LOW);
       break;
     case 2:
       digitalWrite(RED, HIGH); //To włączamy diodrę RED
       delay(1000);
       digitalWrite(RED, LOW);
       break;
     default:
       //Wyświetla komunikat o błędnie wprowadzonym kolorze
       Serial.println("Blad. Wprowadzona nazwa nie jest obslugiwanym kolorem diody.");
       Serial.println("Obslugiwane kolory: 'green' oraz 'red'.");
   }
 }
} //end of void loop()

I dalej.

Ad.

Zadanie domowe nr 2.4*

Zadanie trudniejsze, z gwiazdką . Napisz program, który po wysłaniu koloru diody zmieni jej stan na przeciwny. Jeśli dioda jest włączona, to zostanie wyłączona i na odwrót. Podpowiedź: koniecznie użyj dodatkowych zmiennych typu bool, które będą pamiętały aktualny stan diod.

Tak jak w podpowiedzi, skorzystałem z dwóch zmiennych boolean. Na początku chciałem wprowadzić dodatkowe sprawdzanie warunku jaki stan logiczny ma dana zmienna, i na tej podstawie sterować diodą - ale rozrosło się to do wielu if'ów 🙂

Na stronce oficjalnej arduino w dziale references znalazłem przykład zastosowania zmiennej typu boolean i po przeanalizowaniu tego, wrzuciłem kod do mojego szkicu. Ostatecznie po modyfikacji wcześniejszego zadania domowego, która polegała na zastosowaniu instrukcji case, użyłem tego także w tym kodzie. Całość poniżej:

//Zadanie domowe 2.4
//Napisz program, który po wysłaniu koloru diody zmieni jej stan na przeciwny. 
//Jeśli dioda jest włączona, to zostanie wyłączona i na odwrót.

#define GREEN 8
#define RED 9

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

boolean AreGreenON = false; //zmienna logiczna, czy GREEN (8) ON
boolean AreRedON = false; //zmienna logiczna, czy Red (9) ON 


void setup() {
 Serial.begin(9600); //Ustawienie prędkości transmisji ilość baudów
 //Inicjalizacja połączenia z PC
 pinMode(GREEN, OUTPUT); //Konfiguracja wyjść
 pinMode(RED, OUTPUT);

 digitalWrite(GREEN, LOW); //Wyłączamy diody
 digitalWrite(RED, LOW);
}

void loop() {
 // put your main code here, to run repeatedly:

 if (Serial.available() > 0) {//Czy Arduino odebrało dane
 //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 

   int wyborlabel = 0; //zmienna wyborlabel do funkcji case
   //przydzielenie numerow w zaleznosci od wpisanego koloru

   if (odebraneDane == "green") { //Jeśli odebrano słowo "green"
     wyborlabel = 1;
     Serial.println("Wpisano slowo 'green'. wyborlabel= ");
     Serial.println(wyborlabel);
   } 
   else { //w przeciwnym wypadku
     if (odebraneDane == "red") { //Jeśli odebrano slowo "red"
       wyborlabel = 2;
       Serial.println("Wpisano slowo 'red'. wyborlabel= ");
       Serial.println(wyborlabel);
     }
     //pusty else
   } //koniec if odebrano green

   switch (wyborlabel) { //przelacznik case w zaleznosci od zmiennej wyborlabel
     case 1: //gdy wyborlabel=1, czyli wpisano green (case label:)
       delay(100);
       AreGreenON = !AreGreenON; //negacja wartosc AreGreenOn     
       digitalWrite(GREEN, AreGreenON); //To włączamy lub wyłaczamy diodrę GREEN
       delay(500);
       Serial.println("AreGreenON = ");
       Serial.println(AreGreenON);
       Serial.println("");
       break; //wyjscie z opcji 1
     case 2: //gdy wyborlabel=2, czyli wpisano red
       delay(100);
       AreRedON = !AreRedON; //negacja wartosci AreRedOn
       digitalWrite(RED, AreRedON); //To wl/wyl diodę RED w zaleznosci od AreRedOn
       delay(500);
       Serial.println("AreRedON = ");
       Serial.println(AreRedON);
       Serial.println("");
       break; //wyjscie z opcji 2
     default: //domyslnie wybrane - w pozostale przypadki czyli wyborlabel=0
       //Wyświetla komunikat o błędnie wprowadzonym kolorze
       Serial.println("Blad. Wprowadzona nazwa nie jest obslugiwanym kolorem diody.");
       Serial.println("Obslugiwane kolory: 'green' oraz 'red'.");
   } //end of switch (wyborlabel)
 } //koniec warunku, ze wprowadzono wiecej niz 0 znakow
} //koniec programu main void loop()

Czekam na inne rozwiązania, bo ciekaw jestem jak Wy to zrobiliście?🙂

pozdrowienia

pempol

Udostępnij ten post


Link to post
Share on other sites

pempol, fajnie, że podzieliłeś się swoimi rozwiązaniami. Specjalnie jednak nie wspominałem w kursie jeszcze o case, ponieważ chciałem aby te zadania były rozwiązane zwykłymi warunkami.

Nie ma takiej opcji, aby na samych if'ach działało gorzej - musi działać tak samo. Kwestia tylko napisania odpowiednich warunków - takie ćwiczenie 🙂 W wolnej chwili polecam jeszcze popróbować!

Udostępnij ten post


Link to post
Share on other sites

Nie ma takiej opcji, aby na samych if'ach działało gorzej - musi działać tak samo. Kwestia tylko napisania odpowiednich warunków - takie ćwiczenie 🙂 W wolnej chwili polecam jeszcze popróbować!

o widzisz, spróbuję ponownie 🙂

/edit

Spróbowałem, zacząłem od nowa z zadaniem 2.3 i dało radę. Wcześniej miałem taką sytuację, że nawet jak wpisałem poprawny kolor to wyświetlało mi komunikat o błędzie. Po zmianie wygląda to tak.

//Zadanie domowe 2.3
//Gdy wpisany zły kolor diody, wyświetla komunikat o błędzie
//

#define GREEN 8
#define RED 9

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

void setup() {
 Serial.begin(9600); //Ustawienie prędkości transmisji ilość baudów
 //Inicjalizacja połączenia z PC
 pinMode(GREEN, OUTPUT); //Konfiguracja wyjść
 pinMode(RED, OUTPUT);

 digitalWrite(GREEN, LOW); //Wyłączamy diody
 digitalWrite(RED, LOW);
}

void loop() {
 // put your main code here, to run repeatedly:
 if (Serial.available() > 0) {//Czy Arduino odebrało dane
 //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 

   if (odebraneDane == "green") { //gdy wpisane 'green'
     digitalWrite(GREEN, HIGH); //wlaczamy diode GREEN
     delay(1000);
     digitalWrite(GREEN, LOW);
   }
   else {
     if (odebraneDane == "red") { //gdy wpisane 'red'
       digitalWrite(RED, HIGH);
       delay(1000);
       digitalWrite(RED, LOW);
     }
     else {
       //Wyświetla komunikat o błędnie wprowadzonym kolorze
       Serial.println("Blad. Wprowadzona nazwa nie jest obslugiwanym kolorem diody.");
       Serial.println("Obslugiwane kolory: 'green' oraz 'red'.");
     }
   } //end of else od odebraneDane=="green"
 } //end of if wprowadzono >0 znakow
 //pusty else
} //end of void loop()

I odpowiednio po zastosowaniu tego w połączeniu ze zmienną logiczną, mamy odpowiedź na zadanie 2.4, która prezentuje się tak

//Zadanie domowe 2.4
//Napisz program, który po wysłaniu koloru diody zmieni jej stan na przeciwny. 
//Jeśli dioda jest włączona, to zostanie wyłączona i na odwrót.

#define GREEN 8
#define RED 9

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

boolean AreGreenON = false; //zmienna logiczna, czy GREEN (8) ON
boolean AreRedON = false; //zmienna logiczna, czy Red (9) ON 


void setup() {
 Serial.begin(9600); //Ustawienie prędkości transmisji ilość baudów
 //Inicjalizacja połączenia z PC
 pinMode(GREEN, OUTPUT); //Konfiguracja wyjść
 pinMode(RED, OUTPUT);

 digitalWrite(GREEN, LOW); //Wyłączamy diody
 digitalWrite(RED, LOW);
}

void loop() {
 // put your main code here, to run repeatedly:
 if (Serial.available() > 0) {//Czy Arduino odebrało dane
 //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n');
   if (odebraneDane == "green") { //jak wpisane 'green'
     delay(100);
     AreGreenON = !AreGreenON; //negacja wartosc AreGreenOn     
     digitalWrite(GREEN, AreGreenON); //To włączamy lub wyłaczamy diodrę GREEN
     delay(500);
     Serial.println("AreGreenON = ");
     Serial.println(AreGreenON);
     Serial.println("");
   }
   else { //w przeciwnym wypadku
     if (odebraneDane == "red") { //gdy wpisane 'red'
       delay(100);
       AreRedON = !AreRedON; //negacja wartosci AreRedOn
       digitalWrite(RED, AreRedON); //To wl/wyl diodę RED w zaleznosci od AreRedOn
       delay(500);
       Serial.println("AreRedON = ");
       Serial.println(AreRedON);
       Serial.println("");
     }
     else { //w przeciwnym wypadku - od 'red' i takze od 'green'
       //Wyświetla komunikat o błędnie wprowadzonym kolorze
       Serial.println("Blad. Wprowadzona nazwa nie jest obslugiwanym kolorem diody.");
       Serial.println("Obslugiwane kolory: 'green' oraz 'red'.");
     } //end of else 'red'
   } //end of else od 'green'
 } //end of if gdy wprowadzono wiecej niz 0 znakow
} //end of void loop()

Miłego dnia i czekam na kolejne lekcje:]

pempol

Udostępnij ten post


Link to post
Share on other sites

pempol, no i super 🙂

Tutaj ułatwić sprawę może jeszcze inne łączenie warunków, o którym nie wspomniałem, bo jestem złośliwym nauczycielem 👹 ...a taks serio, to chciałem, aby każdy pomęczył się z zagnieżdżaniem if'ów i pilnowaniem nawiasów.

Łatwiej byłoby wykorzystać taki zapis:

if (Warunek_1) {

} else if (Warunek_2) {

} else {

}

Można wtedy przyoszczędzić na nawiasach 🙂

Udostępnij ten post


Link to post
Share on other sites
Można wtedy przyoszczędzić na nawiasach 🙂

oszczędzanie? to mi się podoba:]

widziałem ten zapis w referencjach na arduino.cc, ale właśnie ze względu na wspomniane przez Ciebie pilnowanie nawiasów, trochę się rozpisałem. Myślę, że spróbuję przerobić to pod else if.

pozdrawiam

pempol

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Czy ktoś tu jest zainteresowany publikacją 4 części kursu Arduino jeszcze dziś? Pytam badawczo 🙂

Udostępnij ten post


Link to post
Share on other sites
Czy ktoś tu jest zainteresowany publikacją 4 części kursu Arduino jeszcze dziś? Pytam badawczo 🙂

Tak. Chodź ja sprawdzę wpis jutro:)

Udostępnij ten post


Link to post
Share on other sites

szymon220997, pempol, umknęły mi Wasze odpowiedzi... Dobra, w takim razie niedługo siadam do ostatecznego sprawdzenia kodów, aby działały na 150% i publikuję. Jednak pewnie dla większości będzie z tego lektura na rano 🙂 Chyba, że ktoś preferuje nocne programowanie...

Udostępnij ten post


Link to post
Share on other sites

Dzięki, to komentarze będą już pod artykułem:)

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites
Może być?

Jasne! Bardzo fajne rozwiązanie. Dla niewtajemniczonych dodam tylko, że zapis:

 stanZielonej = !stanZielonej; 

Neguje (zmienia na przeciwną) wartość zmiennej stanZielonej.

Jednak nawet bez tego zapisu można poradzić sobie z zadaniem podobnie i rozbić to na warunek:

if (stanZielonej == true) {
 stanZielonej = false;
} else {
stanZielonej = true;
}

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

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