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"