Forum: Mikrocontroller und Digitale Elektronik Arduino friert ein nach 1-3h


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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

von Marian (phiarc) Benutzerseite


Lesenswert?

Schaltplan. Aufbau.

von Jogile (Gast)


Lesenswert?

Stefan schrieb:
> versorge und dabei das Serielle Interface auf habe.

und ohne daß du das serielle Interface auf hast?

von Stromverdichter (Gast)


Lesenswert?

Och menno, hat keiner ne Glaskugel?

von Georg (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hier der Aufbau

von Jürgen S. (jurs)


Lesenswert?

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?

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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

von stefanus (Gast)


Lesenswert?

Mach mal Pull-Up Widerstände an den I2C Bus, sowie einen Snubber an den 
Kontakt des Relais.

von Stromverdichter (Gast)


Lesenswert?

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

von Stromverdichter (Gast)


Lesenswert?

kannst du uns auch noch genau erklären/zeigen, wie deine 
Spannungsversorgung für das Arduino-Board aussieht?

von Jürgen S. (jurs)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@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!

von Stromverdichter (Gast)


Lesenswert?

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?

von Sascha W. (sascha-w)


Lesenswert?

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

von Stromverdichter (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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

von Ga R. (garath)


Lesenswert?

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.

von Philipp K. (philipp_k59)


Lesenswert?

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.

von Peter M. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Thomas (kosmos)


Lesenswert?

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
Noch kein Account? Hier anmelden.