Problem bei 2 Punkt Regelung

Hallo,

Bin ein Neuling was den Arduino angeht und habe ein Problem mit meinem "ersten" kleinerem Projekt.
Ich bin dabei eine 2 Punkt Regelung aufzubauen die wie folgt ausschaut:
Ein Temperatur Sensor (TMP36GT9Z) misst den Ist Wert und vergleicht diesen mit dem Soll Wert.
Der Soll Wert wird über ein Potentiometer eingestellt. Wird der Soll Wert unterschritten werden 2 Led´s und ein Relais geschalten. Das Relais soll später ein 12V Heizelement schalten.
Nun habe ich das Problem das die gemessene Temperatur sich verändert sobald ich am Potentiometer drehe :confused: . Hoffe ihr versteht mein Problem... Unten noch der Code und ein Auszug aus den Daten des Seriellen Monitors:
28.05C (Ist-Wert)
26
C (Soll-Wert)
23.66C (Ist-Wert)
36
C (Soll-Wert)
24.63C (Ist-Wert)
33
C (Soll-Wert)
28.05C (Ist-Wert)
32
C (Soll-Wert)
28.05C (Ist-Wert)
32
C (Soll-Wert)
28.05*C (Ist-Wert)
Nun der Code:

int settemp;
int isttemp;
int Wert;
int temPin = 0;
int potPin = 1;
int rlsPin = 13;
int bluPin = 2;
int redPin = 3;
int yelPin = 12;
void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
pinMode(rlsPin, OUTPUT);
pinMode(bluPin, OUTPUT);
pinMode(redPin, OUTPUT);
digitalWrite(rlsPin, HIGH);
digitalWrite(bluPin, LOW);
digitalWrite(redPin, LOW);
}

void loop() {

{
 settemp =map(Wert, 0, 1023, -10, 50);
 Serial.print(settemp);
 Serial.println("*C (Soll-Wert)");
}
{
 Wert = analogRead(potPin);
 int rawvoltage= analogRead(temPin);
 float volts= rawvoltage/205.0;
 float isttemp= 100.0 * volts -50;
 Serial.print (isttemp);
 Serial.println("*C (Ist-Wert)");
 delay(2000);
}

if (isttemp < settemp) {
 digitalWrite(rlsPin, LOW);
 digitalWrite(redPin, HIGH);
 digitalWrite(bluPin, LOW);
 digitalWrite(yelPin, HIGH);
} else {
 digitalWrite(rlsPin, HIGH);
 digitalWrite(redPin, LOW);
 digitalWrite(bluPin, HIGH);
 digitalWrite(yelPin, LOW);
}
}

Hat Du Vorwiderstände an den LED? Wie steuerst Du das Relais an?
Grüße Uwe

Erstmal Danke für die schnelle Antwort!
Ja habe jeweils 100 Ohm Vorwiderstände an den LED´s. Das Relais hab ich an GND, 5v und an den Digitalen Pin 13 angeschlossen.
Gruß

Die Reihenfolge deines Codes und die Klammerstellung "{}" ist etwas merkwürdig.

Ich würde es so einsetzen, ungeprüft.

void loop() {

    Wert = analogRead(potPin);

    settemp = map(Wert, 0, 1023, -10, 50);
    Serial.print(settemp);
    Serial.println("*C (Soll-Wert)");

    int rawvoltage = analogRead(temPin);
    float volts = rawvoltage / 205.0;
    float isttemp = 100.0 * volts - 50;
    Serial.print (isttemp);
    Serial.println("*C (Ist-Wert)");
    delay(2000);


  if (isttemp < settemp) {
    digitalWrite(rlsPin, LOW);
    digitalWrite(redPin, HIGH);
    digitalWrite(bluPin, LOW);
    digitalWrite(yelPin, HIGH);
  } else {
    digitalWrite(rlsPin, HIGH);
    digitalWrite(redPin, LOW);
    digitalWrite(bluPin, HIGH);
    digitalWrite(yelPin, LOW);
  }
}

Dann würde ich die Widerstände für die Leds lieber etwas größer (220 Ohm] wählen.

Und das Relais solltest du nicht direkt am Arduino betreiben. Und hast du eine Freilaufdiode eingebaut?

Der analoge Eingang sollte auch besser mit "A1" definiert werden.

