Klimabox
🧩 Syntax:
/*
* Name: klimabox.ino
* Date: 2022/05/24
* Author: DG JoMo
* Version 2.0
* Wokwi-Simulation Arduino-Modul1
*
* https://wokwi.com/arduino/projects/313505435680244288
*/
//Anschlüsse und Parameter
//verwendete Bibliotheken
#include <LiquidCrystal_I2C.h> //für LCD Display
#include "DHT.h" //für Temperatursensor
/*
Klasse für die LEDs
- Konstruktor mit Übergabe des Pins der LED und Einstellen des Pinmodes
- Methode zur Aktivierung der LED
- Methode zur Deaktivierung der LED
- Methode zur Statusabfrage der LED (höchstwahrscheinlich unbenutzt)
=> kann auch in externe Datei (z.B. LED.h) ausgelagert und importiert werden
*/
class LED{
public:
LED(int pin){
_pin = pin;
pinMode(_pin, OUTPUT);
}
void activate(){
digitalWrite(_pin, HIGH);
}
void deactivate(){
digitalWrite(_pin, LOW);
}
boolean getStatus(){
return digitalRead(_pin);
//returned 0 oder 1
}
private:
//Privat, da Pin nicht manipuliert werden soll
int _pin;
};
// Poti
const int Poti = A0; // Anschlusspin Drehpotentiometer
//Tasten - Bitte den interne PullUp-Widerstand verwenden,
// in der Funktion pinMode INPUT_PULLUP einstellen!!
// Beispiel: pinMode(KEY1, INPUT_PULLUP);
const int KEY1 = 8; // Pin der Taste für rote LED
const int KEY2 = 9; // Pin der Taste für blaue LED
//Buzzer
const int SPEAKER = 3; // Anschlusspin Buzzer
//DHT22
#define DHTPIN 12 // DHT22 an Pin 12
#define DHTTYPE DHT22 // DHT22 auswählen
DHT dht(DHTPIN, DHTTYPE); // Objekt mit Parameter
// LCD-Typ festlegen
LiquidCrystal_I2C lcd(0x27, 16, 2); // LDC mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27.
//LED Objekte erzeugen
LED led_red(4);
LED led_green(5);
LED led_blue(6);
LED led_yellow(7);
//Liste der LEDs
LED LEDs[] = {led_red, led_green, led_blue, led_yellow};
//Konstante für die Verzögerung
const int measuredelay = 1000;
//Konstante für die minTemp
const float minTemp = 20;
//Dekleration der maxTemp Variable für die maximale Temperatur
float maxTemp;
//Dekleration der temp Variable für die aktuelle Temperatur
float temp;
//Dekleration der hum Variable für die aktuelle Luftfeuchtigkeit
float hum;
//Dekleration der analogValue Variable für die aktuelle Potentiometerstellung
int analogValue;
void setup()
{
dht.begin();
lcd.init();
//Pinmode für KEY1 auf Pullup
pinMode(KEY1, INPUT_PULLUP);
}
void loop()
{
//Wartezeit der Schleife aus Konstante measuredelay
delay(measuredelay);
//Analoger Wert wird aus Drehpotentiometer ausgelesen und in analogValue Variable gespeichert
analogValue = analogRead(Poti);
//Maximale Temperatur: Wird anhand der Poti Stellung berechnet => getMaxTemp()
//maxTemp kann zwischen einschließlich 21 und 80 Grad liegen
maxTemp = getMaxTemp(analogValue, 0, 1023, 21, 80);
//Aktuelle Temperatur wird aus Sensor ausgelesen und in temp Variable gespeichert
temp = dht.readTemperature();
//Aktuelle Luftfeuchtigkeit wird aus Sensor ausgelesen und in hum Variable gespeichert
hum = dht.readHumidity();
/*
Wenn der Temperaturwert nicht nan ist, werden die Werte angezeigt,
ansonsten wird eine Fehlernachricht ausgegeben und die gelbe LED aktiviert
Ist dies permanent der Fall, beachte #define DHTTYPE DHT22/DHT11, bzw DHT Pin
*/
if(!isnan(temp)){
//Temperatur Fallbehandlung => Aktivierung der entsprechenden LEDs
if(temp >= minTemp){
if(temp > maxTemp){
//Temperatur höher als Max-Wert = rote LED
activateSingleLED(led_red);
}else{
//Temperatur größer/gleich als Min-Wert, aber kleiner/gleich Max-Wert = grüne LED
activateSingleLED(led_green);
}
}else{
//Temperatur niedriger als Min-Wert = blau LED
activateSingleLED(led_blue);
}
//Löschen des aktuellen LCD Display Inhalts
lcd.clear();
//Wenn der KEY1 nicht gedrückt ist, zeige Messdaten
if(digitalRead(KEY1) != LOW){
//Zeile 1 des LCDs
lcd.print(String("Temp.: ") + temp + String("C"));
lcd.setCursor(0, 1);
//Zeile 2 des LCDs
lcd.print(String("Luftf.: ") + hum + String("%"));
}else{
//Wenn der KEY1 gedrückt gehalten wird, zeige Einstellungen (MIN/MAX Werte)
//Zeile 1 des LCDs
lcd.print(String("Einstellungen:"));
//Zeile 2 des LCDs
lcd.setCursor(0, 1);
lcd.print(String("Min:") + int(minTemp) + String("C Max:") + int(maxTemp) + String("C"));
}
}else{
//Ungültige Temperatur = Gelbe Lampe aktivieren
activateSingleLED(led_yellow);
//Löschen des aktuellen LCD Display Inhalts
lcd.clear();
//Fehlernachricht ausgeben
lcd.println("ERROR 404");
}
}
/*
Funktion zur Aktivierung einer einzelnen LED
- Die zu aktivierende LED wird übergeben
- Alle LEDs werden ausgeschaltet
- Die zu aktivierende LED wird aktiviert
*/
void activateSingleLED(LED inputled){
//Schleife durch alle LEDs des Arrays LEDs
for(LED led : LEDs){
//LED deaktivieren
led.deactivate();
}
//Übergebene LED wird aktiviert
inputled.activate();
}
/*
Funktion zur Umrechnung der Poti-Stellungen
Die analogen Potentiometer Werte (0-1023) werden in eine
Max-Temperatur umgerechnet und zurückgegeben (21-80 Grad)
*/
float getMaxTemp(float x, float in_min, float in_max, float out_min, float out_max){
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}