Skocz do zawartości

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

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.

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

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

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

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 🙂

  • Lubię! 2
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
Link to post
Share on other sites

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

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:)

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

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

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;
}
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!

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.