Forum: Mikrocontroller und Digitale Elektronik Arduino hängt sich auf :-(


von Mario S. (mariost)


Lesenswert?

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

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Sieh Dir mal Deine While Zuweisung an, dann kommst Du gleich drauf;-)
Ist ein klassischer Fall. Passiert jedem Mal.

Gerhard

von Mario S. (mariost)


Lesenswert?

Hallo Gerhard,

ich bin "blind"...

Können Sie mir bitte meinen Fehler beschreiben.

MfG Mario.

von Gerhard O. (gerhard_)


Lesenswert?

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.

: Bearbeitet durch User
von Mario S. (mariost)


Lesenswert?

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

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

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.

von Mario S. (mariost)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.