Pages: [1]   Go Down
Author Topic: HIGH/LOW prüfen?  (Read 418 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hab eine sehr simple Frage, ist es notwendig im loop() vor einer PIN Schaltung in den "LOW" bzw. "HIGH" zu überprüfen, ob der Status bereits erreicht worden ist? Oder anders gefragt ist, es ein Problem einen Lüfter ständig auf LOW zu setzen, obwhol er bereits auf LOW steht.

Kann man das so schreiben?
Bsp.
Code:
fVal = digitalRead(fan_airflowIn_Pin);
if (pValue >= "22.000") {

digitalWrite(fan_airflowIn_Pin, HIGH);
}
else {

digitalWrite(fan_airflowIn_Pin, LOW);
}
oder doch besser so:
Code:
fVal = digitalRead(fan_airflowIn_Pin);
if (pValue >= "22.000") {

if (fVal != HIGH) { digitalWrite(fan_airflowIn_Pin, HIGH); }
}
else {

if (fVal != LOW) { digitalWrite(fan_airflowIn_Pin, LOW); }
}
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du musst die Einstellung nicht prüfen. Es ist kein Unterschied, wenn Du ein bereits LOW gesetztes Pin nochmal auf LOW setzt. Am Zustand des Pins wird sich nichts ändern.
Mario.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank für die Erklärung  smiley
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3040
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank für die Erklärung  smiley

Vorsicht: Wenn das Code für eine Temperaturregelung ist, sind beide Codevarianten EXTREM KRITISCH!

Und das Problem liegt nicht darin, wo Du es gesehen hast, sondern das Problem ist die fehlende Hysterese beim Schalten.

Zur Erläuterung: Wenn Du in schneller Folge Temperaturen ausliest, dann ergeben sich an den Umschaltpunkten immer Messfolgen, die in der letzten Stelle springen. D.h. wenn Du bei Temperatur 22.000 bist und Temperaturen in Hundertstel Grad misst, dann könntest Du nacheinander messen:
19.990
20.000
19.990
20.000
19.990
20.000
19.990
19.990
19.990
20.000
Und wenn Du hundert solche Messungen in der Sekunde machst und mit Deiner Schaltlogik schaltest, dann schaltest Du (und zwar mit beiden Codes) einige zigmal pro Sekunde den Lüfter ein und aus.

Wenn Du ein mechanisches Relais angeschlossen hast, dann rattert das am Schaltpunkt unter Umständen los wie ein Maschinengewehr und ist in kürzester Zeit ruiniert.

Und wenn Du elektronisch schaltest, ist das ewige AN und AUS zigmal pro Sekunde für den Lüfter auch nicht gut.

Wenn der Lüfter die Temperatur nach dem Einschalten schnell runterkühlt, kann es auch zu einem intermittierenden Betrieb führen, d.h. Du mißt  20.000, schaltest den Lüfter ein, drei Sekunden später hast Du wieder 19.990 und der Lüfter geht aus. Dann schaltet er immer drei Sekunden an, drei Sekunden aus, drei Sekunden an, drei Sekunden aus etc.

Für ordentlich geschaltete Zweipunktregler ist es daher zwingend notwendig, eine Hysterese vorzusehen, d.h. einen Unterschied zwischen der Einschalttemperatur und der Ausschalttemperatur des Heiz- oder Kühlgeräts. Und in der Zwischenzone wird immer der letzte Schaltzustand beibehalten.

Beispielcode:
Code:
fVal = digitalRead(fan_airflowIn_Pin);
if (pValue >= "22.500") {

digitalWrite(fan_airflowIn_Pin, HIGH);
}
else if (pValue < "21.500"){

digitalWrite(fan_airflowIn_Pin, LOW);
}

Dann schaltet der Lüfter an, wenn 22.500 überschritten werden.
Und der Lüfter schaltet aus, wenn 21.500 unterschritten werden.
Und in der Zone dazwischen bleibt der Schaltzustand so, wie er zuletzt gesetzt war.

Insbesondere bei Verwendung mechanischer Relais ist eine nicht zu kleine Hysterese zwingend notwendig; Viele Relais sind ja laut Datenblatt nur für eine Million Schaltungen garantiert, und je häufiger ein mechanisches Relais schaltet, desto eher ist das Lebensende des Bauteils erreicht.

Bei verschleißfreier elektronischer Ein-/Ausschaltung kann die Hysterese geringer sein, aber sie muss mindestens so gross sein, dass sie oberhalb der bei Messungen "springenden letzten Stelle" liegt.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du hast Recht, das ist Code für eine Temperatursteuerung smiley-grin Es ist kein Relais, welches geschaltet wird sondern wird eletronisch angesteuert. Änderungswerte kommen alle 2 min von einem php Skript. Trotzdem hab ich deinen Vorschlag umgesetzt. Vielen Dank dafür.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21661
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Schaltspiele beziehen sich auf den mechanischen Teil des Relais. Die Kontakte wenn sie Strom schalten können auch viel weniger Schaltspiele vertragen.
Grüße Uwe
Logged

Pages: [1]   Go Up
Jump to: