#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_NeoPixel.h>
#include <dht.h>
#include <IRremote.hpp>
dht DHT;
#define IR_RECEIVE_PIN 2
#define DHT22_PIN 15
#define STRIP_PIN 14
#define NUM_PIXELS 16
#define MQ2pin 42
struct {
uint32_t total;
uint32_t ok;
uint32_t crc_error;
uint32_t time_out;
uint32_t connect;
uint32_t ack_l;
uint32_t ack_h;
uint32_t unknown;
} stat = { 0, 0, 0, 0, 0, 0, 0, 0};
Adafruit_NeoPixel strip(NUM_PIXELS, STRIP_PIN, NEO_GRB + NEO_KHZ800);
uint8_t brightness = 0;
int8_t direction = 1;
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
unsigned long vorherigeZeit = 0; // Speichert den letzten Schaltzeitpunkt
const long intervall = 500; // Wartezeit in Millisekunden
// LED Blink
unsigned long LED_vorherigeZeit = 0; // Speichert den letzten Schaltzeitpunkt
const long LED_intervall = 1000; // Wartezeit in Millisekunden
unsigned long gas_sensor_vorZeit = 0; // Speichert den letzten Schaltzeitpunkt
const long gas_sensor_intervall = 2000; // Wartezeit in Millisekunden
char LCD_Seite;
int counter = 0;
int counter_LCD = 0;
int counter_test = 0;
int counter_LCD_hinw = 0;
// Poti 1 - 4 Arduino A0 - A3
int analog_in[5];
boolean digital_in[9];
boolean digital_out[9];
int delay_info_lcd = 3000;
boolean status_LCD = 0;
boolean status_LCD2 = 0;
int geh_status = 5;
boolean test = 1;
float lux = 0;
float luftfeucht = 0;
float temperatur = 0;
int sensorValue; //variable to store sensor value
void initializeReceiver() {
// set up the receiver to receive input the NEW way- it changed from earlier versions)
IrReceiver.begin(IR_RECEIVE_PIN);
}
void setup()
{
Serial.begin(9600);
initializeReceiver();
strip.begin();
strip.show();
read_Analog_in();
// Init
lcd.init();
lcd.backlight();
// Relaise 1 - 8 Arduino 22 - 29
for (int i = 22; i <= 29; i++)
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
// Switch 1 - 8 Arduino 42 - 49
for (int i = 42; i <= 49; i++)
{
pinMode(i, INPUT);
digitalWrite(i, HIGH);
}
lcd.clear();
LCD_Seite_aktu();
}
int lastClk = HIGH;
void loop()
{
unsigned long aktuelleZeit = millis(); // Aktuelle Zeit abrufen
if ((aktuelleZeit - vorherigeZeit) > intervall)
{
vorherigeZeit = aktuelleZeit;
LCD_Seite_aktu();
}
read_digital_in();
read_Analog_in();
gas_sensor();
test = digitalRead(49);
if (IrReceiver.decode()) {
translateIR(); // calls our translate function
IrReceiver.resume(); // Receive the next value
//LCD_Seite_aktu();
vorherigeZeit = aktuelleZeit;
}
if ((digitalRead(42) == 0) && (geh_status == 10))
{
geh_status = 5;
lcd.clear();
lcd.setCursor(3, 1);
lcd.print("Gehaeuse: [OPRN]");
//lcd.setCursor(3, 2);
//lcd.print(geh_status);
delay(delay_info_lcd);
lcd.clear();
}
if ((digitalRead(42) == 1) && (geh_status == 5))
{
geh_status = 10;
lcd.clear();
lcd.setCursor(3, 1);
lcd.print("Gehaeuse: [CLOSE]");
// lcd.setCursor(3, 2);
// lcd.print(geh_status);
delay(delay_info_lcd);
lcd.clear();
}
led_stripe();
}
//////////////////////////////////////////////////////////////////////////////////////
void led_stripe()
{
if ((digitalRead(25) == 1) && (digitalRead(42) == 0))
{
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, strip.Color(255, 170, 0));
}
strip.show();
}
if ((digitalRead(25) == 1) && (digitalRead(42) == 1) && (analog_in[1] < 500))
{
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, strip.Color(0, 255, 0));
}
strip.show();
}
if ((digitalRead(25) == 0))
{
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
}
if (analog_in[1] > 500)
{
if (digitalRead(23) == 0)
{
digitalWrite(23, HIGH);
}
if (digitalRead(24) == 0)
{
delay(1000);
digitalWrite(24, HIGH);
}
LED_Stripe_RED_wish();
}
}
/////////////////////////////////////////////////////////////////////////////////////
void LCD_Seite_aktu()
{
switch (counter_LCD)
{
case 0:
LCD_seite_D();
break;
case 1:
LCD_seite_A();
break;
case 2:
LCD_seite_B2();
//lcd.setCursor(0, 1);
//lcd.print("b");
break;
case 3:
LCD_seite_B();
break;
case 4:
LCD_Relaise1();
break;
case 5:
LCD_Relaise2();
break;
case 6:
LCD_seite_A();
break;
case 7:
LCD_seite_A();
break;
}
}
//////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void LCD_hinweise()
{
switch (counter_LCD_hinw)
{
case 0:
lcd.setCursor(3, 1);
lcd.print("Laser faehrt");
lcd.setCursor(3, 2);
lcd.print("Umrandung ab");
delay(delay_info_lcd);
lcd.clear();
break;
case 1:
lcd.setCursor(0, 1);
if (digitalRead(22) == 0)
{
digitalWrite(22, HIGH);
lcd.print("Licht: [ON]");
}
else
{
digitalWrite(22, LOW);
lcd.print("Licht: [OFF]");
}
delay(delay_info_lcd);
lcd.clear();
break;
case 2:
lcd.setCursor(0, 1);
if (digitalRead(23) == 0)
{
digitalWrite(23, HIGH);
lcd.print("Loeftung: [ON]");
}
else
{
digitalWrite(23, LOW);
lcd.print("Loeftung: [OFF]");
}
delay(delay_info_lcd);
lcd.clear();
break;
case 3:
lcd.setCursor(0, 1);
if (digitalRead(24) == 0)
{
digitalWrite(24, HIGH);
lcd.print("Laser: [ON]");
}
else
{
digitalWrite(24, LOW);
lcd.print("Laser: [OFF]");
}
delay(delay_info_lcd);
lcd.clear();
break;
case 4:
lcd.setCursor(0, 1);
if (digitalRead(25) == 0)
{
digitalWrite(25, HIGH);
lcd.print("Steckdosen: [ON]");
}
else
{
digitalWrite(25, LOW);
lcd.print("Steckdosen: [OFF]");
}
delay(delay_info_lcd);
lcd.clear();
break;
case 5:
LCD_Relaise2();
break;
case 6:
LCD_seite_A();
break;
case 7:
LCD_seite_A();
break;
}
}
void LCD_start()
{
// Print something
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Notaus: ");
lcd.print(digital_in[7]);
lcd.setCursor(0, 1);
lcd.print("B: Digital IN 42-49");
lcd.setCursor(0, 2);
lcd.print("C: Digital OUT 22-29");
lcd.setCursor(0, 3);
lcd.print("D: ");
lcd.print(counter_LCD);
}
void LCD_seite_A()
{
//lcd.clear();
//lcd.setCursor(19, 3);
//lcd.print("A");
lcd.setCursor(0, 0);
lcd.print("Spg. Laser: ");
lcd.setCursor(14, 0);
lcd.print(analog_in[0]);
lcd.setCursor(0, 1);
lcd.print("Strom Laser:");
lcd.setCursor(14, 1);
lcd.print(analog_in[1]);
lcd.setCursor(0, 2);
lcd.print("Strom Laser:");
lcd.setCursor(14, 2);
lcd.print(analog_in[2]);
lcd.setCursor(0, 3);
lcd.print("Strom Laser:");
lcd.setCursor(14, 3);
lcd.print(analog_in[3]);
}
//////////////////////////////////////////////////////////////////////////////////////
void LCD_seite_B()
{
//lcd.clear();
//lcd.setCursor(19, 3);
//lcd.print("B");
int i2 = 4;
for (int i = 0; i <= 3; i++)
{
lcd.setCursor(13, i);
if (digital_in[i2] == 0)
{
lcd.print("[ON]");
}
else
{
lcd.print("[OFF]");
}
i2++;
//lcd.setCursor(18, i);
//lcd.print(digital_in[i2]);
//i2++;
}
lcd.setCursor(0, 0);
lcd.print("Switch 5: ");
lcd.setCursor(0, 1);
lcd.print("Switch 6: ");
lcd.setCursor(0, 2);
lcd.print("Switch 7: ");
lcd.setCursor(0, 3);
lcd.print("Switch 8: ");
}
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void LCD_seite_B2()
{
//lcd.clear();
//lcd.setCursor(19, 3);
//lcd.print("B");
int i2 = 1;
lcd.setCursor(13, 0);
if (digital_in[0] == 0)
{
lcd.print("[OPEN]");
}
else
{
lcd.print("[CLOSE]");
}
for (int i = 1; i <= 3; i++)
{
lcd.setCursor(13, i);
if (digital_in[i2] == 0)
{
lcd.print("[ON]");
}
else
{
lcd.print("[OFF]");
}
i2++;
//lcd.setCursor(18, i);
//lcd.print(digital_in[i2]);
//i2++;
}
lcd.setCursor(0, 0);
lcd.print("Gehaeuse: ");
lcd.setCursor(0, 1);
lcd.print("Licht: ");
lcd.setCursor(0, 2);
lcd.print("Lueftung: ");
lcd.setCursor(0, 3);
lcd.print("Laser: ");
}
//////////////////////////////////////////////////////////////////////////////////////
void LCD_Relaise1()
{
//lcd.clear();
//lcd.setCursor(19, 3);
//lcd.print("B");
int i2 = 0;
for (int i = 0; i <= 3; i++)
{
lcd.setCursor(13, i);
if (digital_out[i2] == 1)
{
lcd.print("[ON]");
}
else
{
lcd.print("[OFF]");
}
//lcd.setCursor(18, i);
//lcd.print(digital_in[i2]);
//i2++;
}
lcd.setCursor(0, 0);
lcd.print("Relaise 1: ");
lcd.setCursor(0, 1);
lcd.print("Relaise 2: ");
lcd.setCursor(0, 2);
lcd.print("Relaise 3: ");
lcd.setCursor(0, 3);
lcd.print("Relaise 4: ");
}
//////////////////////////////////////////////////////////////////////////////////////
void LCD_Relaise2()
{
//lcd.clear();
//lcd.setCursor(19, 3);
//lcd.print("B");
int i2 = 4;
for (int i = 0; i <= 3; i++)
{
lcd.setCursor(13, i);
if (digital_out[i2] == 0)
{
lcd.print("[ON]");
}
else
{
lcd.print("[OFF]");
}
i2++;
//lcd.setCursor(18, i);
//lcd.print(digital_in[i2]);
//i2++;
}
lcd.setCursor(0, 0);
lcd.print("Relaise 5: ");
lcd.setCursor(0, 1);
lcd.print("Relaise 6: ");
lcd.setCursor(0, 2);
lcd.print("Relaise 7: ");
lcd.setCursor(0, 3);
lcd.print("Relaise 8: ");
}
//////////////////////////////////////////////////////////////////////////////////////
void LCD_seite_D()
{
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Luftf.: ");
lcd.setCursor(14, 0);
lcd.print(luftfeucht, 1);
/*if (lux > 50) {
lcd.print("Light!");
} else {
lcd.print("Dark ");
}*/
lcd.setCursor(0, 1);
lcd.print("Temperatur: ");
lcd.setCursor(14, 1);
lcd.print(temperatur, 1);
lcd.setCursor(0, 2);
lcd.print("Lux: ");
lcd.setCursor(14, 2);
lcd.print(lux);
lcd.setCursor(0, 3);
lcd.print("Gas Sensor: ");
lcd.setCursor(14, 3);
lcd.print(analogRead(5));
delay(100);
}
/////////////////////////////////////////////////////////////////////////////////////
void Start_auto()
{
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Licht [ON]");
delay(2500);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Lueftung [ON]");
delay(2500);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Start Programm");
delay(2500);
}
void read_Analog_in()
{
for (int i = 0; i <= 5; i++)
{
analog_in[i] = 0;
analog_in[i] = analogRead(i);
}
}
// Switch 1 - 8 Arduino 42 - 49
void read_digital_in()
{
int i2 = 0;
for (int i = 42; i <= 99; i++)
{
digital_in[i2] = digitalRead(i);
i2++;
}
i2 = 0;
for (int i = 22; i <= 29; i++)
{
digital_out[i2] = digitalRead(i);
i2++;
}
}
void LED_Stripe_RED_wish()
{
brightness += direction * 3;
if (brightness >= 255 || brightness <= 0)
{
direction = -direction;
brightness = constrain(brightness, 0, 255);
}
for (int i = 0; i < NUM_PIXELS; i++) {
// Offset each pixel's brightness for a wave effect
uint8_t b = (brightness + i * 18) % 255;
strip.setPixelColor(i, strip.Color(b, 0, b / 4));
}
strip.show();
// delay(10);
}
/*void LED_Stripe_OFF()
{
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
delay(30);
}*/
void LED_Stripe_GREEN()
{
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, strip.Color(0, 255, 0));
}
strip.show();
delay(30);
}
void LED_Stripe_RED()
{
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, strip.Color(255, 0, 0));
}
strip.show();
//delay(30);
}
void LED_Stripe_RED_blink()
{
unsigned long LED_aktuelleZeit = millis(); // Aktuelle Zeit abrufen
// Prüfe, ob die gewünschte Zeitspanne vergangen ist
if (LED_aktuelleZeit - LED_vorherigeZeit >= 1000)
{
LED_vorherigeZeit = LED_aktuelleZeit;
/*for (int i = 0; i < NUM_PIXELS; i++)
{
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
delay(30);*/
}
if (LED_aktuelleZeit - LED_vorherigeZeit >= 500)
{
//LED_vorherigeZeit = LED_aktuelleZeit;
for (int i = 0; i < NUM_PIXELS; i++)
{
strip.setPixelColor(i, strip.Color(255, 0, 0));
}
strip.show();
delay(30);
}
else
{
for (int i = 0; i < NUM_PIXELS; i++)
{
strip.setPixelColor(i, strip.Color(0, 0, 255));
}
strip.show();
delay(30);
}
}
void lux_meter()
{
int analogValue = analogRead(A4);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
}
void dht()
{
// READ DATA
//Serial.print("DHT22, \t");
uint32_t start = micros();
int chk = DHT.read22(DHT22_PIN);
uint32_t stop = micros();
stat.total++;
luftfeucht = DHT.humidity, 1;
temperatur = DHT.temperature, 1;
}
void gas_sensor()
{
unsigned long gas_sensor_aktuelleZeit = millis(); // Aktuelle Zeit abrufen
// Prüfe, ob die gewünschte Zeitspanne vergangen ist
if ((gas_sensor_aktuelleZeit - gas_sensor_vorZeit) >= gas_sensor_intervall)
{
gas_sensor_vorZeit = gas_sensor_aktuelleZeit;
sensorValue = digitalRead(MQ2pin);
dht();
lux_meter();
/*if (sensorValue) {
Serial.println(" | Smoke: -");
} else {
Serial.println(" | Smoke: Detected!");
}*/
}
}
void NOTAUS()
{
}
void lcdPrint(char* text) {
lcd.clear();
lcd.setCursor(0, 0); // set cursor for text to print in top left row/column
lcd.print("button pressed:");
lcd.setCursor(0, 1); // move cursor to print to next line.
lcd.print(counter_LCD);
lcd.print(" code: ");
lcd.print(IrReceiver.decodedIRData.command);
}
void translateIR() {
// Takes command based on IR code received
switch (IrReceiver.decodedIRData.command) {
case 162:
lcdPrint("POWER");
break;
case 226:
lcdPrint("MENU");
break;
case 34:
counter_LCD_hinw = 0;
lcd.clear();
LCD_hinweise();
break;
case 224:
if (counter_LCD > 0)
{
counter_LCD--;
lcd.clear();
LCD_Seite_aktu();
}
break;
case 194:
break;
case 2:
lcdPrint("PREV.");
break;
case 168:
lcdPrint("PLAY");
break;
case 144:
if (counter_LCD < 7)
{
counter_LCD++;
lcd.clear();
LCD_Seite_aktu();
}
break;
case 104:
lcdPrint("num: 0");
break;
case 152:
lcdPrint("MINUS");
break;
case 176:
lcdPrint("key: C");
break;
case 48:
counter_LCD_hinw = 1;
lcd.clear();
LCD_hinweise();
break;
case 24:
counter_LCD_hinw = 2;
lcd.clear();
LCD_hinweise();
break;
case 122:
counter_LCD_hinw = 3;
lcd.clear();
LCD_hinweise();
break;
case 16:
counter_LCD_hinw = 4;
lcd.clear();
LCD_hinweise();
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.clear();
lcd.print(IrReceiver.decodedIRData.command);
lcd.print(" other button");
}
}