#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Belegung der Pins
byte pump_1 = 10;
byte pump_2 = 9;
byte input_switch0 = 7;
byte input_minus = 6;
byte input_plus = 5;
// Setzen der Variablen
byte pump_state = 0;
byte pump_status_1;
byte pump_status_2;
byte set_point = 80;
// Belegung der Sensoren
int moisture_sensor_1 = A1;
int moisture_sensor_2 = A2;
int moisture_value_1 = 0;
int moisture_value_2 = 0;
// Setzen der Taster-Variablen
bool button_read = false;
bool button_on = false;
bool switch0 = false;
bool button_plus = false;
bool button_minus = false;
// Setzen der Timer
unsigned long button_millis = 0;
unsigned long button1millis = 0;
unsigned long button2millis = 0;
unsigned long pump_millis = 0;
unsigned long lcd_millis = 0;
// Vorwärtsdeklaration der Funktionen
void updateLCD(int average_moisture_value_percent);
void controlPumps(int average_moisture_value_percent);
void setup() {
// Belegung der Pins
pinMode(pump_1, OUTPUT);
pinMode(pump_2, OUTPUT);
pinMode(input_switch0, INPUT_PULLUP);
pinMode(input_plus, INPUT_PULLUP);
pinMode(input_minus, INPUT_PULLUP);
pinMode(moisture_sensor_1, INPUT);
pinMode(moisture_sensor_2, INPUT);
// Initialisierung der Ausgänge, um unerwünschten Anlauf zu verhindern
pump_status_1 = HIGH;
pump_status_2 = HIGH;
digitalWrite(pump_1, pump_status_1);
digitalWrite(pump_2, pump_status_2);
// Initialisierung des Serial.Monitors
Serial.begin(9600);
// Initialisierung des LCD
lcd.init();
lcd.backlight();
// Begrüßung
lcd.setCursor(3, 0);
lcd.print("Tinti und Bear");
lcd.setCursor(2, 2);
lcd.print("Magische Pflanzen");
// 3 Sekunden anzeigen der Begrüßung
delay(3000);
// LCD löschen
lcd.clear();
}
void loop() {
// Zuweisung der Timer
unsigned long current_millis = millis();
unsigned long button_millis_elapsed = millis() - button_millis;
unsigned long pump_millis_elapsed = millis() - pump_millis;
unsigned long lcd_millis_elapsed = millis() - lcd_millis;
unsigned long button1millis_elapsed = millis() - button1millis;
unsigned long button2millis_elapsed = millis() - button2millis;
// Einlesen der Taster
button_read = digitalRead(input_switch0);
button_minus = digitalRead(input_minus);
button_plus = digitalRead(input_plus);
// Einlesen der Sensoren
moisture_value_1 = analogRead(moisture_sensor_1);
moisture_value_2 = analogRead(moisture_sensor_2);
// Mapping der Sensoren
int average_moisture_value = (moisture_value_1 + moisture_value_2) / 2;
int average_moisture_value_percent = map(average_moisture_value, 800, 380, 0, 100);
// Abschnitt für das LCD-Update und Serial.Monitor
if (lcd_millis_elapsed > 250) {
updateLCD(average_moisture_value_percent);
lcd_millis = millis();
}
// Implementierung des Toggle_Schalters
if (button_read == true) {
button_millis = millis();
}
if (button_read == false && button_on == false && button_millis_elapsed > 20) {
button_on = true;
}
if (button_read == true && button_on == true) {
button_on = false;
switch0 = !switch0;
pump_millis = millis();
}
// Abschnitt zum Einstellen des SetPoints
if (button_plus == false && button1millis_elapsed > 500) {
set_point++;
button1millis = millis();
}
if (button_minus == false && button2millis_elapsed > 500) {
set_point--;
button2millis = millis();
}
// Steuerung der Pumpen im Automatikbetrieb
controlPumps(average_moisture_value_percent);
}
// Funktion zum Aktualisieren des LCD
void updateLCD(int average_moisture_value_percent) {
Serial.print(" Switch0 == ");
Serial.print(switch0);
Serial.print("; Setpoint == ");
Serial.println(set_point);
Serial.print("D.Feucht. == ");
Serial.print(average_moisture_value_percent);
lcd.setCursor(0, 0);
lcd.print("Feuchtigkeit:");
lcd.setCursor(14, 0);
lcd.print(average_moisture_value_percent);
lcd.setCursor(16, 0);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("SetPoint :");
lcd.setCursor(14, 1);
lcd.print(set_point);
lcd.setCursor(16, 1);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Im Betrieb :");
if (pump_state == 1) {
lcd.setCursor(14, 2);
lcd.print("JA ");
} else {
lcd.setCursor(14, 2);
lcd.print("NEIN");
}
lcd.setCursor(0, 3);
lcd.print("Automatik :");
if (switch0) {
lcd.setCursor(14, 3);
lcd.print("ON ");
} else {
lcd.setCursor(14, 3);
lcd.print("OFF ");
}
}
// Funktion zur Steuerung der Pumpen
void controlPumps(int average_moisture_value_percent) {
unsigned long pump_millis_elapsed = millis() - pump_millis;
// Automatikbetrieb an/aus
if (switch0) {
if (average_moisture_value_percent <= (set_point - 2)) pump_state = 1;
if (average_moisture_value_percent >= (set_point + 2)) pump_state = 2;
switch (pump_state) {
case 1:
if (pump_millis_elapsed > 0 && pump_millis_elapsed <= 1000) {
pump_status_1 = LOW;
pump_status_2 = HIGH;
} else if (pump_millis_elapsed > 1000 && pump_millis_elapsed <= 61000) {
pump_status_1 = HIGH;
pump_status_2 = HIGH;
} else if (pump_millis_elapsed > 61000 && pump_millis_elapsed <= 62000) {
pump_status_1 = HIGH;
pump_status_2 = LOW;
} else if (pump_millis_elapsed > 62000 && pump_millis_elapsed <= 122000) {
pump_status_1 = HIGH;
pump_status_2 = HIGH;
} else if (pump_millis_elapsed > 122000) {
pump_millis = millis();
}
break;
case 2:
pump_status_1 = HIGH;
pump_status_2 = HIGH;
pump_millis = millis();
break;
}
} else {
// Automatikbetrieb ist aus
pump_status_1 = HIGH;
pump_status_2 = HIGH;
}
// Pumpenstatus aktualisieren
digitalWrite(pump_1, pump_status_1);
digitalWrite(pump_2, pump_status_2);
}