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

Tak jak zapowiadałem, tak zrobiłem - wczoraj koło 1 w nocy wskoczyła nowa część: Kurs Arduino – #4 – Przetwornik ADC.

Komentarze mile widziane 🙂

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

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

×