Hallo,
ich bin neu in diesem Forum und hoffe ihr könnt mir bei meinem Problem
helfen.
Das Projekt gehört zu eine Hausautomatisierung und soll eine Heizung in
der Werkstatt steuern.
Der Brenner soll bei Betätigung eines "Schalters" starten und bei einer
Temperatur von 75°C abschalten sowie der Lüfter bei 30°C an- und unter
30°C ausgeschaltet werden soll.
Die Regelung des Brenners und des Lüfters abhängig von der Temperatur
funktioniert.
Mit dem "Schalter" kann ich den Vorgang zwar starten aber nicht beenden.
Ich habe schon sämtliche Varianten versucht es funktioniert aber nichts.
Für jede Hilfe bin ich dankbar.
1 | #include <OneWire.h>
| 2 | #include <DallasTemperature.h>
| 3 | #define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */
| 4 | OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */
| 5 | DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */
| 6 | DeviceAddress DS18B20_Brenner = { 0x28, 0xFF, 0x91, 0xC6, 0x01, 0x15, 0x03, 0x58 };
| 7 | const int brenner_ausgang=10;
| 8 | const int luefter_ausgang=12;
| 9 | int Brenner_an=8;
| 10 |
| 11 |
| 12 | void setup() {
| 13 | Serial.begin(9600);
| 14 | sensors.begin();/* Inizialisieren der Dallas Temperature library */
| 15 | sensors.setResolution(DS18B20_Brenner, 10);
| 16 | pinMode (luefter_ausgang,OUTPUT);
| 17 | pinMode (brenner_ausgang,OUTPUT);
| 18 | pinMode(Brenner_an,INPUT);
| 19 | }
| 20 |
| 21 | void loop() {
| 22 | while (digitalRead(Brenner_an)==HIGH){
| 23 | sensors.requestTemperatures(); // Temp abfragen
| 24 | if (sensors.getTempC(DS18B20_Brenner)> 75){
| 25 | digitalWrite(brenner_ausgang,LOW);}
| 26 | else {digitalWrite(brenner_ausgang,HIGH);}
| 27 | if (sensors.getTempC(DS18B20_Brenner)> 30){
| 28 | digitalWrite(luefter_ausgang,HIGH);}
| 29 | else{ digitalWrite(luefter_ausgang,LOW);}
| 30 | // if (digitalRead(Brenner_an)==LOW);{break;}
| 31 | }
| 32 | }
|
--
Für Quelltexte bitte die Sourcecode-Tags [ c ] [ /c ] verwenden
-rufus
Sieh Dir mal Deine While Zuweisung an, dann kommst Du gleich drauf;-)
Ist ein klassischer Fall. Passiert jedem Mal.
Gerhard
Hallo Gerhard,
ich bin "blind"...
Können Sie mir bitte meinen Fehler beschreiben.
MfG Mario.
Mario S. schrieb:
> Hallo Gerhard,
>
> ich bin "blind"...
>
> Können Sie mir bitte meinen Fehler beschreiben.
>
> MfG Mario.
Ich bin gerne dazu bereit. Trotzdem bitte ich das while noch einmal zu
studieren. Das problem starrt Dir wirklich in das Gesicht.
Hint: brenner_an Status. Was passiert mit den ganzen tests in der while
loop sobald sich der Zustand auf Falsch ändert?
Es ist besser für Dich das selber zu lösen.
Studiere auch nochmals die Sprachenreferenz für die While Zuweisung.
P.S. In einem Forum vermeidet man das Siezen. Du ist normale Anrede in
Foren.
Ich habe das Ganze jetzt anders gelöst.
1 | #include <OneWire.h>
| 2 | #include <DallasTemperature.h>
| 3 | #define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */
| 4 | OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */
| 5 | DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */
| 6 | DeviceAddress DS18B20_Brenner = { 0x28, 0xFF, 0x91, 0xC6, 0x01, 0x15, 0x03, 0x58 };
| 7 | const int brenner_ausgang=10;
| 8 | const int luefter_ausgang=12;
| 9 | int Brenner_an=8;
| 10 | int buttonstate=0;
| 11 |
| 12 | void setup() {
| 13 | Serial.begin(9600);
| 14 | sensors.begin();/* Inizialisieren der Dallas Temperature library */
| 15 | sensors.setResolution(DS18B20_Brenner, 10);
| 16 | pinMode (luefter_ausgang,OUTPUT);
| 17 | pinMode (brenner_ausgang,OUTPUT);
| 18 | pinMode(Brenner_an,INPUT);
| 19 | attachInterrupt(1, loop, RISING);
| 20 | }
| 21 |
| 22 | void loop() {
| 23 |
| 24 | if (digitalRead (Brenner_an)==HIGH){
| 25 | sensors.requestTemperatures(); // Temp abfragen
| 26 | if (sensors.getTempC(DS18B20_Brenner)> 75){
| 27 | digitalWrite(brenner_ausgang,LOW);}
| 28 | else {digitalWrite(brenner_ausgang,HIGH);}
| 29 | if (sensors.getTempC(DS18B20_Brenner)> 30){
| 30 | digitalWrite(luefter_ausgang,HIGH);}
| 31 | else{ digitalWrite(luefter_ausgang,LOW);}
| 32 | // if (digitalRead(Brenner_an)==LOW);{break;}
| 33 | }
| 34 | else { digitalWrite(luefter_ausgang,LOW);
| 35 | digitalWrite(brenner_ausgang,LOW);
| 36 | }
| 37 | }
|
Für eine bessere Lösung bin ich sehr dankbar.
--
s.o.
-rufus
Ich hätte da eine Frage: Ist der Eingangs-Pin "Brenner_An" an den
Hauptschalter angeschlossen oder überwacht der den Zustand des Heizers?
Wenn der Pin low ist, dann passiert in Deiner Loop gar nichts mehr und
schaltet alles ab und der letzte Zustand bleibt für immer erhalten.
Brenner_An hätte nur als Hauptschalter Sinn um das Program absichtlich
lahm zu schalten. Ich nehme also an , dass Dein Brenner_An nur zur
Aktivierung oder Deaktivierung der Steuerung dienen soll.
Der interrupt ist nicht notwendig und sollte auf keinen Fall auf die
loop() hinzeigen. nimm ihn wieder weg.
Teste auch mit einem Led ob Brenner_An tatsächlich gelesen wird (Pull Up
vorhanden?)
Lese den Brenner_An in eine Variable und steuere eine LED an damit Du
sicher sein, daß dieser Zustand tatsächlich erfaßt wird.
Deine erste while loop war auch nicht notwendig weil sich loop()
andauernd wiederholt.
Auch hast Du keine Hysteresis bei den Tests. Da schaltet sich der
Brenner unnötig oft ein. Ich würde eine Hysteresis setzen. Bei 75 aus
und erst bei 70 ein. Das Gleiche beim Lüfter.
Versuche, später einen Timer Interrupt zu erstellen, so dass die
Überwachung viel langsamer erfolgt, sagen wir 1s oder noch längerer
Pausenintervall.
Brenner_an dient als "Hauptschalter" als Sicherheit der den Loop auf
einem extra Atmega 328 schaltet.
Der Interrupt war nur ein Test, ich habe nur vergessen ihn zu entfernen.
Natürlich wird das ganze erst mit Led´s getestet, es wäre ja Wahnsinn
einen Brenner zu starten ohne vorher zu testen ob alles SICHER
funktioniert.
Zu der Hysteresis komme ich noch, ich wollte nur erstmal das eine
Problem beseitigt haben:-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|