Forum: Mikrocontroller und Digitale Elektronik instabiles Projekt - Arduino Nano -2 Stromquellen - PT100 - DS18B20


von Matthias M. (sturze)



Lesenswert?

Hallo an Alle,

##Beschreibung
i hab (versucht) einen Controller für eine Destille zu bauen. Im 
speziellen für den Heizer dafür.

Die Temperautur des Kessels wir mit einem DS18B20 gemessen und 
angezeigt.
Um die Maximaltemperatur festzulegen und zu ändern gibts zwei Trigger 
(up/down).
Der Code schaltet dann dementsprechend ein Relay an/aus, bis die 
Temperatur erreicht ist.
Der PT100 gibt die Temperatur des Kühlers und für ein "Not-Aus"
Ist der Kühler zu heiß, schaltet er ebenfalls den heizer aus und macht 
lärm (relay nr.2)

##Probleme

1. der Sensorwert den ich über A0 bekomme (vom PT100 am Messwandler) ist 
nicht stabil (schwankt bis zu 2-3 Grad C) und ich weiß nicht wieso. 
Gemessen ohne allem mit dem Multimeter am Messwandler sieht das sehr 
stabil aus. Das war mir dann irgendwann egal, für die Notabschaltung 
reicht es jedenfalls dachte ich. Ich erwähne es trotzdem, nicht dass 
hier schon die Ursache liegt.

2. Der Rest funktionierte erstmal für ca 2 Stunden super, und dann gings 
richtig los... alles wurde irgendwie... naja instabil
3. Das Relay schaltete, mal an mal aus... konnte aber so schnell gar 
nicht kucken, dann wars wieder an, und irgendwie zeigt seit dem
4. bekomme ich bei der Temperatur vom DS18B20 immer wieder mal 85Grad, 
was (soweit ich gelesen hab) so viel heißt wie nicht sauber 
angeschlossen. Was aber irgendwie auch nicht sein kann, weil er das 
WIRKLICH ist. Kann auch mit dem Multimeter durch messen, die Leitungen 
zum Sensor passen.

Der Code selbst (was ich die 2 Stunden testen konnte) funktioniert 
tadellos.
Irgendwie lässt mich das Gefühl nicht los, dass ich irgendwo in der 
Elektronik/"so wie ich das zusammen gemurkst hab"
liegt.

Wär echt klasse, wenn mir wer sagen könnte was ich hier verbockt hab.

: Bearbeitet durch User
von Toxic (Gast)


Lesenswert?

Matthias M. schrieb:
> i hab (versucht) einen Controller für eine Destille zu bauen.

Zu deinem Projekt selbst moechte ich nichts beisteuern.Ich nehme an,dass 
du das aus Freude am Hobby machst.
Es gibt aber auf dem Markt fuer deine Zwecke fertige Loesungen fuer 
weniger als 10€.
Ich will dir auf keinen Fall den Spass beim Eigenbau verderben - soll 
nur ein Hinweis sein....

https://www.ebay.de/itm/DST1000-DC12-72V-AC110-220V-Temperature-Controller-Thermostat-and-DS18B20-Probe/401674631125?hash=item5d85ac77d5:m:mWOyTn1V-Kb_E8yg7yovUJA

von Wolfgang (Gast)


Lesenswert?

Matthias M. schrieb:
> Wär echt klasse, wenn mir wer sagen könnte was ich hier verbockt hab.

Zeige zu deinem Steckbild mal den Schaltplan, damit man sieht, was das 
werden soll.

von Matthias M. (sturze)


Lesenswert?

Toxic schrieb:
> Zu deinem Projekt selbst moechte ich nichts beisteuern.

schade

> Es gibt aber auf dem Markt fuer deine Zwecke fertige Loesungen fuer
> weniger als 10€.

Danke! Das stimmt, leider aber nicht erweiterbar, die Notabschaltung mit 
dem 2. Sensor geht z.B. damit nicht, da bräuchte ich ja ein zweites 
davon...

Wirklich keine Tipps/Idee was da nicht stimmt?

von K. S. (the_yrr)


Lesenswert?

Matthias M. schrieb:
> bekomme ich bei der Temperatur vom DS18B20 immer wieder mal 85Grad,

überprüfst du den CRC? wenn nicht mach dies und verwirf den 
Messwert/messe erneut wenn der falsch ist.

Matthias M. schrieb:
> Der Code schaltet dann dementsprechend ein Relay an/aus, bis die
> Temperatur erreicht ist.

Zwei Punkt Regler? PID?

Matthias M. schrieb:
> 1. der Sensorwert den ich über A0 bekomme (vom PT100 am Messwandler) ist
> nicht stabil (schwankt bis zu 2-3 Grad C) und ich weiß nicht wieso.
> Gemessen ohne allem mit dem Multimeter am Messwandler sieht das sehr
> stabil aus.

24V aus Schaltwandler, der sonst nichts versorgt? Dann geht der in den 
lückenden Betrieb, also viel Schwankung auf den 24V. Multimeter ist zu 
langsam um das zu sehen. Bau in deine Pinke Leitung einen RC Filter ein 
oder nimm den Mittelwert über kurze Zeit.

Matthias M. schrieb:
> 3. Das Relay schaltete, mal an mal aus... konnte aber so schnell gar
> nicht kucken, dann wars wieder an,
Wenn du eine PID Programmiert hast köntne da ein Fehler drin sein, wenn 
zwei Punkt Regelung Hysterese zu klein. sehr viel wahrscheinlicher ist 
jedoch dass du keinen Sanity Check für deine Eingangswerte hast, also 
der Regler die falschen 85°C verarbeitet. also teste CRC vom DS18B20, 
wenn das nicht reicht nimm Mittelwerte oder verwirf die Messung wenn sie 
um mehr als x°C von den Vorherigen abweicht.


