Hallo zusammen,
ich habe für unseren Wintergarten eine Temperatursteuerung gebaut. Ich hatte dafür schon einige Hilfe aus diesem Forum, da es jetzt aber um andere Probleme geht, beginne ich einen neuen Post. Der Weg hierher ist hier dokumentiert.
Meine Schaltung sieht wie folgt aus:
Hier noch einige Bilder vom Bau, bis zum fertigen Gehäuse:
Mein Sketch sieht momentan wie folgt aus:
/*
=====================================================================================================
Temperatursteuerung mit Arduino Nano, HD44780 20x4, DS18S20 Tempertursensor, zwei Buttons und Relais
=====================================================================================================
Code erstellt nach folgenden Tutorials:
https://deloarts.wordpress.com/2016/03/14/get-temperature-via-ds18b20/
https://www.arduino.cc/en/Tutorial/InputPullupSerial
https://www.arduino.cc/en/Tutorial/LiquidCrystalDisplay
https://forum.arduino.cc/index.php?topic=423688.0
=====================================================================================================
*/
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal lcd(7,8,9,10,11,12);
#define ONEWIRE_BUS 4
OneWire oneWire(ONEWIRE_BUS);
DallasTemperature oneWireSensors(&oneWire);
//Gehört zur Temperatur messung
int ActualTemp;
byte Devices = 0;
byte Address[8];
// Konstanten für Buttons
const int TempUp = 3; // Pin für TempUp Button
const int TempDown = 2; // Pin für TempDown Button
const int maxTemp = 25; // SetTemp max Limit
int SetTemp = 18; // Standard SetTemp
int interval = 1; // Erhöhungs intervall für SetTemp
const int relaisPin = 13; // Pin für Relais
unsigned long temp_timestore; // Variable Speicher für Systemzeit.
void setup()
{
//Display initialisieren
lcd.begin(20,4);
// Button Pins initialisieren
pinMode(TempUp, INPUT_PULLUP);
pinMode(TempDown, INPUT_PULLUP);
// One wire Module finden
oneWireSensors.begin();
while(oneWire.search(Address))
Devices++;
for (byte i = 0; i < 40; i++)
// Statischer Text
lcd.clear();
lcd.setCursor(0,0);
lcd.print(String("Temperature control"));
lcd.setCursor(0,2);
lcd.print(String("SetTemp : " + String(SetTemp) + (char)223 + "C"));
lcd.setCursor(0,3);
lcd.print(String(" Initializing"));
}
void loop()
{
//##################### Temp auslesen #######################################
// Temperatur Sensor auslesen; getTempCByIndex(0) => Index 0 entspricht erstem gefundenem Sensor
if (millis() - temp_timestore> 10000 ) { //Interval für Temp auslesen
oneWireSensors.requestTemperatures();
ActualTemp = oneWireSensors.getTempCByIndex(0);
// ActualTemp auf Display ausgeben
lcd.setCursor(0,1);
lcd.print(String("ActualTemp: " + String(ActualTemp) + (char)223 + "C"));
//########################## Relais schalten ###############################################
if (SetTemp > ActualTemp){
digitalWrite(relaisPin, LOW);
lcd.setCursor(0,3);
lcd.print(String(" Heating "));
}
if (SetTemp < ActualTemp){
digitalWrite(relaisPin, HIGH);
lcd.setCursor(0,3);
lcd.print(String("Temperature reached"));
temp_timestore = millis(); //Aktuelle Systemzeit speichern für nächsten Interval
}
//###################### Buttons überwachen ######################################
// Wenn der TempUp Button gedrückt wird, erhöhe die SetTemp um 1
if (digitalRead(TempUp) == LOW && SetTemp < maxTemp){
SetTemp = SetTemp + interval;
lcd.setCursor(0,2);
lcd.print(String("SetTemp : " + String(SetTemp) + (char)223 + "C"));
}
// Wenn der TempDown Button gedrückt wird, erniedrige die SetTemp um 1
if (digitalRead(TempDown) == LOW && SetTemp > 0){
SetTemp = SetTemp - interval;
lcd.setCursor(0,2);
lcd.print(String("SetTemp : " + String(SetTemp) + (char)223 + "C"));
}
//Verzögerung stellt empfindlichkeit der Buttons ein. Zu keiner Wert hat zu doppelklicks geführt
delay(300);
}
}
Nun aber zu meinem Problem. Wenn ich die Steuerung einschalte, läuft sie so wie es mir vorstelle. Nach kurzer Initialisierung, startet die Messung und die Temperatur wird über das Relais und eine elektrische Heizung gesteuert.
Aber dann passiert es, nach kurzer Zeit, dass das Relais unkontrolliert schaltet, das Display zeigt die aktuelle Temperatur nicht mehr an, oder auch gar nichts mehr... Ich habe dann auch keinen Zugriff mehr auf den Nano. Ein uploaden ist dann nicht mehr möglich. Nach einigen Stunden, ohne Strom, geht es dann aber wieder! Der Fehler passiert, ob ich den Nano über USB versorge, oder über den 5V pin gleichermassen.
Dieses Verhalten irritiert mich, da es so unreproduzierbar ist. Ich weiss einfach nicht wo ich da mit Fehlersuche ansetzen soll. Ich frage mich halt, ob ich in dem Sketch einen Fehler habe, der dies erklären würde, finde aber nichts...
Ich habe, wie ihr seht, den Nano direkt auf eine Platine gelötet. Kann es sein, dass ich ihn dabei "gegrillt" habe? Die Lötstellen habe ich alle durchgemessen, es liegt kein Kurzschluss vor.
Ich hoffe euch fällt etwas auf. Wenn es hilft, kann ich auch mal ein Video machen.
Grüße,
Torsten