Začínám s Arduinem a pokouším se dát dohromady program pro hlídání hladiny,
kdy pokud je hladina pod čidlem nic se neděje - na lcd je text: Hladina OK.
Pokud se čidlo zalije - bliká LED a bzuučí bzučák + text: Hladina na MAX zapni čerpadlo.
Tlačítkem zapnu relé - čerpadlo, pokud hladina klesne opět pod čidlo, alarm se vypne + text Hladina OK a tlačítkem vypnu čerpadlo.
Potud je to OK.
Bojuju s tím jak zobrazit na lcd při sepnutém relé text např "Cerpadlo bezí" a po vypnutí opět text Hladina OK?
Kdyz nahraju tento kod displej problikává a text "Cerpadlo bezi" se nezobrazí. Pokud tam nedám tu část s podmínkou "if (rel == 1)" a vypsáním čepadlo běží,
program funguje jak má, tedy hlídá hladinu a vypisuje správně texty.
Prosím bude někdo z Vás ochotný mi poradit?
Kód: Vybrat vše
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//nastavíme adresu a typ displeje
LiquidCrystal_I2C lcd(0x27,20,4); // nastavení adresy (0x27) je důležité!!!
// Konstanty se nezmění . Jsou zde použity pro
// Nastavení čísla PIN :
const int buttonPin = 2; // cislo pinu tlacitka
const int relePin = 3; // cislo pinu rele
const int ledPin = 13; // cislo pinu ledky
int WaterAlarm = 6; // datový pin senzoru vody
int Buzzer = 10; // bzučák
int Led1 = 11; //ledka alarmu
int poc; // promenna na pocitani cycklu alarmu
int ledState = LOW; // Aktuální stav výstupního pinu
int releState = HIGH; // Aktuální stav výstupního pinu
int buttonState; // Aktuální čtení ze vstupního pinu
int lastButtonState = LOW; // Předchozí čtení ze vstupního pinu
// Následující proměnné jsou dlouhé , protožečas , měřeno v milisekundách ,
// Se rychle stanevětší číslo , než je možné uložit do int
long lastDebounceTime = 0; // Poslední doba kdy výstupní pin byl přepnut
long debounceDelay = 50; // cas konstanta zvysit
boolean val; //jednoduše čte 1 nebo 0 jako hodnotu 1 při detekci vody
boolean rel;
int tones[] = {261, 277, 293, 311, 329, 349, 369, 392, 415, 440, 466, 493, 523 ,554};
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14
// Lze přidat i více tonu, je přidáno 14
void setup() {
Serial.begin(9600);
pinMode (WaterAlarm, INPUT);
pinMode (Buzzer, OUTPUT);
pinMode (Led1, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(relePin, OUTPUT);
// Nastavit počáteční stav ledky a rele
digitalWrite(ledPin, ledState);
digitalWrite(relePin, releState);
lcd.init();
lcd.backlight();
}
void loop() {
rel = digitalRead(releState);
val = digitalRead(WaterAlarm);
if (val == 1)
{
digitalWrite(Led1, HIGH);
digitalWrite(Buzzer, HIGH);
tone(Buzzer, tones[6]);
delay(200);
digitalWrite(Led1, LOW);
digitalWrite(Buzzer, LOW);
noTone(Buzzer);
delay(200);
digitalWrite(Led1, HIGH);
digitalWrite(Buzzer, HIGH);
tone(Buzzer, tones[10]);
delay(200);
digitalWrite(Led1, LOW);
digitalWrite(Buzzer, LOW);
noTone(Buzzer);
delay(200);
lcd.setCursor ( 0, 0 );
lcd.print(" Hladina na MAX ");
lcd.setCursor ( 0, 1 );
lcd.print(" ZAPNI CERPADLO ");
}
else
{
digitalWrite(Led1, LOW);
digitalWrite(Buzzer, LOW);
lcd.setCursor ( 0, 0 );
lcd.print(" Hladina O K ");
lcd.setCursor ( 0, 1 );
lcd.print("***----------***");
}
if (rel == 1)
{
lcd.clear();
lcd.setCursor ( 0, 0 );
lcd.print(" cerpadlo bezi ");
lcd.setCursor ( 0, 1 );
lcd.print(" ");
}
// Čtení stavu spínače do lokální proměnné :
int reading = digitalRead(buttonPin);
// Zkontroluje, zda jste právě stiskli tlačítko
// zmena prepinace:
if (reading != lastButtonState) {
// reset casovace odskoku
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// Cas tam byl déle než vstupní zpoždění ,
// skutečný současný stav:
// Pokud došlo ke změněstavu tlačítka:
if (reading != buttonState) {
buttonState = reading;
// Pouze přepínat ledku a rele , pokud je nové zmáčknutí:
if (buttonState == HIGH) {
ledState = !ledState;
releState = !releState;
}
}
}
// nastaveni ledky a rele:
digitalWrite(ledPin, ledState);
digitalWrite(relePin, releState);
// ulozeni cteni pro pristi smycku:
lastButtonState = reading;
}