#include <DHT.h>
//#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
//int seconds = 0;
LiquidCrystal_I2C lcd_1(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
#define DHTPIN 6 //Pin an dem das OUT Signal angeschlossen ist.
#define RemConPIN 12 //Pin an dem das OUT Signal angeschlossen ist.
#define RelayPIN A0 //Pin an dem das OUT Signal angeschlossen ist.
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
IRrecv IR(RemConPIN);
decode_results results;
int Drehzahl_Am_Abluefter = 0;
float Ist_Temp = 0.00;
float Ist_Feuchte = 0.00;
float Soll_Temp = 25.00;
float Soll_Feuchte = 50.00;
int Max_Drehzahl = 100;
int Min_Drehzahl = 20;
int Hysterese = 6;
int Status = 0;
int seconds = 0;
int set_menu = 2;
int set_Value = 0;
unsigned long timeStart;
unsigned long timeNow;
int interval = 1000;
int interval_2 = 500;
//Input & Button Logic
const int numOfInputs = 4;
const int inputPins[numOfInputs] = {8,9,10,11};
int inputState[numOfInputs];
int lastInputState[numOfInputs] = {LOW,LOW,LOW,LOW};
bool inputFlags[numOfInputs] = {LOW,LOW,LOW,LOW};
long lastDebounceTime[numOfInputs] = {0,0,0,0};
long debounceDelay = 5;
//LCD Menu Logic
const int numOfScreens = 7;
int currentScreen = 0;
String screens[numOfScreens][2] = {{"Soll_Temp:","\337C"}, {"Soll_Feuchte:", "%"},
{"Max_Drehzahl:","%"}, {"Min_Drehzahl", "%"}, {"Hysterese:","\337C"},
{"Lampen_An:","Uhr"}, {"Lampen_Aus:","Uhr"}};//{"Ventilator_An:","Status"}, {"Ventilator_Aus:", "Status"}};
int parameters[numOfScreens]= {25,50,100,20,8,10,22};
void setup() {
timeStart = millis(); // Set timeStart to millis(); Zeit ab rechner start.
write_int(0, 25); //Write int 6789 to EEPROM @ address 0
write_int(2, 50); //Write int 6789 to EEPROM @ address 2
write_int(4, 100); //Write int 6789 to EEPROM @ address 4
write_int(6, 35); //Write int 6789 to EEPROM @ address 0
write_int(8, 6); //Write int 6789 to EEPROM @ address 0
write_int(10, 10); //Write int 6789 to EEPROM @ address 0
write_int(12, 22); //Write int 6789 to EEPROM @ address 0
for(int i = 0; i < numOfInputs; i++) {
pinMode(inputPins[i], INPUT_PULLUP);
//digitalWrite(inputPins[i], HIGH); // pull-up 20k
}
Serial.begin(9600);
lcd_1.init(); // initialize the lcd
lcd_1.backlight(); // turn on LCD Backlight
lcd_1.setCursor(3,0); // set the cursor on Spalte 4 von Zeile 1
lcd_1.print("Moinsen, Peter!"); // Print a message to the LCD.
lcd_1.setCursor(1,1);
lcd_1.print("Ich bins Arduino!");
lcd_1.setCursor(1,2);
lcd_1.print("LCD mit 20X4 I2C");
lcd_1.setCursor(1,3);
lcd_1.print("Power By Witucki!");
IR.enableIRIn(); // Start the receiver
pinMode(RelayPIN, OUTPUT);
dht.begin();
}
void loop() {
Ist_Feuchte = dht.readHumidity();
Ist_Temp = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(Ist_Temp) || isnan(Ist_Feuchte)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
//IR.decodedIRData.command IR.decoded
timeNow = millis();
if ((timeNow-timeStart)>=interval)
{
lcd_1.clear();
lcd_1.setCursor(0, 0);
lcd_1.print("Lueftersteuerung: ");
lcd_1.setCursor(0, 1);
lcd_1.print("Feuchtigkeit: ");
lcd_1.print(String(Ist_Feuchte)); //analogRead(0)
lcd_1.print("%");
lcd_1.setCursor(0, 2);
lcd_1.print("Temperatur: ");
lcd_1.print(String(Ist_Temp)); //analogRead(0)
lcd_1.print("\337C"); //lcd_1.print(\337); // \337 für °
Drehzahl_Am_Abluefter = ((Max_Drehzahl - Min_Drehzahl) / Hysterese) * (Ist_Temp - Soll_Temp) + Min_Drehzahl;
//Serial.println( String(Drehzahl_Am_Abluefter));
if (Drehzahl_Am_Abluefter > Max_Drehzahl) {
Drehzahl_Am_Abluefter = Max_Drehzahl;
}
else if (Drehzahl_Am_Abluefter < Min_Drehzahl) {
Drehzahl_Am_Abluefter = Min_Drehzahl;
}
lcd_1.setCursor(0,3);
lcd_1.print("Drehzahl: ");
lcd_1.print(Drehzahl_Am_Abluefter);
lcd_1.print("% LBF");
if (Soll_Feuchte - Ist_Feuchte >= 0) {
//Status = 1;
Serial.println("Luftbefeuchter: ");
Serial.println(String("AN"));
lcd_1.print("AN");
analogWrite(RelayPIN,1023);
}
else if (Soll_Feuchte - Ist_Feuchte < 0) {
//Status = 0;
Serial.println("Luftbefeuchter: ");
Serial.println(String("AUS"));
lcd_1.print("AUS");
analogWrite(RelayPIN,0);
}
Serial.print("Luftfeuchtigkeit: ");
Serial.print(Ist_Feuchte);
Serial.print("% Temperatur: ");
Serial.print(Ist_Temp);
Serial.println("°C ");
timeStart = timeNow;
}
setInputFlags(); // einlesen der tastendrücker
resolveInputFlags();
//resolveInputFlags_IR();
/*if (IR.decode()) {
translateIR();
IR.resume(); // Receive the next value
}*/
}
void setInputFlags() {
for(int i = 0; i < numOfInputs; i++) {
int reading = digitalRead(inputPins[i]);
if (reading != lastInputState[i]) {
lastDebounceTime[i] = millis();
}
if ((millis() - lastDebounceTime[i]) > debounceDelay) {
if (reading != inputState[i]) {
inputState[i] = reading;
if (inputState[i] == HIGH) {
inputFlags[i] = HIGH;
}
}
}
lastInputState[i] = reading;
}
}
void resolveInputFlags() {
for(int i = 0; i < numOfInputs; i++) {
if(inputFlags[i] == HIGH) {
inputAction(i);
inputFlags[i] = LOW;
printScreen();
}
}
}
/*
void resolveInputFlags_IR() {
for(int i = 0; i < numOfInputs; i++) {
if(inputFlags[i] == HIGH) {
inputAction(i);
inputFlags[i] = LOW;
printScreen();
}
}
}
*/
void inputAction(int input) {
if(input == 0) {
if (currentScreen == 0) {
currentScreen = numOfScreens-1;
}else{
currentScreen--;
}
}else if(input == 1) {
if (currentScreen == numOfScreens-1) {
currentScreen = 0;
}else{
currentScreen++;
}
}else if(input == 2) {
parameterChange(0);
}else if(input == 3) {
parameterChange(1);
}
}
void parameterChange(int key) {
if(key == 0) {
parameters[currentScreen]++;
}else if(key == 1) {
parameters[currentScreen]--;
}
}
void printScreen() {
lcd_1.clear();
Soll_Temp=parameters[0];
Soll_Feuchte=parameters[1];
Max_Drehzahl=parameters[2];
Min_Drehzahl=parameters[3];
Hysterese=parameters[4];
lcd_1.print(screens[currentScreen][0]);
lcd_1.setCursor(0,1);
lcd_1.print(parameters[currentScreen]);
lcd_1.print(" ");
lcd_1.print(screens[currentScreen][1]);
Serial.println(screens[currentScreen][0]);
Serial.println(parameters[currentScreen]);
}
int read_int(int address)
{
long byte_2 = EEPROM.read(address);
long byte_1 = EEPROM.read(address + 1);
int val = ((byte_2 << 0) & 0xFFFFFF) + ((byte_1 << 8) & 0xFFFFFFFF);
Serial.print("Read from EEPROM (Address: ");
Serial.print(address);
Serial.print(",");
Serial.print(address + 1);
Serial.print("):");
Serial.println(val);
return val;
}
void write_int(int address, int value)
{
byte byte_2 = (value & 0xFF);
byte byte_1 = ((value >> 8) & 0xFF);
EEPROM.update(address, byte_2);
EEPROM.update(address + 1, byte_1);
Serial.print("Write to EEPROM (Address: ");
Serial.print(address);
Serial.print(",");
Serial.print(address + 1);
Serial.print("):");
Serial.println(value);
}
void lcdPrint(char* text)
{
//lcd_1.clear();
//lcd_1.setCursor(0, 0);
//lcd_1.print("button pressed:");
Serial.println("button pressed:");
//lcd_1.setCursor(0, 1);
//lcd_1.print(text);
Serial.print(text);
//lcd_1.print(" code: ");
Serial.print(" code: ");
//lcd_1.print(IR.decodedIRData.command);
Serial.print(IR.decodedIRData.command);
//inputAction(IR.decodedIRData.command);
}
void translateIR()
{
//Serial.println("wert");
// Takes command based on IR code received
switch (IR.decodedIRData.command) {
case 162:
lcdPrint("POWER");
lcd_1.noBacklight();
break;
case 226:
lcdPrint("MENU");
lcd_1.backlight();
break;
case 34:
lcdPrint("TEST");
break;
case 2:
lcdPrint("PLUS");
parameters[currentScreen]=parameters[currentScreen]+1;
printScreen();
break;
case 194:
lcdPrint("BACK");
break;
case 224:
lcdPrint("PREV.");
if(currentScreen>0){
currentScreen=currentScreen-1;
printScreen();
}
break;
case 168:
lcdPrint("PLAY");
break;
case 144:
lcdPrint("NEXT");
if(currentScreen<(numOfScreens+1)){
currentScreen=currentScreen+1;
printScreen();
}
break;
case 104:
lcdPrint("num: 0");
break;
case 152:
lcdPrint("MINUS");
//Serial.println(currentScreen);
if(parameters[currentScreen]>0){
parameters[currentScreen]=parameters[currentScreen]-1;
printScreen();
}
break;
case 176:
lcdPrint("key: C");
break;
case 48:
lcdPrint("num: 1");
break;
case 24:
lcdPrint("num: 2");
break;
case 122:
lcdPrint("num: 3");
break;
case 16:
lcdPrint("num: 4");
break;
case 56:
lcdPrint("num: 5");
break;
case 90:
lcdPrint("num: 6");
break;
case 66:
lcdPrint("num: 7");
break;
case 74:
lcdPrint("num: 8");
break;
case 82:
lcdPrint("num: 9");
break;
default:
lcd_1.clear();
lcd_1.print(IR.decodedIRData.command);
lcd_1.print(" other button");
}
}