Nachdem ich die ersten Probleme mit Hilfe dieses hervorragenden Forums lösen konnte habe ich 2 DHT11 und ein 2 Zeilen Display an den UNO angeschlossen.
Was mich als Neuling wundert die Sensoren sind auf dem Steckbrett 4 cm auseinander,zeigen aber unterschiedliche werte an.
Den Code habe ich im WWW gefunden und auf meine Bedürfnisse angepasst.
Da kommt bestimmt die Frage zum Code .
/* Original Code von Dräger IT
Anpassung an DHT11
am 3.3.25
erweitert 2'tes Relais
2'ten Sensor
*/
//Bibliothek zum speichern & lesen von Daten
//aus dem internen Speicher
#include <EEPROM.h>
//Bibliothek zum entprellen eines Tasters
#include <Bounce2.h>
//Bibliotheken um mit dem LCD-Display zu
//kommunizieren
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//DHT Bibliothek um den Temperatursensor
//DHT11 auszulesen
#include "DHT.h" //DHT Bibliothek wird laden
//Die Relais sind an den digitalen Pins D10 / D11 angeschlossen.
#define relais 10
#define relais1 11
//Der Sensor ist an PIN 2 (D2) angeschlossen
#define DHTPIN 2
//Der Sensor ist an PIN 2 (D2) angeschlossen
#define DHTPIN1 4
//Es handelt sich um den DHT11 Sensor
#define DHTTYPE DHT11
//Taster "select" am digitalen Pin D12 angeschlossen.
#define tasterSelect 7 // #### 12 gegen 7
//Taster "hoch" am digitalen Pin D5 angeschlossen.
#define tasterHoch 8 // #### 5 gegen 8
//Taster "runter" am digitalen Pin D2 angeschlossen.
#define tasterRunter 12 // #### 2 gegen 12
//minimale Temperatur
int minTemp, minTemp1 = 18;
//maximale Temperatur
int maxTemp, maxTemp1 = 22;
//aktuelle Temperatur
int currentTemp, currentTemp1;
//Bounce2 Objekte für die Taster
Bounce btnSelect = Bounce();
Bounce btnUp = Bounce();
Bounce btnDown = Bounce();
//Intervall für das entprellen der Taster
const int BTN_INTERVALL = 25;
//Auswahl
//0 - min. Temperatur einstellen
//1 - max. Temperatur einstellen
//2 - aktuelle Temperatur
//3 - min. Temperatur1 einstellen
//4 - max. Temperatur1 einstellen
//5 - aktuelle Temperatur
int auswahl = 5;
// Initialisieren des LCD Displays mit der I2C Adresse 0x27
LiquidCrystal_I2C lcd(0x27, 20, 2);
// Initialisieren des Tempsensors wird mit „dht" initiiert
DHT dht(DHTPIN, DHTTYPE);
// Initialisieren des Tempsensors wird mit „dht" initiiert
DHT dht1(DHTPIN1, DHTTYPE);
//Intervall in welcher der Sensor gelesen werden soll
const int INTERVALL = 2000;
//Feld zum speichern des Zeitstempels der letzten Aktualisierung.
long lastUpdate = 0L;
const int ADRESSE_MINTEMP = 30;
const int ADRESSE_MAXTEMP = 40;
void setup() {
//der Pin des Relais als Ausgang definieren
pinMode(relais, OUTPUT);
pinMode(relais1, OUTPUT);
// Eingefügt
Serial.begin(9600); //Serielle Verbindung starten 9600
//lief mit 115600 nicht weil nicht eingestellt
dht.begin(); //DHT Sensor starten
dht1.begin(); //DHT Sensor starten
// ######################
//beginn der Kommunikation mit dem LCD-Display
lcd.init();
lcd.backlight();
//Initialisieren der Taster
//die Taster sind über den internen 10 kOhm Widerstand verbunden
btnSelect.attach(tasterSelect, INPUT_PULLUP);
btnSelect.interval(BTN_INTERVALL);
btnUp.attach(tasterHoch, INPUT_PULLUP);
btnUp.interval(BTN_INTERVALL);
btnDown.attach(tasterRunter, INPUT_PULLUP);
btnDown.interval(BTN_INTERVALL);
//lesen der Werte aus dem internen Speicher
//beim erstmaligen Upload sind die Werte -1
minTemp = readFromEEPROM(ADRESSE_MINTEMP);
maxTemp = readFromEEPROM(ADRESSE_MAXTEMP);
writeLcdDisplay();
}
void writeToEEPROM(int adresse, int wert) {
EEPROM.write(adresse, wert >> 8);
EEPROM.write(adresse + 1, wert & 0xFF);
}
int readFromEEPROM(int adresse) {
return (EEPROM.read(adresse) << 8) + EEPROM.read(adresse + 1);
}
//Schreibt eine Zeile auf dem Display
void printTextAt(int lineNumber, int column, String text) {
lcd.setCursor(column, lineNumber);
lcd.print(text);
}
//Beschreibt das Display mit Text in abhängigkeit mit der
//aktuellen Auswahl.
void writeLcdDisplay() {
lcd.backlight();
lcd.clear();
if (auswahl < 2) {
printTextAt(0, 0, auswahl == 0 ? ">" : " ");
printTextAt(1, 0, auswahl == 1 ? ">" : " ");
printTextAt(0, 1, "min. Temp.:" + String(minTemp, DEC));
printTextAt(1, 1, "max. Temp.:" + String(maxTemp, DEC));
} else if (auswahl == 2) {
printTextAt(0, 0, " max. Temp.:" + String(maxTemp, DEC));
printTextAt(1, 0, ">akt. Temp.:" + String(currentTemp, DEC));
} else if (auswahl == 3) {
printTextAt(0, 0, ">min1. Temp.:" + String(minTemp1, DEC));
printTextAt(1, 1, "max1. Temp.:" + String(maxTemp1, DEC));
} else if (auswahl == 4) {
printTextAt(0, 1, "min1. Temp.:" + String(minTemp1, DEC));
printTextAt(1, 0, ">max1. Temp.:" + String(maxTemp1, DEC));
} else if (auswahl == 5) {
printTextAt(0, 0, "akt. Temp.:" + String(currentTemp, DEC));
printTextAt(1, 0, "akt1. Temp.:" + String(currentTemp1, DEC));
} else {
}
//schreiben der Werte für minTemp & maxTemp in den internen Speicher
// gilt nur für Temp nicht zugefügt Temp1
writeToEEPROM(ADRESSE_MINTEMP, minTemp);
writeToEEPROM(ADRESSE_MAXTEMP, maxTemp);
}
void loop() {
//aktualisieren der Taster
btnSelect.update();
btnUp.update();
btnDown.update();
//Wenn der Taster "select" gedrückt wurde, dann...
if (btnSelect.fell()) {
if (auswahl < 6) {
auswahl++;
} else {
auswahl = 0;
}
writeLcdDisplay();
}
//Wenn der Taster "hoch" gedrückt wurde, dann...
if (btnUp.fell()) {
if (auswahl == 0) {
minTemp += 1;
} else if (auswahl == 1) {
maxTemp += 1;
} else if (auswahl == 3) {
minTemp1 += 1;
} else if (auswahl == 4) {
maxTemp1 += 1;
}
writeLcdDisplay();
}
//Wenn der Taster "runter" gedrückt wurde, dann...
if (btnDown.fell()) {
if (auswahl == 0) {
minTemp -= 1;
} else if (auswahl == 1) {
maxTemp -= 1;
} else if (auswahl == 3) {
minTemp1 -= 1;
} else if (auswahl == 4) {
maxTemp1 -= 1;
}
writeLcdDisplay();
}
//Wenn der Zeitpunkt der letzten Ausführung plus dem Wert
//des INTERVALLs kleiner als die aktuellen Millisekunden sind, dann...
if ((lastUpdate + INTERVALL) < millis()) {
//auslesen der Temperatur in Grad Celsius
float a = dht.readTemperature();
// wandeln des float wertes
// in integer
currentTemp = (int)a;
//auslesen der Temperatur in Grad Celsius
float a1 = dht1.readTemperature();
// wandeln des float wertes
// in integer
currentTemp1 = (int)a1;
//überschreiben des Wertes für die letzte Ausführung
lastUpdate = millis();
//nur wenn die Auswahl auf 5 steht dann soll das LCD-Display aktualisiert werden
//(Auswahl 5 zeigt die aktuelle Temperatur an)
if (auswahl == 5) {
writeLcdDisplay();
}
//Wenn die gelesene Temperatur kleiner / gleich als der Wert der Konstante MIN_TEMP ist,
//dann soll das Relais aktiviert werden.
if (currentTemp <= minTemp) {
digitalWrite(relais, LOW);
Serial.println("min");
} else if (currentTemp >= maxTemp) {
//Ist der gelesene Wert jedoch größer / gleich als der Wert der Konstante MAX_TEMP so
//soll das Relais deaktiviert werden.
digitalWrite(relais, HIGH);
Serial.println("max");
}
if (currentTemp1 <= minTemp1) {
digitalWrite(relais1, LOW);
Serial.println("min1");
} else if (currentTemp >= maxTemp) {
//Ist der gelesene Wert jedoch größer / gleich als der Wert der Konstante MAX_TEMP so
//soll das Relais deaktiviert werden.
digitalWrite(relais1, HIGH);
Serial.println("max1");
}
// Ausgabe zum Test
Serial.println(a);
Serial.println(a1);
Serial.println(currentTemp);
//Serial.println(minTemp);
//Serial.println(maxTemp);
Serial.println(auswahl);
//Serial.println();
//
}
}
Gruß Walter
