mám zde trochu zajímavý problém, kod níže je pracovní verze přepínače, Spíná jednotlivé smyčky ale druhou smyčku ze čtyř nezobrazí na displeji a k jejímu zadání chce potvrzení což u jiných smyček nechce. Zajímavé je že na displeji se zobrazuje dvakrát přepínač 1 a potom přepínač 3 dvojku jakoby přeskočí. Dle mne je to v přepínání kdy se hodnota stav změní z 5 na 1 ale v druhém zadání se nepřičte. Nevím to ale jistě prosím mohl by jste se někdo mrknout zda tam neuvidíte chybu která by toto podivné chování vysvětlila?
Kód: Vybrat vše
// Arduino Uno - metr superC
//#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// nastavena adresa 0x3F a poradi pinu displeje na prevodniku: en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
volatile int stav = 1; // stav vyberu z menu
int napeti; // pomocna pro mereni napeti
volatile int pryc = LOW; // pro obslouzeni interruptu
int j =0;
void setup() {
Serial.begin(9600);
pinMode(A2, INPUT_PULLUP); // TL enter
pinMode(A3, INPUT_PULLUP); // TL dalsi
pinMode(2, INPUT_PULLUP); // TL menu pres interrupt
lcd.begin(16, 2); // zavedeni grafiky do RAM displeje
lcd.clear();
lcd.print("Prepinac poloh"); // vypis hlavicky
lcd.setCursor(0, 1);
lcd.print(" verze 1.1");
// attachInterrupt(0, ven, LOW);// interrupt
delay(2000);
}
boolean ctiTL() { // cteni tlacitek a posuny v menu
int TL = 0;
delay(500);
do {
if (digitalRead(A3) == LOW) TL += 1; // dalsi
if (digitalRead(A2) == LOW) TL += 2; // enter
} while (TL == 0);
if (TL == 1) {
stav ++;
Serial.print (stav);//kolování stavů na displeji
Serial.println (TL);
if (stav > 4) stav = 1;
// pip(10);
}
if (TL == 2) {
return true; // byl enter na zvoleny stav
} else {
return false; // nekorektni kombinace ignoruj
}
}
void loop() { // hlavni menu funkci
lcd.clear();
lcd.print("Vyber funkce:");
lcd.setCursor(0, 1);
Serial.println(stav);
switch (stav) {
case 1: // přepínač 1
lcd.print("Prepinac 1");
if (ctiTL())
prep1();
Serial.println(ctiTL());
break;
case 2: // Přepínač 2
lcd.print("Prepinac 2");
if (ctiTL())
prep2();
Serial.println(ctiTL());
break;
case 3: // Přepínač 3
lcd.print("Prepinac 3");
if (ctiTL())
prep3();
break;
case 4: // Přepínač 4
lcd.print("Prepinac 4");
if (ctiTL())
prep4();
break;
}
if (pryc) {
for (int i = 1; i < 5; i++) {
// pip(50);
delay(100);
}
pryc = LOW;
}
}
void prep1() {
Serial.println("zacina mereni");
lcd.clear();
lcd.print("mereni zacina");
delay(800);
for (j=1; j<10; j++)
{digitalWrite (A0, HIGH);
delay (150);
digitalWrite (A0, LOW);
Serial.println("merei na prep 1");
lcd.clear();
lcd.print("merei na prep 1");
delay(140);
}
Serial.println("konec mereni");
lcd.clear();
lcd.print("mereni probehlo");
delay(140);
do {} while (!ctiTL());
}
void prep2() { // nabijeni na 2,5 V
Serial.println("zacina mereni");
lcd.clear();
lcd.print("mereni zacina");
delay(800);
for (j=1; j<10; j++)
{digitalWrite (A0, HIGH);
delay (150);
digitalWrite (A0, LOW);
Serial.println("merei");
lcd.clear();
lcd.print("mereni na prep 2");
delay(140);
}
Serial.println("konec mereni");
lcd.clear();
lcd.print("mereni probehlo");
delay(140);
do {} while (!ctiTL());
}
void prep3() { lcd.clear();
lcd.print("mereni zacina");
delay(1000); // nabijeni na 2,5 V
for (j=1; j>10; j++)
{digitalWrite (A0, HIGH);
delay (150);
digitalWrite (A0, LOW);
Serial.println("vybit");
lcd.clear();
lcd.print("mereni na prep 3");
delay(140);}
lcd.clear();
lcd.print("mereni probehlo");
do {} while (!ctiTL());
}
void prep4() { // formovani bez omezeni
Serial.println("zacina mereni");
lcd.clear();
lcd.print("mereni zacina");
delay(800);
for (j=1; j<10; j++)
{digitalWrite (A0, HIGH);
delay (150);
digitalWrite (A0, LOW);
Serial.println("merei");
lcd.clear();
lcd.print("mereni na prep 4");
delay(140);
}
Serial.println("konec mereni");
lcd.clear();
lcd.print("mereni probehlo");
do {} while (!ctiTL()); } // vyskok pres interrupt
/*
void ven() {
lcd.clear(); // vse vypnout a skocit do menuwera
pryc = HIGH;
lcd.print("reset");
delay(800);
do {} while (!ctiTL());
}
*/