Hallo,
ich habe das Problem das der Arduino Uno immer einfriert, hängen bleibt.
Nur komischer weise nicht wenn ich ihn mit dem Notebook mit Strom
versorge und dabei das Serielle Interface auf habe.
In der Regel hängt er sich (so nach 1-3h) auf wenn das Relais 230V
wieder eingeschaltet wird. Ob sich irgendwie fehlerhafte Ströme
einschleichen? Ich weis es nicht und bin ein bisschen ratlos.
Der Code ist eigentlich sehr simpel, es soll einfach ein Relais an und
abgeschaltet werden, je nach dem ob die gewünschte Temperatur erreicht
ist oder nicht.
Schonmal vielen dank.
Mit freundlichen Grüßen
Stefan
Stefan schrieb:> Nur komischer weise nicht wenn ich ihn mit dem Notebook mit Strom> versorge und dabei das Serielle Interface auf habe.
Stromversorgung über unerwünschte Pfade? Ist aber zugegebenermassen nur
eine von 10000 Möglichkeiten.
Georg
@ Stefan (Gast)
>In der Regel hängt er sich (so nach 1-3h) auf wenn das Relais 230V>wieder eingeschaltet wird.
Das könnte ein EMV-Problem sein, siehe
Relais mit Logik ansteuern und
Snubber.
Stefan schrieb:> Der Code ist eigentlich sehr simpel, es soll einfach ein Relais an und> abgeschaltet werden, je nach dem ob die gewünschte Temperatur erreicht> ist oder nicht.
Wenn Du in die Schaltung genau so viele und so fette Kinken eingebaut
hast wie in diesen "sehr simpel" Code bei der Programmlogik, dann
wundert mich gar nichts.
Beispiel:
1
floattemp=1.3;//1.2aus //1.4an
2
...
3
longinterval=2000;
4
...
5
t=dht.readTemperature();
6
//Gefriertruhesteuerung
7
if(t>temp){digitalWrite(kuehlschrank,HIGH);
8
Serial.print("Temperatur: ");
9
Serial.print(t);
10
Serial.print(" *C ");
11
Serial.println("Kuehlschrank AN");
12
}else{
13
digitalWrite(kuehlschrank,LOW);
14
Serial.print("Temperatur: ");
15
Serial.print(t);
16
Serial.print(" *C ");
17
Serial.println("Kuehlschrank AUS");
18
}
Wenn Deine Temperatur nun an der Schwelle zwischen 1.3 und 1.4 ist, und
Dein Sensor infolgedessen immer abwechselnd springende Werte mißt, mal
1.3 und mal 1.4, dann springt Dein Kühlschrank immer im Zweisekundentakt
an und geht wieder aus.
Absicht?
Bei einer vernünftigen Temperaturregelung müßtest Du auch als
Arduino-Programmierer eine Hysterese berücksichtigen, so dass am
Umspringpunkt nicht ständig ein- und ausgeschaltet wird, weil die
Sensormesswerte um eine Stelle springen.
Schalten mit Hysterese von +/-0.1° Hysterese:
1
t=dht.readTemperature();
2
//Gefriertruhesteuerung
3
if(t>temp+0.1){digitalWrite(kuehlschrank,HIGH);
4
Serial.print("Temperatur: ");
5
Serial.print(t);
6
Serial.print(" *C ");
7
Serial.println("Kuehlschrank AN");
8
}elseif(t<temp-0.1){
9
digitalWrite(kuehlschrank,LOW);
10
Serial.print("Temperatur: ");
11
Serial.print(t);
12
Serial.print(" *C ");
13
Serial.println("Kuehlschrank AUS");
14
}
Mit dieser Logik würde Dein Kühlschrank dann
- bei t>temp+0.1 einschalten
- bei t<temp-0.1 ausschalten
Und bei t-0.1, t und t+0.1 würde der jeweils letzte Schaltzustand
beibehalten werden, so dass das Gerät nicht ständig ein und aus
geschaltet wird, wenn die Temperaturmessung in der Zehntelgrad Stelle
hin und her springt.
Eine Hysterese von nur +/-0.1°C ist schon recht klein, normalerweise
muss die Hysterese deutlich größer sein, besonders dann, wenn Du mit
mechanischen Relais schaltest. Sonst wirst Du ein mechanisches Relais in
kürzester Zeit wegen der Schalthäufigkeit ruiniert haben (Schau ins
Datenblatt, wieviele Schaltzyklen Dein Relais schafft, wenn es ein
mechanisches ist).
Bei der Steuerung des Luftbefeuchters übrigens genau dasselbe Problem,
keine Hysterese und daher ständiges Ein- und Ausschalten bei springenden
Messwerten am Schaltpunkt möglich.
Ansonsten zeige mal den vollständigen Schaltplan!
Die Abstürze dürften durch das Schalten Deiner induktiven Lasten
("Motoren") mittels mechanischer Relais in Kombination mit fehlenden
schaltungstechnischen EMV Schutzmaßnahmen zustande kommen.
Interessant ist insbesondere, was Du da am Relais verbaut hast:
- mechanisches Relais?
- "nacktes" Relais oder "Relais-Modul"?
- Snubber als Löschglied auf der 230V Seite?
Jürgen S. schrieb:> Interessant ist insbesondere, was Du da am Relais verbaut hast:> - mechanisches Relais?> - "nacktes" Relais oder "Relais-Modul"?> - Snubber als Löschglied auf der 230V Seite?> Ja es ist ein mechanisches Relais (K1CK005W)> Ja das Relais ist "nackt" bis auf ULN2003> Nein habe ich nicht, habe ich jetzt ein bisschen etwas drüber gelesen werde ich
einfügen
Mfg
Stefan
Du solltest mit dem ULN2003 gegen GND schalten. Die Speisespannung für
das Relais beziehst du besser nicht vom Regler des Arduino. So wirst du
Störungen von der Relais-Seite los. Also an das Relais sollten
1. +5Volt
2. Ausgang des ULN2003
Signal invertieren nicht vergessen
Stefan schrieb:>> Ja es ist ein mechanisches Relais (K1CK005W)>> Ja das Relais ist "nackt" bis auf ULN2003>> Nein habe ich nicht, habe ich jetzt ein bisschen etwas drüber gelesen werde ich> einfügen
Es fehlt offenbar nicht nur ein Snubber/Löschglied am Relaisausgang auf
der 230V Seite.
Sondern es fehlt auch die antiparallel geschaltete Freilaufdiode über
der Relaisspule.
Dein Relais produziert hinten und vorne nur EMV Störungen.
Damit beim Abschalten des Spulenstroms keine unzulässig hohe
Induktionsspannung auf Deinen Controller bzw. ULN2003 zurückwirkt,
benötigst Du für die Relaisspule eine Schutzdiode in der Schaltung.
Ich glaube, Du solltest mal einen Blick auf diese Seite werfen:
http://www.mikrocontroller.net/articles/Relais_mit_Logik_ansteuern
@Jürgen S. (jurs)
>Sondern es fehlt auch die antiparallel geschaltete Freilaufdiode über>der Relaisspule.
Nö, die ist im ULN2003 drin. COM ist angeschlossen.
@ Stromverdichter (Gast)
>Du solltest mit dem ULN2003 gegen GND schalten.
Das tut er.
>Die Speisespannung für>das Relais beziehst du besser nicht vom Regler des Arduino.
Das ist weniger kritisch.
> So wirst du>Störungen von der Relais-Seite los. Also an das Relais sollten>1. +5Volt>2. Ausgang des ULN2003
Liegt an.
>Signal invertieren nicht vergessen
Augen aufmachen nicht vergessen!
Falk Brunner schrieb:> @ Stromverdichter (Gast)>>>Du solltest mit dem ULN2003 gegen GND schalten.>> Das tut er.
Das tut er nicht!
Falk Brunner schrieb:>>Die Speisespannung für>>das Relais beziehst du besser nicht vom Regler des Arduino.>> Das ist weniger kritisch.
sehe ich anders, die Speisespannung des Arduinos bekommt einen Klapps,
das mag schonmal einen Reset auslösen oder im schlimmsten Fall den
Controller "einfrieren" ;-)
Falk Brunner schrieb:>> So wirst du>>Störungen von der Relais-Seite los. Also an das Relais sollten>>1. +5Volt>>2. Ausgang des ULN2003>> Liegt an.
liegt nicht an
ich bin doch nicht blind?
Stromverdichter schrieb:> Falk Brunner schrieb:>> @ Stromverdichter (Gast)>>>>>Du solltest mit dem ULN2003 gegen GND schalten.>>>> Das tut er.>> Das tut er nicht!> Falk Brunner schrieb:>>> So wirst du>>>Störungen von der Relais-Seite los. Also an das Relais sollten>>>1. +5Volt>>>2. Ausgang des ULN2003>>>> Liegt an.> liegt nicht an>> ich bin doch nicht blind?
doch ! Schau den Schaltplan noch mal genau an.
Sascha
Ich denke, jetzt geht es um den Begriff gegen GND schalten.
Ich verstehe das so, dass im Betriebsfall GND geschaltet ist, und nicht
wie hier 5Volt.
Wenn ich das falsch verstehe, möge man mir verzeihen.
Stromverdichter schrieb:> Ich denke, jetzt geht es um den Begriff gegen GND schalten.> Ich verstehe das so, dass im Betriebsfall GND geschaltet ist, und nicht> wie hier 5Volt.> Wenn ich das falsch verstehe, möge man mir verzeihen.
GND ist links am ULN (Pin8), COM ist der gemeinsame Anschluss der
Freilaufdioden - und der gehört an +5V.
Sascha
Sascha Weber schrieb:> GND ist links am ULN (Pin8), COM ist der gemeinsame Anschluss der> Freilaufdioden - und der gehört an +5V.>> Sascha
Autsch, dann nehm ich jetzt besser mal das mit dem GND zurück und
behaupte das Gegenteil. Hatte echt Tomaten auf den Augen.
Danke für die Aufklärung.
Trotzdem kann die eigene Speisung für das Relais Sinn ergeben.
Jürgen S. schrieb:> Dein Kühlschrank immer im Zweisekundentakt> an und geht wieder aus.
Als Tipp möchte ich meine einfache Strategie zu dem Thema mal kund tun.
Die ist sehr einfach gehalten:
Habe einen NTC am ADC des AVR mit einem Spindeltrimmer auf die
gewünschte
Kühltemperatur abgeglichen.
Die Software fragt nun nur noch ab, ob der ADC kippt oder nicht.
Die Hystere erzeuge ich über einen Timer.
Nach dem initialen Einschalten wird immer 5 Minuten gewartet,
weil man ja nicht weiß, ob es ein Stromausfall
war (Stecker gezogen, o.ä.) oder nicht.
Denn die Kühlkompressoren mögen es garnicht, wenn man sie im
betriebswarmen Zustand gleich wieder startet. Da gehen die Dinger sehr
schnell kaputt, weil sie gegen den hohen Druck der Kühlflüssigkeit
ankämpfen müssen.
Sind die 5 Minuten um, wird geschaut ob der ADC gekippt ist, also
gekühlt werden muss.
Ist das der Fall, dann wird der Kompressor gestartet. Und zwar für
mindestens 2 Minuten. Erst dann wird wieder der ADC abgefragt. Wenn der
sagt, dass es kühl genug ist, dann wird noch eine Minute Nachlauf dran
gehängt. Das bringt noch ein wenig Temperaturhysterese, d.h. ein klein
wenig kühler als eingestellt.
Dann wird wieder 5 Minuten gewartet. Und das ganze Prozedere geht wieder
von vorne los. Wie nach Power On.
Habe jetzt schon über 2 Jahre einen Kühlschrank mit dieser Technik am
Laufen. Meine Messungen der Temperatur bestätigen meine Taktik als
vernünftigen Ansatz, denn die Temperatur wird +-0.8 Grad konstant
gehalten.
Und das ist aus meiner Sicht Ok.
Habe im Anhang den ASM-Code von meiner Lüftersteuerung für mein
UMTS-Gateway, das im Freien ausgestellt ist, angehangen. Hier verwende
ich die gleiche Taktik. Da der Code relativ ausführlich dokumentier ist,
sollte er auch in C oder eine anderen Sprache umsetzbar sein.