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
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
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.
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?
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.
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?
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
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.
> > 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
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.
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
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?
Mirko W. schrieb: > Nur damit da nicht der Fehler liegt, schau ich auf die Codeseite: code ist da, siehe 1 Post weiter oben
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.
85 Grad ist der Resetwert. Und Pt100 schwankt. Beides deutet auf sehr schlechte Spannungsversorgung hin.
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?
> 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
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.
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.