#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#include <EEPROM.h>
//#include <DHT.h>
#include <dht.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 RemConPIN 8 //Pin an dem das OUT Signal angeschlossen ist.
IRrecv IR(RemConPIN);
decode_results results;
#define DHT22_PIN 5 // 8Pin an dem das OUT Signal angeschlossen ist.
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//DHT dht(DHT22_PIN, DHTTYPE);
dht DHT;
#define Relay_Pin A0
float Drehzahl_Am_Abluefter = 0; // %
float Ist_Temp = 0.00; // °C
float Ist_Feuchte = 0.00; // %
float Soll_Temp = 24.50; // °C
float Soll_Feuchte = 50.00; // %
float Max_Drehzahl = 100; // %
float Min_Drehzahl = 20; // %
float Hysterese = 6; // °C
unsigned long timeNow_0;
unsigned long timeStart_0;
int interval_0 = 1000;
int loops = 0;
//Input & Button Logic
const int numOfInputs = 4;
const int inputPins[numOfInputs] = {9,10,11,12};
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 = 10;
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"}, {"X", "Y"}};
float parameters[numOfScreens]= {25.5,50,100,20,8.5,10,22,0,0};
void setup() {
//write_int(0, 100); //Write int 6789 to EEPROM @ address 0
//write_int(2, 20); //Write int 6789 to EEPROM @ address 2
//write_int(4, 8); //Write int 6789 to EEPROM @ address 4
//write_int(6, 25); //Write int 6789 to EEPROM @ address 0
//write_int(8, 2200); //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
}
pinMode(Relay_Pin, OUTPUT);
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
//dht.begin();
timeStart_0 = millis(); // Set timeStart to millis(); Zeit ab rechner start.
}
void loop() {
int chk = DHT.read22(DHT22_PIN);
//Ist_Feuchte = dht.readHumidity();
//Ist_Temp = dht.readTemperature();
//delay(20);
// 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;
}*/
//if (loops == 0){
//lcd_1.clear();
// Serial.println(dht.readHumidity());
//Serial.print(",\t");
//Serial.println(dht.readTemperature());
//Serial.print(",\t");
//Serial.println("");
//Serial.println(Ist_Temp);
//Serial.println(Ist_Feuchte);
//Ausgabe();
//delay(500);
//loops = 1;
//}
setInputFlags();
resolveInputFlags();
//resolveInputFlags_IR();
if (IR.decode()) {
translateIR();
IR.resume(); // Receive the next value
}
//Serial.println(currentScreen);
}
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) {
if (currentScreen==0 | currentScreen ==4){
parameters[currentScreen]=parameters[currentScreen]+0.1;
}else{
parameters[currentScreen]++;
}
}else if(key == 1) {
if (currentScreen==0 | currentScreen ==4){
parameters[currentScreen]=parameters[currentScreen]-0.1;
}else{
parameters[currentScreen]--;
}
}
}
void printScreen() {
lcd_1.clear();
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]);
// wenn CurrentScreen = 9 dann hauptausgabe
Serial.println(currentScreen);
if (currentScreen == 9){
/*lcd_1.setCursor(0,1);
//Serial.println(currentScreen);
lcd_1.println(DHT.humidity, 1);
Serial.println(DHT.humidity, 1);
lcd_1.println(DHT.temperature, 1);
Serial.println(DHT.temperature, 1);*/
Ausgabe();
}
//Serial.println(Ist_Temp);
}
void Ausgabe(){
timeNow_0 = millis();
if ((timeNow_0-timeStart_0)>=interval_0)
{
lcd_1.clear();
lcd_1.setCursor(0, 0);
lcd_1.print("Lueftersteuerung: ");
lcd_1.setCursor(0, 1);
lcd_1.print("Feuchtigkeit: ");
lcd_1.print(DHT.humidity, 0);//(String(Ist_Feuchte)); //analogRead(0)
// Serial.print(DHT.humidity, 1);
lcd_1.print("%");
lcd_1.setCursor(0, 2);
lcd_1.print("Temperatur: ");
lcd_1.print(DHT.temperature, 1);//(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,0);
lcd_1.print("% LBF");
if (Soll_Feuchte - Ist_Feuchte >= 0) {
Serial.println("Luftbefeuchter: ");
Serial.println("AN");
lcd_1.print("AN");
digitalWrite(Relay_Pin,HIGH);
}
else if (Soll_Feuchte - Ist_Feuchte < 0) {
Serial.println("Luftbefeuchter: ");
Serial.println("AUS");
lcd_1.print("AUS");
digitalWrite(Relay_Pin,LOW);
}
//Ist_Feuchte
//Ist_Temp
Serial.print("Luftfeuchte: ");
Serial.print(Ist_Feuchte);
Serial.print("% Temperature: ");
Serial.print(Ist_Temp);
Serial.println("°C ");
timeStart_0 = timeNow_0;
}
}
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.println(IR.decodedIRData.command);
//inputAction(IR.decodedIRData.command);
}
void translateIR()
{
// Takes command based on IR code received
switch (IR.decodedIRData.command) {
case 162:
lcdPrint("POWER\n");
lcd_1.noBacklight();
break;
case 226:
lcdPrint("MENU\n");
lcd_1.backlight();
break;
case 34:
lcdPrint("TEST\n");
break;
case 2:
//lcdPrint("PLUS");
if (currentScreen==0 | currentScreen==4){
parameters[currentScreen]=parameters[currentScreen]+0.1;
printScreen();
} else {
parameters[currentScreen]=parameters[currentScreen]+1;
printScreen();
}
break;
case 194:
lcdPrint("BACK\n");
break;
case 224:
lcdPrint("PREV.\n");
currentScreen=currentScreen-1;
if (currentScreen<0){
currentScreen=0;
}
printScreen();
break;
case 168:
lcdPrint("PLAY\n");
break;
case 144:
lcdPrint("NEXT\n");
currentScreen++;
if (currentScreen>8){
currentScreen=9;
}
printScreen();
break;
case 104:
lcdPrint("num: 0\n");
break;
case 152:
lcdPrint("MINUS\n");
if (currentScreen==0 | currentScreen==4){
parameters[currentScreen]=parameters[currentScreen]-0.1;
printScreen();
} else {
parameters[currentScreen]=parameters[currentScreen]-1;
printScreen();
}
break;
case 176:
lcdPrint("key: C\n");
break;
case 48:
lcdPrint("num: 1\n");
break;
case 24:
lcdPrint("num: 2\n");
break;
case 122:
lcdPrint("num: 3\n");
break;
case 16:
lcdPrint("num: 4\n");
break;
case 56:
lcdPrint("num: 5\n");
break;
case 90:
lcdPrint("num: 6\n");
break;
case 66:
lcdPrint("num: 7\n");
break;
case 74:
lcdPrint("num: 8\n");
break;
case 82:
lcdPrint("num: 9\n");
break;
default:
lcd_1.clear();
lcd_1.print(IR.decodedIRData.command);
lcd_1.println(" other button");
}
}