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;
}