Matthias M. schrieb:
> Wär echt klasse, wenn mir wer sagen könnte was ich hier verbockt hab.
Mehr kann ich dir ohne Bilder vom Aufbau und Code nicht sagen.

von Matthias M. (sturze)


Lesenswert?

Wolfgang schrieb:

> Zeige zu deinem Steckbild mal den Schaltplan, damit man sieht, was das
> werden soll.

Hallo Wolfgang, Danke erstmal dass du dir Zeit nimmst.

Dein Vorredner hatte recht, das ist mein zweites Bastelobjekt und ich 
hab bis jetzt mit Elektronik nicht sonderlich viel vorwissen.
Deshalb muss ich auch gestehen, ich hab keinen Schaltplan....
Hab das Stück für Stück dazu/aufgebaut. Das ist ja gerade Toll an den 
fertigen Bausteinen, dass man das mehr oder weniger problemfrei 
verbinden kann (so als neuling wie ich).

Würde aber natürlich gern einen Zeichnen, wenn uns das hilft das Problem 
zu finden! Nur das zählt! Will ja nicht dumm sterben.

Wie mach ich das mit dem Aruduino? Oder die Bauteile wie den 
Messwandler(das Blaue ding, hab ich auch angefügt als Bild) und das 
Relay?(da sind ja auch kleine Bauteile drauf, die seh ich zwar aber weiß 
nicht was es ist...) kann ich das vernachlässigen und als "Objekt" 
einzeichnen? Oder kann man das irgendwo her bekommen?

von Matthias M. (sturze)


Lesenswert?

K. S. schrieb:
> überprüfst du den CRC? wenn nicht mach dies und verwirf den
> Messwert/messe erneut wenn der falsch ist.

Puh... Nutze die DallasTemperature.h, da muss ich mich mal durchwühlen 
ob das da drin ist! Ich schau gleich!

> Zwei Punkt Regler? PID?

Das musste ich erst mal googlen. Soweit ich das verstanden hab 
Zweipunktregler

> 24V aus Schaltwandler, der sonst nichts versorgt? Dann geht der in den
> lückenden Betrieb, also viel Schwankung auf den 24V. Multimeter ist zu
> langsam um das zu sehen. Bau in deine Pinke Leitung einen RC Filter ein
> oder nimm den Mittelwert über kurze Zeit.

Ja, der Messwandler hängt an einem 24V Hutschienen Netzteil, ansonsten 
garnichts anderes. Wann schankts? Wenn nichts dran hängt oder wenn etwas 
dran hängt?

> Wenn du eine PID Programmiert hast köntne da ein Fehler drin sein, wenn
> zwei Punkt Regelung Hysterese zu klein. sehr viel wahrscheinlicher ist
> jedoch dass du keinen Sanity Check für deine Eingangswerte hast, also
> der Regler die falschen 85°C verarbeitet. also teste CRC vom DS18B20,
> wenn das nicht reicht nimm Mittelwerte oder verwirf die Messung wenn sie
> um mehr als x°C von den Vorherigen abweicht.

Wie gesagt, keine PID soweit ich das verstehe. Dann wirds wohl so sein, 
dass es keine CRC Prüfung gibt! Jedenfalls hast du recht, der arduino 
arbeitet damit (schaltet das relay ab (habs getestet) wenn der Sollwert 
kleiner ist)

> Mehr kann ich dir ohne Bilder vom Aufbau und Code nicht sagen.

Wie gesagt, Schaltplan hab ich (aktuell noch) nicht.
Code kann ich gerne posten, solange mich hier niemand deswegen auslacht 
XD

von H.Joachim S. (crazyhorse)


Lesenswert?

Bei gefühlt ca. der Hälfte der Steckbrettbenutzer mit Problemen hat sich 
genau dieses am Ende als das eigentliche Problem herausgestellt. Die 
andere Hälfte hatte keinen Plan :-)
Ist das wirklich so schwierig sich die paar Sachen zusammenzulöten?
Der Weg muss doch immer noch sein: Planen (Schaltplan, der heisst 
wahrscheinlich nicht ganz zufällig -plan :-), es reicht auch ne Skizze 
auf Papier. Und dann anfangen zu bauen.

von Walta S. (walta)


Lesenswert?

>
> Wie gesagt, Schaltplan hab ich (aktuell noch) nicht.
>

Auf der zweiten Ansicht deines Fritzing Programms befindet sich der 
Schaltplan und auf der dritten die Platine.

Ich würde empfehlen mit der Steckbrett Ansicht erst gar nicht zu 
arbeiten.

Walta

von Mirko W. (Gast)


Lesenswert?

Nur damit da nicht der Fehler liegt, schau ich auf die Codeseite:
Du sagst, dass du bei erreichen der Zieltemperatur abschaltest. Wann 
schaltest du wieder ein? Könntest du den Code posten?
Wenn du nur eine Schaltschwelle ohne Abstand (also Hysterese) hast, dann 
würde ich so schnelles Schalten erwarten, wie du beschreibst.
Beim Heizen müsstest du z. B. bei einer Wunschtemperatur von 80 Grad 
erst bei 81 Grad abschalten und bei 79 Grad wieder einschalten.

Andererseits: Wo in deinem Code setzt du die Ausgänge? Nicht, dass du 
innerhalb der Loop den eigentlich gewünschten Wert direkt wieder 
überschreibst.
Außerdem: Bei zwei bis drei Grad Rauschen müsstest du eine ganz schön 
hohe Hysterese nutzen. Nutzt du die Werte ungefiltert? Vielleicht besser 
über ein paar Messwerte mittelwert- oder medianfiltern.

