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