int potPin = A1;

Alles klar ich werd es mal mit größeren Widerständen und dem Code probieren. Eh hab das Relais mit dem IN anschluss direkt am Arduino verbunden.

nicdi:
Alles klar ich werd es mal mit größeren Widerständen und dem Code probieren. Eh hab das Relais mit dem IN anschluss direkt am Arduino verbunden.

Dann poste mal einen Link des Relais, wahrscheinlich ist es nicht nur ein Relais, sondern ein Relais-Board.

http://www.ebay.de/itm/like/390782140462?lpid=106&chn=ps&ul_noapp=true ich verwende die 1 Kanal Version.
Habe das mit größeren Widerständen und dem Code probiert, jedoch nimmt das Potentiometer immernoch Einfluss auf die Temperatur.
Hier nochmal ein sehr deutliches Beispiel aus dem Seriellen Monitor:
30C (Soll-Wert)
23.17
C (Ist-Wert)
30C (Soll-Wert)
25.61
C (Ist-Wert)
30C (Soll-Wert)
30.00
C (Ist-Wert)
30C (Soll-Wert)
23.17
C (Ist-Wert)
30C (Soll-Wert)
25.61
C (Ist-Wert)

Der Link funktioniert nicht richtig.

Aber wenn es dieses Relais-Board ist, funktioniert es.

nicdi:
http://www.ebay.de/itm/like/390782140462?lpid=106&chn=ps&ul_noapp=true ich verwende die 1 Kanal Version.
Habe das mit größeren Widerständen und dem Code probiert, jedoch nimmt das Potentiometer immernoch Einfluss auf die Temperatur.

Dann bitte ein Schaltbild und ein Foto deines Aufbaus posten.
Da hast du irgend etwas falsch verdrahtet.

Edit:

Gerade aufgefallen: du verwendest die Pins 0 und 1, über Pin 1 hatte ich schon geschrieben, das muss A1 sein, da analoger Eingang.

Und die beiden Pins solltest du nie verwenden, da diese vom Serial-Port genutzt werden. Das macht unter anderem Probleme beim Upload.

habe die Pins 0 und 1 jetzt zu 4 und 5 geändert. Auf dem Bild mein Aufbau hoffe er ist leserlich :slight_smile:

daraus:

int temPin = 0;
int potPin = 1;

machst du

int temPin = A0;
int potPin = A1;

außerdem hast du pinMode(yelPin, OUTPUT); vergessen.
Für die Regelung solltest du noch eine kleine Hysterese einplanen.

nicdi:
habe die Pins 0 und 1 jetzt zu 4 und 5 geändert. Auf dem Bild mein Aufbau hoffe er ist leserlich :slight_smile:

Und, hast du jetzt eine Verbesserung festgestellt.

Wenn du es nach deiner Zeichnung aufgebaut hast, sollte es funktionieren.

Bis auf die fehlende Anweisung, lt. ardubu.

außerdem ist mir gerade noch aufgefallen, dass du isttemp 2 mal deklariert hast, 1 x Global als int und einmal lokal als float

Danke für die vielen antworten!
Nein habe immernoch das Problem das sobald ich den Soll Wert hochstelle automatisch die Temperatur steigt...
-10C (Soll-Wert) // cira 22/23C Stimmt
23.66C (Ist-Wert)
50
C (Soll-Wert) // Soll auf 50C gestellt
22.20
C (Ist-Wert)
50C (Soll-Wert)
26.10
C (Ist-Wert)
49C (Soll-Wert)
31.95
C (Ist-Wert) // ist Wert steigt an...
-10C (Soll-Wert) // Soll wieder runter auf -10C
22.68*C (Ist-Wert) // Temperatur stimmt wieder...

Edit; hatte das Problem wenn ich es nur durch float deklariert habe das er einen fehler ausgespuckt hat das ich isttemp nicht deklariert wäre

mach aus dem int isttemp ein float isttemp und nehme das lokale float raus und dann poste nochmal den sketch

int settemp;
int isttemp;
int Wert;
int temPin = A5;
int potPin = A4;
int rlsPin = 13;
int bluPin = 2;
int redPin = 3;
int yelPin = 12;
void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
pinMode(rlsPin, OUTPUT);
pinMode(bluPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(yelPin, OUTPUT);
digitalWrite(rlsPin, HIGH);
digitalWrite(bluPin, LOW);
digitalWrite(redPin, LOW);
}