Ansonsten kann beim Weg vom Schaltplan zum Aufbau immer etwas 
schiefgehen.

von K. S. (the_yrr)


Lesenswert?

Wolfgang schrieb:
> Zeige zu deinem Steckbild mal den Schaltplan, damit man sieht, was das
> werden soll.

das kann man auch aus dem Bild erkennen, so viel ist da nun wirklich 
nicht dran. und für Anfänger ist das finde ich Ausreichend, nicht jeder 
hier macht das auf professioneller Ebene.

Matthias M. schrieb:
> Ja, der Messwandler hängt an einem 24V Hutschienen Netzteil, ansonsten
> garnichts anderes. Wann schankts? Wenn nichts dran hängt oder wenn etwas
> dran hängt?

schwanken tuts immer, nur wenn keine/kaum eine Last dranhängt schaltet 
das Netzteil in kurzen Pulsen. mit einem Oszi sieht man das, mit 
Multimeter nicht (du könntest probieren ob es dir eine Spannung im AC 
Modus anzeigt, das ist dann die Schwankung, aber eigentlich ist das zu 
schnell dafür).

Wenn du in die Pinke Leitung aus Bild1 z.b. einen 10kOhm Widerstand 
einfügst und danach einen z.b.100nF nach GND sollte es wesentlich besser 
werden. Genaue Werte sind relativ unkritisch, die Zeitkonstante R*C 
sollte so im unteren Millisekunden Bereich liegen.

Matthias M. schrieb:
> Puh... Nutze die DallasTemperature.h, da muss ich mich mal durchwühlen
> ob das da drin ist! Ich schau gleich!

der wird den CRC schon auswerten, die Frage ist ob du in deinem Code 
darauf reagierst oder die Temperatur übernimmst, selbst wenn der CRC 
falsch war.


Poste mal den Code, dann seh ich mir den mal an.

Wenn dein Arduino einen USB-UART mit drauf hat (oder du einen rumliegen 
hast), könntest du auch bei jeder Messung die Temperaturen und Status 
Relais an/aus übertragen und am PC mit z.b. RealTerm mitloggen, dann 
findet man Fehler nachträglich einfacher.

: Bearbeitet durch User
von Matthias M. (sturze)


Angehängte Dateien:

Lesenswert?

K. S. schrieb:
> Wenn du in die Pinke Leitung aus Bild1 z.b. einen 10kOhm Widerstand
> einfügst und danach einen z.b.100nF nach GND sollte es wesentlich besser
> werden. Genaue Werte sind relativ unkritisch, die Zeitkonstante R*C
> sollte so im unteren Millisekunden Bereich liegen.

OK. Meintest du so, wie auf dem Bild im Anhang? Das will ich auf jeden 
Fall mal testen.
Kondensator hab ich momentan keinen rum liegen, aber kann ich bis Montag 
organisieren.
Das hab ich mich schon länger gefragt. Was ist da Sinnvoll? Elko, 
Keramik ... oder total egal? Gibts dafür unterschiedliche 
Anwendungsbereiche?

Wie bist du drauf gekommen? Würd es gerne Verstehen was das nun macht 
und wieso.

