Kde mám chybu - switch
Napsal: 11 led 2020, 15:06
Zdravím.
začínám s Arduinem a teď zkouším příkaz Switch Case. Snažím se ze sériového monitoru načíst zadanou hodnotu a podle zadání spustit příslušnou větev CASE. Tam pak bude jednoduchý program na blikání LED. Když zadám 0 nebo 1, tak se mi vytiskne správná CASE větev, ale když dám 2, tak se mi na sériovém monitoru vytiskne větev s CASE pro jedničku (1). Co mám špatně? Řekl bych, že špatně načítám číslo, teď mám v IDE volbu Chybný konec řádky - zadám 1, odešlu a vytiskne se mi jedenkrát hláška, že jsem zadal 1. Ale pokud dám v IDE volbu Nová řádka, vytiskne se nejprve první hláška s číslem 5 a poté druhá hláška s číslem 0. Kód uvádím níže. Vím, že by to šlo i bez toho SWITCH a funkcí, to už mám a jede to, ale chtěl jsem se na tom naučit pracovat s funkcema...
V první záložce mám této kód:
int led = 13; // pin LED, která bude blikat
int stav; // zde uloží přijatou hodnotu ze sériové linky
int pocetBliknuti; // zpracovaná hodnota určující, kolikrát se bude blikat
int poc; // pomocná proměnná, zde cyklus bude ukládat počet opakování
int maxBlik = 5; // omezení počtu blikání
int kontrola; // 0 - vypnuto, 1 - zadání OK, 2 - chybné zadání ze SL, 3 - stav, kdy se fce nebude vykonávat
//====================================================================
void setup() {
pinMode(led, OUTPUT); // nastavení výstupu
Serial.begin(9600); // zahájení komunikace
Serial.print("Zadej počet blikání. Můžeš zadat pouze celé kladné číslo větší v rozsahu 1 až ");
Serial.print(maxBlik);
Serial.println(". ");
Serial.println("Nula znamená, že se nebude blikat.");
Serial.println("============================================================================");
}
//===================================================================
void loop() {
kontrola = 3;
cteniSerialLinky();
switch (kontrola){
case 0:
Serial.println("Spustí se: První case");
kontrola=3;
break;
case 1:
Serial.println("Spustí se: Druhé case");
kontrola=3;
break;
case 2:
Serial.println("Spustí se: Třetí case");
kontrola=3;
break;
}
}
Funkce mám definované na druhé záložce:
void cteniSerialLinky() {
if (Serial.available() > 0) { // pokud se něco objeví na sériové lince
int stav = Serial.parseInt(); //načte to a udělá z toho číslo
Serial.println(" ");
Serial.print("Přijato : ");
Serial.println(stav);
//--------Vyhodnocení správnosti zadání na sériovou linku -------------
if (0 < stav && stav <= maxBlik){ //pokud je zadání větší než nula, tolikrát se bude blikat
kontrola = 1; // zadání je v pořádku
pocetBliknuti=stav;
Serial.print("==Budu ");
Serial.print(pocetBliknuti);
Serial.println("-krát blikat==");
} else if (stav == 0) { // jesli je zadána nula, pak tiskne NEBLIKÁM, stejně jako zadání písmena místo čísla
kontrola = 0; // vypnutí blikání
Serial.println("== Nebude se blikat ==");
} else { // zadání záporného čísla, by měl vyhodnotit oznámením
kontrola = 2; // zadání není v pořádku
Serial.println("== Chybné zadání ==");
}
}
return kontrola;
}
Poradí mi prosím někdo, co mám špatně? Proč se mi nesplní podmínka pro spuštění CASE 2?
Díky moc.
Martin
začínám s Arduinem a teď zkouším příkaz Switch Case. Snažím se ze sériového monitoru načíst zadanou hodnotu a podle zadání spustit příslušnou větev CASE. Tam pak bude jednoduchý program na blikání LED. Když zadám 0 nebo 1, tak se mi vytiskne správná CASE větev, ale když dám 2, tak se mi na sériovém monitoru vytiskne větev s CASE pro jedničku (1). Co mám špatně? Řekl bych, že špatně načítám číslo, teď mám v IDE volbu Chybný konec řádky - zadám 1, odešlu a vytiskne se mi jedenkrát hláška, že jsem zadal 1. Ale pokud dám v IDE volbu Nová řádka, vytiskne se nejprve první hláška s číslem 5 a poté druhá hláška s číslem 0. Kód uvádím níže. Vím, že by to šlo i bez toho SWITCH a funkcí, to už mám a jede to, ale chtěl jsem se na tom naučit pracovat s funkcema...
V první záložce mám této kód:
int led = 13; // pin LED, která bude blikat
int stav; // zde uloží přijatou hodnotu ze sériové linky
int pocetBliknuti; // zpracovaná hodnota určující, kolikrát se bude blikat
int poc; // pomocná proměnná, zde cyklus bude ukládat počet opakování
int maxBlik = 5; // omezení počtu blikání
int kontrola; // 0 - vypnuto, 1 - zadání OK, 2 - chybné zadání ze SL, 3 - stav, kdy se fce nebude vykonávat
//====================================================================
void setup() {
pinMode(led, OUTPUT); // nastavení výstupu
Serial.begin(9600); // zahájení komunikace
Serial.print("Zadej počet blikání. Můžeš zadat pouze celé kladné číslo větší v rozsahu 1 až ");
Serial.print(maxBlik);
Serial.println(". ");
Serial.println("Nula znamená, že se nebude blikat.");
Serial.println("============================================================================");
}
//===================================================================
void loop() {
kontrola = 3;
cteniSerialLinky();
switch (kontrola){
case 0:
Serial.println("Spustí se: První case");
kontrola=3;
break;
case 1:
Serial.println("Spustí se: Druhé case");
kontrola=3;
break;
case 2:
Serial.println("Spustí se: Třetí case");
kontrola=3;
break;
}
}
Funkce mám definované na druhé záložce:
void cteniSerialLinky() {
if (Serial.available() > 0) { // pokud se něco objeví na sériové lince
int stav = Serial.parseInt(); //načte to a udělá z toho číslo
Serial.println(" ");
Serial.print("Přijato : ");
Serial.println(stav);
//--------Vyhodnocení správnosti zadání na sériovou linku -------------
if (0 < stav && stav <= maxBlik){ //pokud je zadání větší než nula, tolikrát se bude blikat
kontrola = 1; // zadání je v pořádku
pocetBliknuti=stav;
Serial.print("==Budu ");
Serial.print(pocetBliknuti);
Serial.println("-krát blikat==");
} else if (stav == 0) { // jesli je zadána nula, pak tiskne NEBLIKÁM, stejně jako zadání písmena místo čísla
kontrola = 0; // vypnutí blikání
Serial.println("== Nebude se blikat ==");
} else { // zadání záporného čísla, by měl vyhodnotit oznámením
kontrola = 2; // zadání není v pořádku
Serial.println("== Chybné zadání ==");
}
}
return kontrola;
}
Poradí mi prosím někdo, co mám špatně? Proč se mi nesplní podmínka pro spuštění CASE 2?
Díky moc.
Martin