Elektronische Gießkanne


Bastelseite Versionen Aufbau Bauteile Programm

Das Programm

Das Programm kann kopiert werden.

Oder es wird in einem separaten Fenster geöffnet.

/*  giessanlage-v3-210629.ino

    Helmut Brixel Juni 2021  www.brixelweb.de
	
	Version 3 mit zwei Poti + LCD-Display 4x20

    Entfernungsmesser mit Ultraschallsensor HC-SR 04
    sowie ein Bodenfeuchte-Sensor Kapazitiv
    und ein LCD-Display / I2C / 4 Zeilen a 20 Zeichen

    LCD-Display 4x20:     SDA an A4  und SCL an A5 / VCC an +5V und GND an GND
    HC-SR04:    TRIGGER an D7 / ECHO an D6 / VCC an +5V und GND an GND
    Kapaz.Sensor: Vout(gelb) an A0 / VCC an +5V / GND an GND
    Eingang vom Optokoppler an D12 und GND
    Poti1 an +5V, GND und Mitte an A1 = Nass/Trocken Vorwahl
    Poti2 an +5V, GND und Mitte an A2 = Füllstands-Vorwahl
    Wechselschalter an GND und +5V, Mitte an D3 = Automatik / Einstellung
    Taster (RESET) an GND und RST

    --- giessanlage-v3-210629.ino ---
*/

#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x3F, 20 , 4);  // LCD-Display 4 x 20, Adresse 0x3F


int pumpe = 12;      // Definition des Ausgangs für die Pumpe
int trigger = 7;     //Trigger-Pin des Ultraschallsensors an Pin7 vom Arduino
int echo = 6;        // Echo-Pin des Ultraschallsensors an Pin6 vom Arduino
int schritt = 0;     // schritt = Durchlaufstufen des Programms
long dauer = 0;      // Variable für Ultraschall-Sensor
int entfernung = 0;  // Variable für Entfernungsdaten in cm
int proz = 0;        // Variable für Prozentanzeige
int f_sensor = 0;    // Definition des kapazitiven Sensors

int poti1, poti2, schwelle, soll = 0;
int schalter = 0;
// schwelle = Wert der Umschaltung von Nass (450) auf Trocken (700)
int eingang = 3;     // Eingang des Umschalters Potieinstellung/Programmablauf

int maxh2o = 10;     // Maximaler Füllstand = 12 cm Abstand zum Sensor
int minmax = 61;     // Pegel zur Umschaltung
int minh2o = 70;     // Minimale Füllstand-Grenze = 60 cm Abstand zum Sensor
int var_h2o = 0;     // Einstellbare Füllstandsgrenze


// -------------------------------- S E T U P  -----------------------
void setup()
{
  lcd.init(); //Im Setup wird der LCD gestartet
  lcd.backlight(); //Hintergrundbeleuchtung einschalten
  // lcd.noBacklight(); schaltet die Beleuchtung aus

  pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
  pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
  pinMode(pumpe, OUTPUT);
  digitalWrite(pumpe, LOW);
  pinMode(eingang, INPUT);

  schritt = 0;

}  // ENDE von setup

// -------------------------------- L O O P -----------------------
void loop()
{
  switch (schritt) {

    case 0:  // Poti 1 und Poti 2 auslesen, wenn Schalter auf EIN
      schalter = digitalRead(eingang);

      if (schalter == HIGH) {
        lcd.setCursor(9, 0);
        lcd.print("1 Schwelle");
        lcd.setCursor(1, 1);
        lcd.print("VORWAHL");
        lcd.setCursor(9, 2);
        lcd.print("2 Fass-Soll");
        lcd.setCursor(1, 3);
        lcd.print("Ende: \177 S");
        lcd.setCursor(18, 3);
        lcd.print("%");

        poti1 = analogRead(A1);      // Auslesen des Potis: Schaltpunkt festlegen
        schwelle = map(poti1, 0, 1023, 450, 680); // Vorgabegrenzen festlegen

        poti2 = analogRead(A2);      // Auslesen des Potis: Füllstandsgrenze
        soll = map(poti2, 0, 1023, 55, maxh2o); // Vorgabegrenzen in cm festlegen
        var_h2o = map(poti2, 0, 1023, 25, 99); // // Vorgabegrenzen in Prozent festlegen

        lcd.setCursor(16, 1);
        lcd.print(schwelle);
        lcd.setCursor(16, 3);
        lcd.print(var_h2o);
        delay(250);
        schritt = 0;
      } // ende von * IF (schalter == HIGH) *

      if (schalter == LOW) {
        lcd.clear();
        lcd.setCursor(1, 1);
        lcd.print("Elektronische");
        lcd.setCursor(1, 2);
        lcd.print("        Giesskanne");
        delay(3000);
        schritt = 1;
      } // ende von "if ....."

      break; // ENDE von case 0

    case 1:      // Bodenfeuchtigkeit messen

      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("MESSUNG der  | Mess");
      lcd.setCursor(1, 1);
      lcd.print("Feuchtigkeit |");
      lcd.setCursor(3, 2);
      lcd.print("im Boden   | Schw");
      lcd.setCursor(14, 3);
      lcd.print("|");

      for (int h = 1; h < 5; h++)
      {
        f_sensor = analogRead(A0);
        delay(200);

        poti1 = analogRead(A1);
        schwelle = map(poti2, 0, 1023, 450, 680);

        lcd.setCursor(3, 3);
        lcd.print(h);
        lcd.setCursor(6, 3);
        lcd.print("von 5");
        lcd.setCursor(16, 1);
        lcd.print(f_sensor);
        lcd.setCursor(16, 3);
        lcd.print(schwelle);
        delay(500);
      }  // ende von "for ..."

      if (f_sensor < schwelle )    // Wert der Feuchtigkeit = 400
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Mess-Ergebnis | Mess");
        lcd.setCursor(0, 1);
        lcd.print("Der Boden ist | ");
        lcd.setCursor(0, 2);
        lcd.print("=- N A S S -= | Schw");
        lcd.setCursor(0, 3);
        lcd.print("--------------| ");
        lcd.setCursor(16, 1);
        lcd.print(f_sensor);
        lcd.setCursor(16, 3);
        lcd.print(schwelle);
        delay(1000);
        while (1); // --------------------- Programm angehalten ! ---
      }  // ende von "if ..."


      if (f_sensor >= schwelle )    // WERT der Trockenheit/Feuchtigfkeit
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Mess-Ergebnis | Mess");
        lcd.setCursor(0, 1);
        lcd.print("Der Boden ist | ");
        lcd.setCursor(0, 2);
        lcd.print("T R O C K E N | Schw");
        lcd.setCursor(0, 3);
        lcd.print("--------------| ");
        lcd.setCursor(16, 1);
        lcd.print(f_sensor);
        lcd.setCursor(16, 3);
        lcd.print(schwelle);
        delay(3000);
        schritt = 2;
      }  // ende von "if ..."
      break; // ENDE von case 1


    case 2:
      // Wasserstand im Fass prüfen

      poti2 = analogRead(A2);      // Auslesen des Potis: Füllstandsgrenze
      soll = map(poti2, 0, 1023, 55, maxh2o); // Vorgabegrenzen in cm lesen
      var_h2o = map(poti2, 0, 1023, 25, 99); // // Vorgabegrenzen in Prozent lesen

      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print("MESSUNG    | Soll");
      lcd.setCursor(14, 1);
      lcd.print("|    %");
      lcd.setCursor(2, 2);
      lcd.print("H2O-Stand   | IST:");
      lcd.setCursor(3, 3);
      lcd.print("im Fass    |   ");

      // 3 x Probemessung durchführen
      for (int h = 0; h < 3; h++)
      {
        // Echo-Wert messen:
        digitalWrite(trigger, LOW);
        delay(5); //Dauer: 5 Millisekunden
        digitalWrite(trigger, HIGH);
        delay(10);
        digitalWrite(trigger, LOW);
        dauer = pulseIn(echo, HIGH);
        entfernung = (dauer / 2) * 0.03432;

        if (entfernung >= 500 || entfernung <= 0)
        {
          lcd.setCursor(0, 3);
          lcd.print("Kein Messwert");
        }  // ende von "if ..."
        else
        {

          if (entfernung > minh2o)
          {
            entfernung = 70;
          }  // ende von "if ..."

          proz = map(entfernung, minh2o, maxh2o, 0, 99); // (entf, 70, 10, 0, 99)

          delay(1000);
        } // ende von "else ..."

        lcd.setCursor(12, 3);
        lcd.print(h);

        lcd.setCursor(16, 1);
        lcd.print("   ");
        lcd.setCursor(16, 1);
        lcd.print(var_h2o); // prozentuale Füll-Vorgabe
        lcd.setCursor(16, 3);
        lcd.print("   %");
        lcd.setCursor(16, 3);
        lcd.print(proz); // prozentuale Ausgabe des realen H2O-Pegels
      } // ende von "for ..... "

      delay(1000);

      // Das Fass ist noch nicht leer! xxxxxxxxxxxxxxxx
      if (entfernung <= minmax)
      {
        lcd.clear();
        lcd.setCursor(1, 1);
        lcd.print("Das Fass ist noch");
        lcd.setCursor(2, 2);
        lcd.print("= - V O L L - =");
        delay(1000);
        while (1); // --------------------- Programm angehalten !
      }  // ende von "if ..."

      // Das Fass ist leer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      if (entfernung > minmax)
      {
        schritt = 3;
      }  // ende von * IF *
      break; // Ende von "case 2"

    case 3:  // Wasser nachfüllen
      if (digitalRead(pumpe) == LOW) // Wenn Pumpe aus, dann einschalten
      {
        digitalWrite(pumpe, HIGH);

        lcd.clear();
        lcd.setCursor(14, 0);
        lcd.print("| Soll");
        lcd.setCursor(2, 1);
        lcd.print("Pumpe: EIN  |    %");
        lcd.setCursor(16, 1);
        lcd.print(var_h2o);
        lcd.setCursor(2, 2);
        lcd.print("Nachf\365llen  | IST:");
        lcd.setCursor(14, 3);
        lcd.print("|    %");
        lcd.setCursor(16, 3);
        lcd.print(proz);
        delay(2000);
      }  // ende von "if ..."
      lcd.setCursor(2, 0);
      lcd.print("Pumpe: EIN");
      lcd.setCursor(1, 1);
      lcd.print("            ");
      lcd.setCursor(2, 2);
      lcd.print("  es wird   ");
      lcd.setCursor(4, 3);
      lcd.print("bef\365llt! ");

      do
      {
        for (int h = 0; h < 3; h++)
        {
          digitalWrite(trigger, LOW);
          delay(5); //Dauer: 5 Millisekunden
          digitalWrite(trigger, HIGH);
          delay(10);
          digitalWrite(trigger, LOW);
          dauer = pulseIn(echo, HIGH);
          entfernung = (dauer / 2) * 0.03432;
          delay(1000);
        }  // ende von "for ..."

        if (entfernung > minh2o) // ( entfernung größer 70 cm )
        {
          entfernung = 70;
        }  // ende von "if ..."

        proz = map(entfernung, minh2o, maxh2o, 0, 99);

        lcd.setCursor(16, 1);
        lcd.print(var_h2o);
        lcd.setCursor(16, 3);
        lcd.print("   %");
        lcd.setCursor(16, 3);
        lcd.print(proz);
      }  // ende von "do ..."

      while (proz <= var_h2o); // Maximal vorgewählter Füllstand (ALLES IN % !!!)

      schritt = 4;

      break; // Ende von "case 3"

    case 4: // Fass ist voll = Pumpe ausschalten - Fertig-Meldung
      digitalWrite(pumpe, LOW);

      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print("F\365llstand   | Soll");
      lcd.setCursor(2, 1);
      lcd.print("erreicht !  |   %");
      lcd.setCursor(16, 1);
      lcd.print(var_h2o);
      lcd.setCursor(2, 2);
      lcd.print("Pumpe: AUS  | IST:");
      lcd.setCursor(2, 3);
      lcd.print("F E R T I G |   %");
      lcd.setCursor(16, 3);
      lcd.print(proz);
      delay(2000);

      while (1); // --------------------- Programm angehalten !
      break;

  } // Ende von "switch"

}  // Ende von "loop"









Bastelseite Versionen Aufbau Bauteile Programm Home


brixelweb.de