#include <LiquidCrystal_I2C.h> // Library for LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C address 0x27, 20 column and 4 rows
#include "DHT.h"
#include <TimerOne.h>
//Eingänge
#define DHTPIN 8
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int analogPin = A0;
int val = 0;
bool wasser = false;
#define button 2
#define down 6
#define up 3
volatile int temp_soll = 20;
const unsigned long zeit = 1000000;
volatile int zaehler_timer;
bool lcd_update = false;
bool menu_merker = false;
int lcd_seite = 0;
int item_selected = 0;
// Pins für den Rotary Encoder
const int encoderPinA = 2;
const int encoderPinB = 3;
const int encoderButtonPin = 4;
volatile int menuIndex = 0; // Aktuelle Menüauswahl
const char* menuItems[] = {"Temp_Soll", "Temp_Hyst.", "Feuchte_Soll", "Feuchte Hyst"};
const int numMenuItems = sizeof(menuItems) / sizeof(menuItems[0]);
//################################################
void menu_aufruf() {
menu_merker = true;
//item_selected = 0;
//Serial.println(menu_merker);
}
//#############################
void zeitbasis() {
zaehler_timer++;
if (zaehler_timer == 10) {
//lcd_aktualisieren = 1;
}
if (zaehler_timer == 10) {
//Freigabe_Messung = 1;
//lcd_aktualisieren = 1;
//lcd_seite = 1;
}
if (zaehler_timer == 15) {
//lcd_aktualisieren = 1;
//zaehler_timer = 0;
}
}
void setup() {
Serial.begin(9600); // Setup der seriellen Verbindung
pinMode(button, INPUT);
pinMode(button, INPUT_PULLUP);
pinMode(down, INPUT);
pinMode(down, INPUT_PULLUP);
pinMode(up, INPUT);
pinMode(up, INPUT_PULLUP);
//Sensor initialisieren
dht.begin();
//LCD initialisieren
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
//Timer Interrupt
Timer1.initialize(zeit);
Timer1.attachInterrupt(zeitbasis);
// Rotary Encoder Setup
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(encoderButtonPin, INPUT_PULLUP);
// Attach Interrupts
attachInterrupt(digitalPinToInterrupt(encoderPinA), menuChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderPinB), menuChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderButtonPin), menuSelect, FALLING);
attachInterrupt(digitalPinToInterrupt(2), menu_aufruf, HIGH);
void wasserstandsmessung() {
val = analogRead(analogPin); // Pin einlesen
if (val > 1000) {
wasser = 1;
lcd_update = true;
lcd_seite = 0;
//Serial.println("Wasser im Behälter erkannt");
}
else {
wasser = 0;
lcd_update = true;
lcd_seite = 1;
//Serial.println("kein Wasser im Behälter");
}
}
void lcd_anzeige() {
if (((lcd_update == true) && (menu_merker == false))) {
lcd_update = false;
lcd.clear();
switch (lcd_seite) {
case 0:
lcd.setCursor(0, 0); //Text soll beim ersten Zeichen in der ersten Reihe beginnen..
lcd.print("Alle"); //In der ersten Zeile soll der Text „Test Zeile 1“ angezeigt werden
lcd.setCursor(0, 1); //Genauso geht es bei den weiteren drei Zeilen weiter
lcd.print("Messwerte");
lcd.setCursor(0, 2);
lcd.print("im");
lcd.setCursor(0, 3);
lcd.print("erlaubten Bereich");
break;
case 1: //Wassermangel
lcd.setCursor(0, 0); //Text soll beim ersten Zeichen in der ersten Reihe beginnen..
lcd.print("Kein"); //In der ersten Zeile soll der Text „Test Zeile 1“ angezeigt werden
lcd.setCursor(0, 1); //Genauso geht es bei den weiteren drei Zeilen weiter
lcd.print("Wasser");
lcd.setCursor(0, 2);
lcd.print("im");
lcd.setCursor(0, 3);
lcd.print("Behaelter!");
break;
}
}
if (menu_merker == true) {
//menu_merker = false;
lcd.clear();
switch (item_selected) {
case 0:
lcd.setCursor(0, 0); //Text soll beim ersten Zeichen in der ersten Reihe beginnen..
lcd.print(">Sollwert Temperatur"); //In der ersten Zeile soll der Text „Test Zeile 1“ angezeigt werden
lcd.setCursor(1, 1); //Genauso geht es bei den weiteren drei Zeilen weiter
lcd.print("Temperatur Hyster.");
lcd.setCursor(1, 2);
lcd.print("Sollw. Lu.-Feuchte");
lcd.setCursor(1, 3);
lcd.print("Lu.Feuchte Hyster");
break;
case 1:
lcd.setCursor(0, 0); //Text soll beim ersten Zeichen in der ersten Reihe beginnen..
lcd.print(" Sollwert Temperatur"); //In der ersten Zeile soll der Text „Test Zeile 1“ angezeigt werden
lcd.setCursor(1, 1); //Genauso geht es bei den weiteren drei Zeilen weiter
lcd.print(">Temperatur Hyster.");
lcd.setCursor(1, 2);
lcd.print(" Sollw. Lu.-Feuchte");
lcd.setCursor(1, 3);
lcd.print(" Lu.-Feuchte Hyster.");
break;
}
}
}
void loop() {
wasserstandsmessung();
if (menu_merker == true) {
if ((digitalRead(up))) {
item_selected++;
delay(100);
}
if ((digitalRead(down))) {
delay(100);
item_selected--;
}
}
lcd_anzeige();
Serial.println(zaehler_timer);
Serial.print(item_selected);
delay(1000);
}