> Poste mal den Code, dann seh ich mir den mal an.
hab ich
1
#include <LiquidCrystal_I2C.h>                  // LiquidCrystal_I2C Bibliothek einbinden
2
#include <OneWire.h>                            // Onwire Library einbinden
3
#include <DallasTemperature.h>                  // Dallas Temperatur library einbinden
4
5
//EMV-Probleme -------------------------------------------------------------
6
//sporadischer -127 °C - Fehler durch elektromagnetische Einstreuungen (z.B. Zündtrafo, fehlerhafte Induktionsplatte)
7
8
#define emcSchutz               //einkommentieren, falls kein Problem!
9
10
#ifdef emcSchutz
11
long emccounter = 10000;
12
long emc;
13
long m = 0;                     //EMC - Fehlerzähler
14
#endif
15
16
const unsigned long Baud_Rate = 9600;           // constante für Baudrate auf 9600 definieren
17
const unsigned char One_Wire_Bus = 8;           // i2c Bus für Temperatursensor auf PIN 8 setzen
18
const int buttonDown = 2;                       // Button - auf PIN 2
19
const int buttonUp = 4;                         // Button + auf Pin 4
20
const int relay = 6;                            // Relais auf Pin 6 für Brenner
21
const int relayalarm = 7;                       // Relais auf Pin 7 Für Kühlwasseralarm
22
LiquidCrystal_I2C lcd(0x27, 16, 2);             // LCD Display (i2c-Adresse, 16Zeichen, 2 Zeilen) 
23
OneWire oneWire(One_Wire_Bus);                  // OneWire Bus initialisieren
24
DallasTemperature sensor(&oneWire);             // Definieren dass Temp Sensoren (Wasserbad) auf dem OneWireBus liegen
25
const int analogInPin = A0;                     // PT100 für Kühlwasser
26
byte termometru[8] =                            // Icon for Thermoeter    
27
{
28
    B00100,
29
    B01010,
30
    B01010,
31
    B01110,
32
    B01110,
33
    B11111,
34
    B11111,
35
    B01110
36
}; 
37
int Anzahl_Sensoren = 0;                        // Sensorenvariable erstellen und Anzahl der Temperatursensoren zurücksetzen (i2c)
38
int sensorValue  = 0;                           // Analogwerte vom PT 100 (Kühlwassersensor)
39
float f1 = 0;                                   // konvertierung des Temperatur in float (Kühlwassersensor)
40
int t1 = 0;                                     // Int für Mapping von mA vom PT100 Messwandler
41
float kuehlertemp = 0;
42
float temperatur = 0;
43
float maxT = 17;                               // Variable für Maximaltempereatur erstellen und auf ... setzen
44
int buttonStateUp = 0;                          // Variable Buttonstatus +
45
int buttonStateDown = 0;                        // Variable für Buttonstatus -
46
int BstepsUp = 0;
47
int BstepsDown = 0;
48
int Bstepstoggle = 0;
49
int resstep = 0;
50
int period7s = 7000;
51
int period = 300;
52
int secnd = 1000;
53
unsigned long time_now = 0;
54
unsigned long timebtnup = 0;
55
unsigned long timebtndn = 0;
56
unsigned long timetoggle = 0;
57
unsigned long timereheat = 0;
58
unsigned long timeKTshow = 0;                     // referenzwert für neue Kühlertemp wert im display debug mode anzeigen
59
bool reheat = false;
60
byte sensorfehler = 0;
61
byte heizen = 0;
62
byte alarm = 0;
63
byte debugdisplay = 0;
64
byte tkerr = 0;
65
byte serr = 0;
66
void setup() 
67
{
68
digitalWrite(relay, INPUT_PULLUP);              // prevents relay from activating after power-on
69
digitalWrite(relayalarm, INPUT_PULLUP);              // prevents relay from activating after power-on
70
lcd.begin(16,2);                                // LCD laden
71
lcd.init();                                     // LCD Iinitialisieren 
72
lcd.backlight();                                // Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus). 
73
lcd.createChar(1,termometru);                   // ICON für Thermometersymbol erstellen
74
sensor.begin();                                 // Sensorbus starten
75
sensor.setResolution(12);
76
sensor.setWaitForConversion(false);            // makes it async
77
Serial.begin(Baud_Rate);                        // Baud rate festelegen
78
Anzahl_Sensoren = sensor.getDeviceCount();      // Hier schauen wir, wieviel Sensoren angeschlossen sind
79
pinMode(buttonUp, INPUT);                       // der Buttonpin für den +Button ist ein Input
80
pinMode(buttonDown, INPUT);                     // der Buttonpin für den -Button ist ein Input
81
pinMode(relay, OUTPUT);
82
pinMode(relayalarm, OUTPUT);
83
84
}
85
86
void loop() 
87
{ 
88
  time_now = millis();
89
90
91
  //################# Temperatur holen von WasserbadSensor DS18B20 ####################
92
  // Request temperature conversion - non-blocking / async
93
   
94
  sensor.requestTemperatures();                   // Temperatur abfragen
95
96
  float temperatur = sensor.getTempCByIndex(0);   // Speichern des ersten Sensorwertes in eine Variable
97
98
  #ifdef emcSchutz
99
  m = 0;
100
  while ((int(temperatur) == -127) && (m < emccounter))
101
  {
102
    sensor.requestTemperatures(); // Temperatur holen
103
    temperatur = sensor.getTempCByIndex(0);
104
    m++;
105
  }
106
#endif
107
  //################# Temperatur holen von Kühlwassersensor (PT100) ####################
108
109
  
110
//  code for reading a 4 - 20 mA current signal
111
//  over a 250 Ohm resistor on voltage analog input pins
112
//  this gives voltage readings from 1 to 5 volts.
113
//  
114
//  The current signal represents a temperature between -50 to +150 C
115
//  from a PT100 connected to a 4-20 mA current transmitter
116
//  
117
//  current    voltage(250 Ohm)   ADC    Temperature
118
//  -----------------------------------------------------
119
//  4  mA        1 V              205       0 C
120
//  20 mA        5 V              1023   +150 C
121
122
sensorValue = analogRead(analogInPin);   
123
124
     // map the signals (multiplied by 10  
125
     // to get decimal values, because map() doesn't work with floats)
126
     t1=map(sensorValue,205,1023,0,1500);
127
128
     f1 = t1;  // Float conversion
129
     kuehlertemp = f1/10.0;      // dividing by 10
130
                        // with one decimal value
131
   Serial.println(sensorValue);
132
  //################# Button stati auslesen       ####################
133
  buttonStateUp = digitalRead(buttonUp);       
134
  buttonStateDown = digitalRead(buttonDown);    
135
136
  if (buttonStateUp == HIGH && buttonStateDown == HIGH){
137
             if(timetoggle< (time_now - period)){
138
                Bstepstoggle = Bstepstoggle + 1;
139
                //if (Bstepstoggle > 9){                        // mehr als 10 sec gedrückt
140
                 if (debugdisplay == 0) {
141
                      debugdisplay = 1;                   // flip bit für Displaymodus
142
                      lcd.clear();
143
                  } else {
144
                      debugdisplay = 0;
145
                      lcd.clear();
146
                    }                 
147
                 //}
148
                } 
149
                timetoggle = millis();
150
              //  Serial.println(Bstepstoggle);  
151
              //  Serial.println("Both Buttons Pressed");          // loggen des Toggle-Events im Monitor
152
   }  else {
153
            if (timetoggle> (timetoggle + 200)){ Bstepstoggle = 0;}
154
            //Serial.println("Toggle Release");
155
            
156
            if (buttonStateUp == HIGH) {                  // Prüfen ob der + Button gedrückt wird
157
          
158
              if(timebtnup< (time_now - period)){
159
                BstepsUp = BstepsUp + 1;
160
            
161
                if (BstepsUp < 5) {                         // noch keine 5 Sec gerückt
162
                 maxT = maxT + 0.5;                         // Wenn ja, erhöhe maxT um 0,5grad 
163
                }
164
                if (BstepsUp > 4){                          // mindestens fünf Sec gedrückt 
165
                  maxT = maxT + 1;                          // erhöhe um 1Grad
166
                }
167
                if (BstepsUp > 9){                          // mehbr als 10 sec gedrückt
168
                  maxT = maxT + 1;                          // erhöhe um weitere 1 grad (2grad insgesamt)
169
                } 
170
                timebtnup = millis();
171
                Serial.println(BstepsUp);  
172
                Serial.println("ButtonUp Pressed!");          // loggen des +Button status im Monitor
173
              } 
174
            } else {
175
              BstepsUp = 0;
176
              }
177
              
178
            if (buttonStateDown == HIGH) {                // Prüfen ob der - Button gedrückt wird
179
          
180
              if(timebtndn< (time_now - period)){
181
              
182
                BstepsDown = BstepsDown + 1;
183
            
184
                if (BstepsDown < 5) {                       // noch keine 5 sec gedrückt
185
                 maxT = maxT - 0.5;                         // Wenn ja, mindere maxT um 0,5grad 
186
                }
187
                if (BstepsDown > 4){                        // mindestens 5 sec gedrückt
188
                  maxT = maxT - 1;                          // mindere um 1 Grad
189
                }
190
                if (BstepsDown > 9){                        // mindestens 10 sec gedrückt
191
                  maxT = maxT - 1;                          // mindere um weitere 1 grad (2 grad insgesamt)
192
                }                      
193
                timebtndn = millis();    
194
                Serial.println(BstepsDown);  
195
                Serial.println("ButtonDown Pressed!");        // loggen des -Button status im Monitor
196
              }
197
                                   
198
            } else {
199
                BstepsDown = 0;
200
                } 
201
202
      }
203
 // Serial.println(maxT);    // maxT im Monitor loggen
204
  //################# LCD ausgaben                ####################
205
if (alarm == 0){
206
        if (debugdisplay == 0){
207
            lcd.setCursor(0, 0);                              // Zeile 1
208
            lcd.print("Temp ");                               // Temp
209
            lcd.setCursor(5, 0);
210
            lcd.write(1);                                     // Thermometersymbol
211
            lcd.print(" ");
212
            lcd.setCursor(7, 0);
213
            if ((millis() < 5000) && (int(temperatur) == 85)) {
214
              lcd.setCursor(7, 0);
215
              lcd.print("Reading...");                          // beim initialisieren wert kaschieren (optik)
216
          
217
            } else {if (temperatur < 100){                            // Versatz bei Temp wenn unter 100
218
                  lcd.print(" ");
219
                  } 
220
                if (temperatur < 10){                            // Versatz bei Temp wenn unter 10
221
                  lcd.print(" ");
222
                  } 
223
                lcd.print(temperatur,2);                          // Temperatur schreiben, 2 Nachkommastellen
224
                lcd.setCursor(13, 0);
225
                lcd.print(" \337C");                               // Grad C
226
              }   
227
            
228
            lcd.setCursor(0, 1);                              // Zeile 2
229
            lcd.print("Max    ");                                 // Max
230
            lcd.setCursor(7, 1);  
231
            if (maxT < 100) {                                 // Versatz bei Max wenn unter 10
232
              lcd.print(" ");
233
              }
234
            if (maxT < 10){                            // Versatz bei Temp wenn unter 10
235
              lcd.print(" ");
236
              } 
237
            lcd.print(maxT,2);                                // Maximum schreiben, 2 Nachkommastellen 
238
            lcd.setCursor(13, 1);
239
            lcd.print(" \337C");                               // Grad C
240
            
241
            } else { // #### Debugdisplay
242
             
243
            lcd.setCursor(0, 0);                              // Zeile 1
244
            lcd.print("KuehlT ");                             // Temp  
245
            lcd.setCursor(7, 0);
246
            if (time_now > timeKTshow + secnd){
247
              if (kuehlertemp < 100){                            // Versatz bei Temp wenn unter 100
248
                lcd.print(" ");
249
                } 
250
              if (kuehlertemp < 10){                            // Versatz bei Temp wenn unter 10
251
                lcd.print("  ");
252
                } 
253
              
254
              lcd.print(kuehlertemp,2);                          // Temperatur schreiben, 2 Nachkommastellen
255
              timeKTshow = millis();
256
            }
257
            lcd.setCursor(14, 0);
258
            lcd.print("\337C");                               // Grad C
259
            lcd.setCursor(0, 1);                              // Zeile 2
260
            lcd.print("S-ERR  ");                             // Max
261
            lcd.setCursor(6, 1);  
262
            lcd.print(emc);                                // DS18B20 Errorcount ausgeben
263
        }
264
  }
265
  // #################### Heizlogik ######################
266
267
if (temperatur < maxT) {                         // Wenn temperatur kleiner ist als Maximum
268
        
269
        if (reheat == false){
270
            heizen = 1;
271
            reheat = true;
272
273
          } else {
274
              if(time_now > timereheat + period7s){
275
              heizen = 1;
276
              }
277
            }
278
        
279
      
280
 } else {
281
     
282
     timereheat = millis(); 
283
     heizen = 0;
284
  }
285
286
287
// ############################  SensorFehler? ######################
288
// Bei Fehler nicht heizen
289
290
    if (int(temperatur) == -127) {
291
292
      if (sensorfehler == 0)
293
      {
294
      lcd.setCursor(7, 0);
295
      lcd.print("Fehler !");                          // Fehler ausgeben, NICHT heizen
296
        
297
298
#ifdef emcSchutz
299
        emc = emccounter;
300
        emccounter = 1;
301
#endif
302
        sensorfehler = 1;
303
        heizen = 0;
304
        serr = 1;
305
        // Dauerhafter fehler! ALARM
306
        Serial.println("Wasserbad-Sensorfehler!!!!");          // loggen des Alarms im Monitor
307
      }
308
    } else {
309
      sensorfehler = 0;
310
      serr = 0;
311
      //heizen = 1;
312
    }
313
314
// ############################  KühlwasserFehler? ######################
315
// Bei Fehler nicht heizen
316
if (int(kuehlertemp) > 50) {
317
      //zur besseren Erkennung Umwandling in (int)-Wert
318
      //sonst Probleme mit der Erkennung gerade bei 0.00
319
heizen = 0;
320
tkerr = 1;
321
lcd.setCursor(0, 0);                              // Zeile 1
322
lcd.print("Brenner Not-Aus!");                               
323
lcd.setCursor(0, 1);                              // Zeile 2
324
lcd.print("!Wasser Pruefen!");       
325
Serial.println("Kühlwasseralarm!!!!!!!!");        // loggen des Kühlwasseralarms im Monitor                     
326
} else {
327
  tkerr = 0;
328
  }
329
//############# alarm?
330
if (tkerr == 1 || serr == 1){
331
  alarm = 1;
332
  } else {
333
    alarm = 0;
334
    }
335
336
//############# Do stuff.... wie heizen... oder schimpfen...
337
 Einheizen(heizen);
338
 Alarm(alarm);
339
}
340
341
void Einheizen (byte heizen)
342
{
343
  if (heizen == 0) {
344
digitalWrite(relay, HIGH);                   // AUS!
345
  }else  {
346
digitalWrite(relay, LOW);                    // Relais schalten! Heizung an!
347
  }
348
349
void Alarm (byte alarm)
350
{
351
    if (alarm == 1)  {
352
// Bimmeln und leuchten
353
    digitalWrite(relayalarm, LOW);                      // Relais schalten! ALARM!!
354
  } else {
355
        digitalWrite(relayalarm, HIGH);                 // Relais AUS - Alarm aus
356
    }
357
358
}

> Wenn dein Arduino einen USB-UART mit drauf hat (oder du einen rumliegen
> hast), könntest du auch bei jeder Messung die Temperaturen und Status
> Relais an/aus übertragen und am PC mit z.b. RealTerm mitloggen, dann
> findet man Fehler nachträglich einfacher.

hab das bisher via USB Port vom ArduinoNano am PC gemacht, mit dem 
SerialMonitor vom Arduino IDE. Irgendwie hab ich aber schiss was zu 
braten, wenn ich Netzteil UND USB anschließe. Darf ich das?

von Matthias M. (sturze)


Lesenswert?

Mirko W. schrieb:
> Nur damit da nicht der Fehler liegt, schau ich auf die Codeseite:

code ist da, siehe 1 Post weiter oben

von Matthias M. (sturze)


Lesenswert?

H.Joachim S. schrieb:
> Ist das wirklich so schwierig sich die paar Sachen zusammenzulöten?
Nö, hab das auch schon gelötet, aber wenn ich davon ein Foto mache wirds 
eher noch übersichtlicher, weil ich ja 2 Seiten hab... oben Bauteile 
unten wege.

Dachte ich muss es sowieso zeichnen wenn ich das irgendwem erzählen will 
und ausserdem hätte es ja sein können dass mir der Fehler beim Zeichnen 
schon unter kommt.

Walta S. schrieb:
> Auf der zweiten Ansicht deines Fritzing Programms befindet sich der
> Schaltplan und auf der dritten die Platine.
>
> Ich würde empfehlen mit der Steckbrett Ansicht erst gar nicht zu
> arbeiten.

angeblich generiert ja Fritzing sowas, hab ich grad recherchiert. Hab 
mir das mal angesehen wie das jetzt aussieht... naja... so würde es 
nicht funktionieren denk ich. Das muss ich wenn dann selbst machen da 
das automatisch irgendwie nicht geklappt hat.

Da ich nicht aus der Elektroecke bin tue ich mich irgendwie leichter das 
in der Steckbrett ansicht zu verstehen. Wie gesagt: will mich aber nicht 
wehren dass zu zeichnen, da brauch ich allerdings nen ruhigen Abend um 
mich da mal reinzufuchsen, wie das aussehen soll.

von Gnorm (Gast)


Lesenswert?

85 Grad ist der Resetwert. Und Pt100 schwankt. Beides  deutet auf sehr 
schlechte Spannungsversorgung hin.

von Matthias M. (sturze)


Lesenswert?

Gnorm schrieb:
> 85 Grad ist der Resetwert. Und Pt100 schwankt. Beides  deutet auf
> sehr
> schlechte Spannungsversorgung hin.

Beide Spannungsquellen sind Hutschienennetzteile (regelbar)

aktuell kommen vom 5v Netzteil 5,65V. Soweit ich das am Multimeter sehe 
sehr stabil, beim 24v schwankt auch nichts.
Die Bauteile selbst sind ja auch keine großen Verbraucher, oder spielt 
das keine Rolle? Wie kann ich das feststellen ob damit was nicht stimmt?

Wenn ich am 24v die Spannung erhöhe oder mindere hat das jedenfalls 
keine Auswirkungen auf die Stabilität des Wertes den ich bekomme am 
Arduino, soweit hab ich das mal getestet. Scheint irgendwie in dem 
Messwandler nochmal geregelt zu sein. Kann das sein?

von Matthias M. (sturze)


Lesenswert?

> Wenn du in die Pinke Leitung aus Bild1 z.b. einen 10kOhm Widerstand
> einfügst und danach einen z.b.100nF nach GND sollte es wesentlich besser
> werden. Genaue Werte sind relativ unkritisch, die Zeitkonstante R*C
> sollte so im unteren Millisekunden Bereich liegen.

ich hab jetzt nocht nichts von dir gehört, aber die Kondensatoren hab 
ich. Konnte es mir nicht verkneifen das so zu testen, wie ichs skizziert 
hab. Der Sensorwert (PT100) am analogen Eingang sieht jetzt stabil aus! 
War das so gedacht, oder hab ich was missverstanden? (siehe Zeichnung 
oben) Wie berechnet man sowas? Würde es gern nachvollziehen können. Will 
ja was lernen...

> Matthias M. schrieb:
>> Puh... Nutze die DallasTemperature.h, da muss ich mich mal durchwühlen
>> ob das da drin ist! Ich schau gleich!
>
> der wird den CRC schon auswerten, die Frage ist ob du in deinem Code
> darauf reagierst oder die Temperatur übernimmst, selbst wenn der CRC
> falsch war.

hab mich mal durch den Header gewühlt (DallasTemperature.h)
Sieht für mich so aus, als würde der CRC prüfen und dann erst etwas 
zurückgeben. Habs aber nur grob überflogen, muss dass mal komplett 
durchspielen(in relation zu meinem Code), hatte aber noch nicht genug 
Zeit.

> Poste mal den Code, dann seh ich mir den mal an.

hab ausserdem grad gesehen,dass in meinem Code hier eine klammer fehlte:
1
void Einheizen (byte heizen)
2
{
3
  if (heizen == 0) {
4
digitalWrite(relay, HIGH);                   // AUS!
5
  }else  {
6
digitalWrite(relay, LOW);                    // Relais schalten! Heizung an!
7
  }
8
}

: Bearbeitet durch User
von K. S. (the_yrr)


Lesenswert?

Matthias M. schrieb:
> while ((int(temperatur) == -127) && (m < emccounter))
>   {
>     sensor.requestTemperatures(); // Temperatur holen
>     temperatur = sensor.getTempCByIndex(0);
>     m++;
>   }
der Teil sieht schonmal gut aus. den CRC wertest du indirekt mit dem 
Test auf -127 aus.


Matthias M. schrieb:
> Konnte es mir nicht verkneifen das so zu testen, wie ichs skizziert
> hab. Der Sensorwert (PT100) am analogen Eingang sieht jetzt stabil aus!

                 _
   Eingang -----|___|--+---- Ausgang/
                       |   Eingang Arduino
                      ---
                      ---
                       |
       GND ------------+----

so sollte es eigentlich aussehen, wenn es funktioniert ist aber gut.
das was ich aufgezeichnet habe ist ein einfacher Tiefpass, der 
Kondensator stellt einen niedrigen Widerstand für hohe Frequenzen da, 
aber einen sehr hohen für niedrige und unendlich für Gleichstrom. das 
ganze ist also eine Art "Spannungsteiler", für hohe frequenzen ist die 
Impedanz vom C kleiner als der Widerstand vom R, für niedrige Frequenzen 
genau andersrum.

Ein einfacher Kondensator glättet auch, der "Widerstand" ist dann die 
Strombegrenzung (4-20mA) vom Treiber. da die Störungen bei einigen kHz 
bis einigen 100kHz liegen wird (vom Schaltnetzteil), reicht ein sehr 
kleiner Kondensator und Widerstand.

https://de.wikipedia.org/wiki/Tiefpass#Tiefpass_1._Ordnung


Matthias M. schrieb:
> if (temperatur < maxT) {                         // Wenn temperatur
> kleiner ist als Maximum
>
>         if (reheat == false){
>             heizen = 1;
>             reheat = true;
>
>           } else {
>               if(time_now > timereheat + period7s){
>               heizen = 1;
>               }
>             }
>
>
>  } else {
>
>      timereheat = millis();
>      heizen = 0;
>   }
ist zwar weder eine PID noch ein klassischer Zweipunktregler, aber das 
sollte schon funktionieren.

so wie ich es verstanden habe:
- beim ersten Heizen wird heat=1 gesetzt, reheat=true
- wenn die Temperatur erreicht ist, wird heat=0 gesetzt
- timereheat enthält die letzte Zeit zu der nicht geheizt wurde, also 
die Temperatur ok war.
- beim nachheizen setzt du die Heizung erst auf an wenn die Temperatur 
mindestens 7 Sekunden lang durchgängig zu niedrig war.
 dies ersetzt die untere Schwelle zum wieder Anschalten vom klassischen 
Zweipunktregler.

Gnorm schrieb:
> 85 Grad ist der Resetwert. Und Pt100 schwankt. Beides  deutet auf sehr
> schlechte Spannungsversorgung hin.
das Denke ich auch. der Code sieht soweit gut aus.

Probier mal einige 10-100µF ELko von 5V nach GND (optional), und 
10-100nF keramisch (auch von 5V nach GND) nahe am DS1820 (und am 
Arduino, aber der könnte sowas schon haben). wenn du hast nimm nochmal 
so einen 100nF wie beim PT100 über dem Sensor, auf Steckbrett gibt es 
häufiger mal schlechte/wackelnde Kontakte, besonders wenn alles schon 
älter und gut benutzt ist, daher sollte man immer die Versorgung mit 
(zumindest einigen kleinen keramischen) Kondensatoren versehen.

Matthias M. schrieb:
> sensor.setWaitForConversion(false);            // makes it async
nimm den Teil mal raus.

Matthias M. schrieb:
> sensor.requestTemperatures();                   // Temperatur abfragen
>
>   float temperatur = sensor.getTempCByIndex(0);   // Speichern des
> ersten Sensorwertes in eine Variable

das hier ist deine Temperaturabfrage. Du ließt also immer die Tempertaur 
von der letzten Abfrage oder der DS1820 blokiert, welches von beiden 
zutrifft weiß ich leider nicht. die Tatsache dass du 85°C bekommst, 
scheint darauf zu deuten dass
 - die Spannungsversorung instabil ist
 -> der DS1820 resettet
 -> du dann eine Messung startest aber den letzten Wert (also die 
initialen 85°C) bekommst.
es könnte auch der Befehl zu Messung fehlerhaft übertragen werden (oder 
der Reset danach stattfinden), aber wenn du sonst keine Probleme mit 
fehlerhafter Übertragung hast ist das eher unwahrscheinlich.

von Matthias M. (sturze)


Lesenswert?

So... das lief jetzt alles echt super über etwa ein Jahr, jetzt kam bei 
der Spannungsquelle im Schaltschrank (5adrig) ein Drehstrommotor (1,1kw 
steht auf dem Schild) hinzu.
schaltet man den, kackt der Arduino ab. --> Freezes, Neustarts, 
Fragmente auf dem i2C Display. Das sind die auftretenden Phänomene.

ein Freund (mit Oszi) hat NACH dem Schaltnetzteil, also auf 
Arduino/DC-Seite mitgekuckt und man sieht dass es beim an und abschalten 
des Motors nicht mehr so wirklich nach DC aussieht. Fallende Flanke beim 
einschalten/steigend beim ausschalten, dann "schwingt" es stark bis 
schließlich die Spannung wieder stabil ist(Hab leider keine Bilder 
gemacht... hab erst hinterher daran gedacht)

Wie schaffe ich es das soweit zu "stabilisieren" dass der Arduino weiter 
läuft?!

mit meinem Halbwissen würde ich jetzt versuchen so etwas wie einen 
Brückengleichrichter einzufügen nach dem DC-Din-Netzteil. Macht das 
sinn? Wenn ja wie dimensioniere ich die Kondensatoren die das puffern 
sollen?!

Oder macht es Sinn das über Zener-Clipping stabil zu halten? Reicht dann 
der Strom der für meine Mini-Schaltung abgenommen wird?

Hab einiges versucht zu recherchieren, aber hab, fürchte ich noch nicht 
das "Gelbe vom Ei". Kann mir da wer einen Tipp geben?

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Matthias M. schrieb:
> schaltet man den, kackt der Arduino ab.

Daher nutzen Industriesteuerungen den Watchdog der Prozessoren.

Ansonsten werden über EMV und Störfestigkeit Bücher geschrieben und 
Seminare abgehalten, also nichts was man in 2 Worten erklärt.

Wenn du weisst, dass es über die Versorgungsspannung kommt, kann es 
helfen die besser abzublocken.

von Matthias M. (sturze)


Lesenswert?

MaWin schrieb:
> Matthias M. schrieb:
>> schaltet man den, kackt der Arduino ab.
>
> Daher nutzen Industriesteuerungen den Watchdog der Prozessoren.
Hab mir auch einen Controllino geholt, in der Hoffnung das würde damit 
klappen...
Der wäre ja laut Hersteller für den Einsatz im industriellen Bereich 
gedacht, wenn ich da nichts missverstehe.
Watchdog gibts da keinen, da hast du recht... Microcontroller != 
Betriebssystem.

> Ansonsten werden über EMV und Störfestigkeit Bücher geschrieben und
> Seminare abgehalten, also nichts was man in 2 Worten erklärt.
Das ist mir Klar, dass ich nicht mit einem Kommentar von euch zum EMV 
Guru werde, hätte gehofft dass sich aus der Konstellation grob was lesen 
lässt. Ich bin zumindest für jeden hilfreichen Kommentar sehr dankbar.

> Wenn du weisst, dass es über die Versorgungsspannung kommt, kann es
> helfen die besser abzublocken.

Das wäre der Ansatz denn ich gerne verfolgen würde.
Kann mir wer sagen, nach was ich im Netz suchen muss, einen Link posten, 
oder wie man sowas am besten blockt/glättet? Hab micht durchs Netzt 
gwühlt und was von Entstörkondensatoren(x und y) gelesen, macht man das 
damit?

Wo macht man das am Besten? Auf der 230VAC Seite, also vor dem 
Hutschienennetzteil, oder nach dem Netzteil auf der 24VDC Seite?

Was ich mich frage: Sollte die Netzspannung nicht schon das Netzteil 
selbst entstören? Da ist doch bestimmt schon etwas verbaut, um das zu 
Regeln (MeanWell NDR-120-24)

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Matthias M. schrieb:
> Watchdog gibts da keinen

Natürlich kann man auf Arduinos einen Watchdog programmieren.

Dieser thread ist doch derselbe wie

Beitrag "Arduino Reboot/Freeze beim Ein/Ausschalten eines Geräts auf selber Zuleitung - Spannungsspitze?"

Doppelt gefragt gibt schneller Antwort ? Warum nicht 10 threads mit 
demselben Thema.

von Stefan F. (Gast)


Lesenswert?

MaWin hat Recht, zwei Threads zum selben Thema waren noch nie hilfreich.
Lass und das hier abbrechen und in 
Beitrag "Arduino Reboot/Freeze beim Ein/Ausschalten eines Geräts auf selber Zuleitung - Spannungsspitze?" weiter machen.

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.