Witam. I jak kursanci, ktoś podzieli się rozwiązaniami zadań domowych?
Ja swoje wrzucam poniżej.
Ad.
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.
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