/*
* Name: Open_Smart_Shield_Template.ino
* Date: 2024/02/15
* Author: Felix Bernhardt
* Version 1.6 (mit 4 digit display)
* wokwi link: https://wokwi.com/projects/389816869731280897
*/
#include "DHT.h" // Bibliothek importieren für den DHT-Sensor
#include <TM1637.h> // Bibliothek für das 4-Digit-Display importieren
/*
mit liquid crystal library kann man das lcd display kontrollieren
https://support.arduino.cc/hc/en-us/articles/4894711239708-Use-an-LCD-with-Arduino?queryID=79fe7915f7fd085d8afd1cc248862612
*/
#include <LiquidCrystal_I2C.h>
// Definitionen für das LCD-Display
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse des LCD-Displays auf I2C-Bus
//LED-Nummern den Farben zuweisen für besseres Verstaendnis vom Code
#define ROT_LED 4
#define GRUEN_LED 5
#define BLAU_LED 6
#define GELB_LED 7
#define DHTPIN 12 // DHT an Pin 12
#define DHTTYPE DHT22 // 22 weil wokwi hier; bei Arduino IDE = DHT11
DHT dht(DHTPIN, DHTTYPE); // Objekt mit Parametern anlegen: Pin 12 und Type DHT22/11 (Wokwi: 22; Arduino IDE : 11)
float humidity, temperature; // Variablen fuer Luftfeuchtigkeit und Temperatur als float, da Kommazahlen genauer sind
const int min_wert = 20; // Minimaltemperatur auf 20 °C gesetzt
TM1637 TM1; // 4-Digit-Displayobjekt erstellen mit Namen TM1
/* Zum Testen bei der Codeentwicklung hier manueller max_wert und Temperatur Wert:
int max_wert = 30;
int temperature = 22;
*/
void setup() {
Serial.begin(9600); // Starten der seriellen Kommunikation (9600 bps)
dht.begin(); // DHT-Sensor starten
lcd.begin(16,2); // LCD-Bildschirm starten
pinMode(ROT_LED, OUTPUT); // LEDs starten
pinMode(GRUEN_LED, OUTPUT);
pinMode(BLAU_LED, OUTPUT);
pinMode(GELB_LED, OUTPUT);
pinMode(A0, INPUT); //A0 = Drehpotentiometer
TM1.begin(10, 11, 4); //4-Digit-Display starten: clockpin (gelbes Kabel), datapin (Gruenes Kabel), digits
}
void loop() {
humidity = dht.readHumidity(); // Wert Luftfeuchtigkeit
temperature = dht.readTemperature(); // Wert Temperatur
// Temperatur und Luftfeuchtigkeit auf dem LCD-Display anzeigen:
lcd.setCursor(0, 0); // Cursor auf Spalte 1 und Zeile 1 setzen
lcd.print("temp.: "); // Erste Zeile: Temperatur
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1); // Cursor auf Spalte 1 und Zeile 2 setzen
lcd.print("humidity: "); // Zweite Zeile : Luftfeuchtigkeit
lcd.print(humidity);
lcd.print("%");
//Max_wert ueber Drehpotentiometer einstellen:
int drehwert = analogRead(A0); // Maximale Temperatur wird zur Laufzeit aus dem Drehpotentiometer ausgelesen und abgespeichert
int max_wert = map(drehwert,0,1024,0,100); // Hier kann man die Range des Drehpotentiometers anpassen, Skalieren des max-wertes von 0-1024 auf 0-99, weil das vermutlich ein sinnvollerer Bereich ist
TM1.displayCelsius(max_wert, (max_wert < -9) || (max_wert > 99)); //displayCelsius() zeigt max_wert als °C an, geht aber nur von 0 bis 99 °C
/* Alternative zur Darstellung des eingestellten Max_wertes:
* Ausgabe von eingestellter Temperatur ueber Ausgabebilsschirm:
* Serial.println(max_wert);
*/
//Kontrollstrukturen für Temperaturbereiche:
if(temperature < min_wert){ //Messbereichsunterschreitung
digitalWrite(ROT_LED, LOW);
digitalWrite(GRUEN_LED, LOW);
digitalWrite(BLAU_LED,HIGH);
}
else{
if(temperature > max_wert){//Messbereichsueberschreitung
digitalWrite(ROT_LED, HIGH);
digitalWrite(GRUEN_LED, LOW);
digitalWrite(BLAU_LED, LOW);
}
else{ //im Messbereich
digitalWrite(ROT_LED, LOW);
digitalWrite(GRUEN_LED, HIGH);
digitalWrite(BLAU_LED, LOW);
}
}
delay(5000); // 5 Sekunden bis zur nächsten Messung warten
}