void loop() {

   Wert = analogRead(potPin);

   settemp = map(Wert, 0, 1023, -10, 50);
   Serial.print(settemp);
   Serial.println("*C (Soll-Wert)");

   int rawvoltage = analogRead(temPin);
   float volts = rawvoltage / 205.0;
   float isttemp = 100.0 * volts - 50;
   Serial.print (isttemp);
   Serial.println("*C (Ist-Wert)");
   delay(2000);


 if (isttemp < settemp) {
   digitalWrite(rlsPin, LOW);
   digitalWrite(redPin, HIGH);
   digitalWrite(bluPin, LOW);
   digitalWrite(yelPin, HIGH);
 } else {
   digitalWrite(rlsPin, HIGH);
   digitalWrite(redPin, LOW);
   digitalWrite(bluPin, HIGH);
   digitalWrite(yelPin, LOW);
 }
}

das ist der Sketch momentan. Wenn das lokale float rausnehme fehlt mir doch "100.0 * volts - 50;"? Nehme ich das globale "int isttemp" raus sind die gemessenen Werte unrealistisch

versuch's mal so

int settemp;
float isttemp;
int Wert;
const int temPin = A5;
const int potPin = A4;
const int rlsPin = 13;
const int bluPin = 2;
const int redPin = 3;
const int yelPin = 12;
void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
pinMode(rlsPin, OUTPUT);
pinMode(bluPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(yelPin, OUTPUT);
digitalWrite(rlsPin, HIGH);
digitalWrite(bluPin, LOW);
digitalWrite(redPin, LOW);
}

void loop() {

 Wert = analogRead(potPin);
 settemp =map(Wert, 0, 1023, -10, 50);
 Serial.print(settemp);
 Serial.println("*C (Soll-Wert)");

 int rawvoltage= analogRead(temPin);
 float volts= rawvoltage/205.0;
 isttemp= 100.0 * volts -50;
 Serial.print (isttemp);
 Serial.println("*C (Ist-Wert)");
 delay(2000);

if (isttemp < settemp) {
 digitalWrite(rlsPin, LOW);
 digitalWrite(redPin, HIGH);
 digitalWrite(bluPin, LOW);
 digitalWrite(yelPin, HIGH);
} else 
if (isttemp > settemp + 1)
{
 digitalWrite(rlsPin, HIGH);
 digitalWrite(redPin, LOW);
 digitalWrite(bluPin, HIGH);
 digitalWrite(yelPin, LOW);
}
}

Funktioniert schon etwas besser, jedoch immernoch das Problem das sobald ich das Potentiometer hochdrehe (also denn Sollwert) die Ist temperatur mitsteigt:
50C (Soll-Wert) // Sollwert hochgestellt
27.07
C (Ist-Wert)
49C (Soll-Wert)
34.88
C (Ist-Wert)
49C (Soll-Wert)
34.88
C (Ist-Wert) // Temperatur steigt
-9C (Soll-Wert) // Sollwert runtergestellt
34.39
C (Ist-Wert)
-10C (Soll-Wert)
22.68
C (Ist-Wert) // Temp wieder auf dem wirklichen IST Stand

versuch mal für das Poti den A0 zu nehmen

nicdi:
Funktioniert schon etwas besser, jedoch immernoch das Problem das sobald ich das Potentiometer hochdrehe (also denn Sollwert) die Ist temperatur mitsteigt:
50C (Soll-Wert) // Sollwert hochgestellt
27.07
C (Ist-Wert)
49C (Soll-Wert)
34.88
C (Ist-Wert)
49C (Soll-Wert)
34.88
C (Ist-Wert) // Temperatur steigt
-9C (Soll-Wert) // Sollwert runtergestellt
34.39
C (Ist-Wert)
-10C (Soll-Wert)
22.68
C (Ist-Wert) // Temp wieder auf dem wirklichen IST Stand

Das ist nicht besser, sondern immer noch "Mist". Das darf nicht sein.

Was hast du für ein Netzteil dran? Ist die Spannung sauber und stabil?

Wie lang sind die Kabel?

Und warum packst du den Sketch nicht in Code-Tags?