Forum: Mikrocontroller und Digitale Elektronik Wärmeregelung


von Dennis M. (tomscholz899)


Lesenswert?

Hallo,

ich habe eine kleine Wärmeregelung aufgebaut.
Es soll eine min.-Temp., eine max.-Temp und der aktuelle Wert angezeigt 
werden. Der min und max Wert kann verändert werden per Tastendruck. Wenn 
die Temperatur dazwischen liegt soll die Lampe leuchten ansonsten soll 
sie aus bleiben. Habe soweit schon alles programmiert, nur ist das 
Problem sobald die Temperatur in den Bereich zwischen min und max fählt, 
erhöht sich die Temperatur schlagartig von z.B. 21 auf 23 Grad.


Hier mein Sketch:
1
#include <LiquidCrystal_I2C.h>
2
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
3
4
const int taster1 = 7;
5
const int taster2 = 8;
6
const int taster3 = 12;
7
const int taster4 = 13;
8
int statuslow = 20;
9
int statushigh = 24;
10
11
float Temperatur;
12
int einlesen;
13
int LM35 = A0;
14
const int relaispin = 2;
15
16
void setup() {
17
  
18
analogReference(INTERNAL);         
19
lcd.begin(16,2);                    // Display initialisieren
20
21
pinMode(taster1, INPUT);
22
pinMode(taster2, INPUT);
23
pinMode(taster3, INPUT);
24
pinMode(taster4, INPUT);
25
pinMode(relaispin, OUTPUT);
26
}
27
28
void loop() {
29
30
//Temperatur auslesen und auf Display ausgeben
31
32
einlesen = analogRead(LM35);      
33
Temperatur = einlesen / 10.1;
34
35
lcd.setCursor(0,0);
36
lcd.print ("Aktuell ");   
37
lcd.print (Temperatur);
38
  
39
40
41
//Bedingung zur Temperatursteuerung
42
43
if ((Temperatur < statuslow) || (Temperatur > statushigh))
44
{ 
45
    digitalWrite (relaispin, LOW);
46
    //delay (500);
47
  
48
}else{
49
    digitalWrite (relaispin, HIGH);
50
    
51
}
52
//delay (500);
53
54
55
56
// Vier if-Anwendungen für die Taster
57
58
if (digitalRead(taster1) == HIGH)     // Hoch
59
  {
60
  statuslow++;
61
  //delay(200);
62
  }
63
    
64
  lcd.setCursor(0,1);
65
  lcd.print (statuslow);
66
  lcd.print (" Grad ");
67
68
69
if (digitalRead(taster2) == HIGH)     // Runter
70
  {
71
  statuslow--;
72
  //delay(200);
73
  }
74
    
75
  lcd.setCursor(0,1);
76
  lcd.print (statuslow);
77
  lcd.print (" Grad ");
78
79
80
  if (digitalRead(taster3) == HIGH)   // Hoch
81
  {
82
  statushigh++;
83
  //delay(200);
84
  }
85
    
86
  lcd.setCursor(9,1);
87
  lcd.print (statushigh);
88
  lcd.print (" Grad ");
89
90
91
  if (digitalRead(taster4) == HIGH)   // Runter
92
  {
93
  statushigh--;
94
  //delay(200);
95
  }
96
    
97
  lcd.setCursor(9,1);
98
  lcd.print (statushigh);
99
  lcd.print (" Grad ");
100
101
102
  delay (200);
103
}

Grüße Tom

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dennis M. schrieb:
> Hier mein Sketch:
Mach da doch bitte das nächste Mal die [c] Tags aussen rum. Wie das 
geht? Einfach ein paar Zeilen über der Texteingabebox mal beim Thema 
"Formatierung" nachschauen...

> sobald die Temperatur in den Bereich zwischen min und max fählt, erhöht
> sich die Temperatur schlagartig von z.B. 21 auf 23 Grad.
Welches min und welches max? In deinem Programm kommt nichts davon 
vor...

: Bearbeitet durch Moderator
von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Hüftschuß:
Durch den zugeschalteten Verbraucher stimmt Deine Referenz nicht mehr 
und der Messwert wird falsch interpretiert.

Weiter schreibst Du laufend ALLES neu auf's Display - normal unnötig, 
kostet Zeit und Platz - entfernt aber Artefakte von Fehlübertragungen.

MfG

von Dennis M. (tomscholz899)


Lesenswert?

Lothar M. schrieb:
> Dennis M. schrieb:
>> Hier mein Sketch:
> Mach da doch bitte das nächste Mal die [c] Tags aussen rum. Wie das
> geht? Einfach ein paar Zeilen über der Texteingabebox mal beim Thema
> "Formatierung" nachschauen...
>
>> sobald die Temperatur in den Bereich zwischen min und max fählt, erhöht
>> sich die Temperatur schlagartig von z.B. 21 auf 23 Grad.
> Welches min und welches max? In deinem Programm kommt nichts davon
> vor...

Tut mir leid. Ich meinte in der Bedingung zur Temperatursteuerung.

Wenn der Wert zw. statuslow und statushigh fällt.

von Dennis M. (tomscholz899)


Lesenswert?

Patrick J. schrieb:
> Hi
>
> Hüftschuß:
> Durch den zugeschalteten Verbraucher stimmt Deine Referenz nicht mehr
> und der Messwert wird falsch interpretiert.
>
> Weiter schreibst Du laufend ALLES neu auf's Display - normal unnötig,
> kostet Zeit und Platz - entfernt aber Artefakte von Fehlübertragungen.
>
> MfG

Wie kann ich das im Programm ändern ? Ich benögtige den Verbraucher.

Gruß

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Meine Idee geht davon aus, daß Dir ggf. die Spannung am µC einbricht 
oder sich durch die Last die Spannung an Deinem LM35 ändert - so ganz 
ohne Schaltplan wird ein zielgerichtetes Ändern schwierig.

Welche Möglichkeiten hast Du zu Messen?
DMM, Oszi?

Die Einlese-Routine, wird darin irgend was 'anders' gemacht, wenn die 
Bedingung erfüllt ist, also wir im Bereich drin sind?

Sketch klingt ach Arduino, wobei Das nicht der komplette Code sein kann.
(immerhin hab ich bereits gefressen, daß init() 1x und loop() danach 
immer wieder aufgerufen wird)

MfG

von MaWin (Gast)


Lesenswert?

Dennis M. schrieb:
> nur ist das Problem sobald die Temperatur in den Bereich zwischen min
> und max fählt, erhöht sich die Temperatur schlagartig von z.B. 21 auf 23
> Grad.

Trenn mal die Relaisspule ab, so dass auch wenn der Transistor 
einschaltet kein Strom mehr durch sie fliesst.

Dein Programm ist also in Ordnung.

Du wählst auch schlauerweise die interne Referenz.

Nun musst du nach mitverwendeten Masseleitungen oder sonstwas am Aufbau 
suchen, durch das der Strom durch die Rekaisspule zu einem Einfluss auf 
drn LM35 Messwert führt.

von Dennis M. (tomscholz899)


Lesenswert?

MaWin schrieb:
> Dennis M. schrieb:
>> nur ist das Problem sobald die Temperatur in den Bereich zwischen min
>> und max fählt, erhöht sich die Temperatur schlagartig von z.B. 21 auf 23
>> Grad.
>
> Trenn mal die Relaisspule ab, so dass auch wenn der Transistor
> einschaltet kein Strom mehr durch sie fliesst.
>
> Dein Programm ist also in Ordnung.
>
> Du wählst auch schlauerweise die interne Referenz.
>
> Nun musst du nach mitverwendeten Masseleitungen oder sonstwas am Aufbau
> suchen, durch das der Strom durch die Rekaisspule zu einem Einfluss auf
> drn LM35 Messwert führt.

Vielen Dank. Sobald ich die 5 V am Relais weggenommen habe, funktioniert 
mein Programm einwandfrei. Jetzt muss ich wohl nur noch nach der 
Masseleitung suchen wie du beschrieben hast.

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.