Hier der neu aufgebaute Code der Temperaturfühler:
#include <DallasTemperature.h> // library für Temperatursensoren
#include <OneWire.h> // library für den OneWire Bus
#include <LiquidCrystal.h>
#define DS1307_I2C_ADDRESS 0x68
#define ONE_WIRE_BUS 30
// Konstanten
const int backlight = 31; // Pin für die Display-Hintergrundbeleuchtung
const int fanPin = 3; // Pin für den Lüfter
// Variablen
int fanSpeed = 0; // Variable für die Lüftergeschwindigkeit
int fanMin = 90; // Kleinster PWM (z.B.110/41°C) Wert für den Lüfter befor er abschaltet
int fanOut = 1; // Variable um zu Prüfen, ob der Lüfter aus war
int tMin = 25; // Untere Grenze des Temperaturbereichs
int tMax = 60; // Obere Grenze des Temperaturbereichs
// Initialisierung des LCD
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
//DeviceAdressen der einzelnen ds1820 Temperatursensoren
DeviceAddress sensor1 = {
0x28, 0xAA, 0x86, 0x99, 0x4, 0x0, 0x0, 0x36 };
DeviceAddress sensor2 = {
0x28, 0x96, 0x5E, 0x99, 0x4, 0x0, 0x0, 0xC6};
DeviceAddress sensor3 = {
0x28, 0x36, 0x2F, 0x99, 0x4, 0x0, 0x0, 0x3A };
DeviceAddress sensor4 = {
0x28, 0x1B, 0x18, 0x99, 0x4, 0x0, 0x0, 0x13 };
DeviceAddress sensor5 = {
0x28, 0xFF, 0x94, 0x29, 0xB2, 0x15, 0x4, 0x82 };
DeviceAddress sensor6 = {
0x28, 0xFF, 0x62, 0x26, 0xB2, 0x15, 0x4, 0x22};
DeviceAddress sensor7 = {
0x28, 0xFF, 0xE2, 0x32, 0xB2, 0x15, 0x3, 0x5C };
DeviceAddress sensor8 = {
0x28, 0xFF, 0x66, 0x33, 0xB2, 0x15, 0x4, 0x84 };
DeviceAddress sensor9 = {
0x28, 0xFF, 0x5E, 0x4A, 0xB2, 0x15, 0x4, 0x5};
DeviceAddress sensor10 = {
0x10, 0x3C, 0x68, 0xA9, 0x1, 0x8, 0x0, 0xA3 };
//Objekte initialisieren
OneWire oneWire(ONE_WIRE_BUS); // OneWire initialisierung
DallasTemperature sensors(&oneWire); // DallasTemperature initialisierung
const unsigned long TEMP_POLLING_INTERVAL = 1000UL;
uint32_t nextMillis = 0;
uint8_t status;
float temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,temp9,temp0; // Variable für die Berechnung der Temperatur
float aktuelleTemp;
int numSensors; // Variable zum speichern der Anzahl der Temperatur-Sensoren
void setup(){
sensors.setWaitForConversion(false);
pinMode(backlight, OUTPUT); // Setzt den Pin der Display-Hintergrundbeleuchtung als Ausgang
pinMode(fanPin, OUTPUT); // Setzt den Pin des Lüfters als Ausgang
digitalWrite (backlight, HIGH); // Schaltet die Display-Hintergrundbeleuchtung ein
status = 0;
}
void loop(){
if (readTemperatureSensors() == true)
{ //hier wurde eine Messung abgeschlossen und man kann mit den Werten was machen
switch (status){
case 0:
if(numSensors > 0 && status == 0){ // Es wurde mindestens 1 Sensor gefunden
lcd.clear();
lcd.begin(16, 2);
lcd.print(numSensors);
lcd.print( "Temp.-Sensoren");
lcd.setCursor(0, 1);
lcd.print("gefunden.");
lcd.noCursor();
status = 1;
}
else {
lcd.clear();
lcd.begin(16, 2);
lcd.print("Keine Temp.Sen-");
lcd.setCursor(0, 1);
lcd.print("soren gefunden.");
lcd.noCursor();
status = 1;
}
break;
case 1:
if (temp1 != -127.00 && status == 1){
lcd.clear();
lcd.begin(16, 2);
lcd.print("01:");
lcd.setCursor(3, 0);
lcd.print(temp1);
lcd.setCursor(7, 0);
lcd.print((char)223); // degree symbol
lcd.print("C");
status = 2;
}
else {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Fehler Sensor01");
status = 2;
}
break;
case 2:
if (temp2 != -127.00 && status == 2){
lcd.clear();
lcd.begin(16, 2);
lcd.print("02:");
lcd.setCursor(3, 0);
lcd.print(temp2);
lcd.setCursor(7, 0);
lcd.print((char)223); // degree symbol
lcd.print("C");
status = 3;
}
else {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Fehler Sensor02");
status = 3;
}
break;
case 3:
if (temp3 != -127.00 && status == 3){
lcd.clear();
lcd.begin(16, 2);
lcd.print("03:");
lcd.setCursor(3, 0);
lcd.print(temp1);
lcd.setCursor(7, 0);
lcd.print((char)223); // degree symbol
lcd.print("C");
status = 4;
}
else {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Fehler Sensor03");
status = 4;
}
break;
case 4:
// Lüftergeschwindigkeit über den Seriellen Monitor ausgeben
if (status == 4) {
lcd.begin(16, 2);
lcd.print("L""\xF5""fterspeed: "); // Werte über RS232 Port ausgeben
lcd.setCursor(12, 0);
lcd.print(fanSpeed);
status = 5;
}
status = 0;
}
}
}
bool readTemperatureSensors()
{
static unsigned long previousMillis;
static bool dataRequested;
if(dataRequested == true && millis() - previousMillis > 200) //Die Zeit muss an die Auflösung angepasst werden. 200ms passt für 10 Bit
{
temp1 = sensors.getTempC(sensor1);
temp2 = sensors.getTempC(sensor2);
temp3 = sensors.getTempC(sensor3);
aktuelleTemp = max(temp0, temp1);
aktuelleTemp = max(aktuelleTemp, temp2);
aktuelleTemp = max(aktuelleTemp, temp3);
aktuelleTemp = max(aktuelleTemp, temp4);
aktuelleTemp = max(aktuelleTemp, temp5);
aktuelleTemp = max(aktuelleTemp, temp6);
aktuelleTemp = max(aktuelleTemp, temp7);
aktuelleTemp = max(aktuelleTemp, temp8);
aktuelleTemp = max(aktuelleTemp, temp9);
sensors.begin();
numSensors = sensors.getDeviceCount(); // Anzahl der angeschlossenen Sensoren in numSensors speichern
dataRequested = false;
previousMillis = millis();
return true;
}
if(dataRequested == false && millis() - previousMillis > TEMP_POLLING_INTERVAL)
{
sensors.requestTemperatures();
dataRequested = true;
previousMillis = millis();
}
return false;
// Lüftergeschwindigkeit über den Temperaturbereich einstellen
// TMin->0% PWM | TMax->100% PWM
fanSpeed = map(aktuelleTemp, tMin, tMax, 95, 255);
// Wenn der PWM Wert unter den van FanMin fällt, schaltet der Lüfter ab
if (fanSpeed < fanMin)
{
fanSpeed = 0;
fanOut = 1;
}
// Hysterese
if (fanOut == 1)
{
fanSpeed = 0;
}
if(aktuelleTemp >= 50)
{
if(fanOut == 1)
{
fanOut = 0;
analogWrite(fanPin,255); //überwindet die Trägheit beim Anlauf der Lüfter bei kleinen Drehzahlen
delay(500);
}
}
// PWM Wert auf 255 begerenzen
if (fanSpeed > 255)
{
fanSpeed = 255;
}
analogWrite(fanPin, fanSpeed);
}