Hlídání hladiny problém s vypsáním na LCD

viking
Příspěvky: 8
Registrován: 06 kvě 2018, 20:02
Reputation: 0

Hlídání hladiny problém s vypsáním na LCD

Příspěvek od viking » 06 kvě 2018, 20:20

Ahoj,
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; 
   
  
 }

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od gilhad » 06 kvě 2018, 23:07

digitalRead(pin) cte hodnotu z pinu "pin".

Co asi tak cte digitalRead(releState) ? Hodnotu pinu 0 (releState==LOW) pripadne hodnotu pinu 1 (releState==HIGH)

Asi jsi mel na mysli digitalRead(relePin) ...

viking
Příspěvky: 8
Registrován: 06 kvě 2018, 20:02
Reputation: 0

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od viking » 07 kvě 2018, 00:01

Je to správně takto?

Kód: Vybrat vše

rel = digitalRead(releState);
if (rel == HIGH){
  
    lcd.setCursor ( 0, 0 );
    lcd.print(" cerpadlo bezi  ");
    lcd.setCursor ( 0, 1 );
    lcd.print("               ");
     }
ale nevím kam ten kus kódu umístit aby to fungovalo.
tak jak je v prvním příspěvku to nefunguje, nezobrazí text pokud je relé sepnuto.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od gilhad » 07 kvě 2018, 00:14

Co asi tak cte digitalRead(releState) ? Hodnotu pinu 0 (coz je RX) (releState==LOW) pripadne hodnotu pinu 1 (coz je TX) (releState==HIGH)

zcela jiste NECTE hodnotu pinu 3 (ktery jsi nazval relePin)

viking
Příspěvky: 8
Registrován: 06 kvě 2018, 20:02
Reputation: 0

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od viking » 07 kvě 2018, 00:31

a takto?

Kód: Vybrat vše

rel = digitalRead(relePin);
if (rel == HIGH){
  
    lcd.setCursor ( 0, 0 );
    lcd.print(" cerpadlo bezi  ");
    lcd.setCursor ( 0, 1 );
    lcd.print("               ");
     }

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od martinius96 » 07 kvě 2018, 01:12

Ano, vyzerá to dobre.
Ja ešte zvyknem používať pred výpisom v nejakej podmienke na displej:

Kód: Vybrat vše

lcd.clear(); 
Zmaže to displej, aby sa nestalo, že ti na niektorom riadku ostane niečo z predchádzajúceho textu, aby sa vypísalo iba to, čo má.
Ale keď pozeram na tvoj kód, tak by s tým nemal byť problém. Ak použiješ lcd.clear(); nemusíš používať, lebo funkcia to za teba urobí a vypíšeš si iba to, čo chceš kam chceš.

Kód: Vybrat vše

   lcd.setCursor ( 0, 1 );
    lcd.print("               ");

viking
Příspěvky: 8
Registrován: 06 kvě 2018, 20:02
Reputation: 0

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od viking » 07 kvě 2018, 01:54

Tak nevím, při tomto kodu to ukazuje hladiny na ldc OK, ale jak stisknu tlačítko a sepne relé začne lcd blikat jako by se zacyklil.

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 = HIGH;         // 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 rel;
boolean val; //jednoduše čte 1 nebo 0 jako hodnotu 1 při detekci vody

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(relePin);
if (rel == HIGH){
  
    lcd.setCursor ( 0, 0 );
    lcd.print(" cerpadlo bezi  ");
    lcd.setCursor ( 0, 1 );
    lcd.print("               ");
     }
  
    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("***----------***"); 
  
}     

     // Č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; 
   
  
 }
 
 

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od rejze69 » 09 kvě 2018, 00:11

Myslim, že ti to střídá s hladina ok protože po else to zobrazení proběhne taky. Neni zakázaný v době kdy máš zobrazeno čerpadlo běží.

viking
Příspěvky: 8
Registrován: 06 kvě 2018, 20:02
Reputation: 0

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od viking » 09 kvě 2018, 07:43

Nakonec jsem to vyřešil tak, že 1. řádek na lcd zobrazuje stav hladiny " OK, nebo MAX"
a 2. řádek lcd zobrazuje stav čerpadla "JEDE, nebo STOP". Tak to zobrazení funguje skvěle.

Dotaz bokem - můžu místo malého piezo bzučáku použít ten malý reprák ze starého PC bez následků pro Arduino UNO?

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 = 12;      // cislo pinu ledky 


int WaterAlarm = 6; // datový pin senzoru vody
int Buzzer = 10; // bzučák
int Led1 = 11; //ledka alarmu
int ledState = LOW;         // Aktuální stav výstupního pinu
int releState = LOW;         // 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 rel;  // stav rele
boolean val; //jednoduše čte 1 nebo 0 jako hodnotu 1 při detekci vody

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() 
   { 
  
    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 ");
    
  }
    else
    {
    digitalWrite(Led1, LOW);
    digitalWrite(Buzzer, LOW); 
   
    lcd.setCursor ( 0, 0 );
    lcd.print(" Hladina    OK   ");
  }     
     rel = digitalRead(relePin);
     if (rel == HIGH){
  
    
     lcd.setCursor ( 0, 1 );
     lcd.print(" Cerpadlo JEDE   ");
     
  
 }
     else{
     lcd.setCursor ( 0, 1 );
     lcd.print(" Cerpadlo  STOP  ");
 }
        // Č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; 
   
  }  
     

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: Hlídání hladiny problém s vypsáním na LCD

Příspěvek od rejze69 » 09 kvě 2018, 08:34

Zkus v tom puvodnim kodu v bloku %hladina ok" místo else pouzit podminky.

Kód: Vybrat vše

else if (val==0 && rel==LOW)  {

Pak by to melo delat to co jsi chtel.
Ten reprák si myslim, ze nepujde. Bude mit impedanci nejvys 32ohm a to je v podstate zkrat.
Mas jen kontrolu vysoke hladiny a spodni nekontrolujes? Kdyby jsi to doplnil, mohlo by arduino spinat cerpadlo automaticky.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů