| Bastelseite Versionen Aufbau Bauteile 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"