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: > versorge und dabei das Serielle Interface auf habe. und ohne daß du das serielle Interface auf hast?
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 | float temp = 1.3; //1.2aus //1.4an |
2 | ...
|
3 | long interval = 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 | } else if (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
Mach mal Pull-Up Widerstände an den I2C Bus, sowie einen Snubber an den Kontakt des Relais.
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
kannst du uns auch noch genau erklären/zeigen, wie deine Spannungsversorgung für das Arduino-Board aussieht?
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.
Hab das gleiche Problem wenn ich den DHT11 im Code hinzufüge.. bis dahin klappt das.. nur so eine Idee konnte mich noch nicht weiter drum kümmern.
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.
Ich würde die Hysterese größer machen um den Kompressor möglichst wenig anzuwerfen. Das kommt der Lebensdauer und des Verbrauchs zugute.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.