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

  • Lubię! 2
Link do komentarza
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

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

  • Pomogłeś! 1
Link do komentarza
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;
}
  • Pomogłeś! 1
Link do komentarza
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ę »
×
×
  • 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.