Go Down

Topic: Problem bei 2 Punkt Regelung (Read 2682 times) previous topic - next topic

nicdi

May 06, 2016, 01:27 pm Last Edit: May 06, 2016, 01:47 pm by uwefed Reason: add CODE Tags </>
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  :smiley-confuse: . Hoffe ihr versteht mein Problem... Unten noch der Code und ein Auszug aus den Daten des Seriellen Monitors:
28.05*C (Ist-Wert)
26*C (Soll-Wert)
23.66*C (Ist-Wert)
36*C (Soll-Wert)
24.63*C (Ist-Wert)
33*C (Soll-Wert)
28.05*C (Ist-Wert)
32*C (Soll-Wert)
28.05*C (Ist-Wert)
32*C (Soll-Wert)
28.05*C (Ist-Wert)
Nun der Code:
Code: [Select]
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);
}
}

uwefed

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

nicdi

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ß

HotSystems

#3
May 06, 2016, 02:24 pm Last Edit: May 06, 2016, 02:26 pm by HotSystems
Die Reihenfolge deines Codes und die Klammerstellung "{}" ist etwas merkwürdig.

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

Code: [Select]
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.

Code: [Select]
int potPin = A1;
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

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.

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

nicdi

#6
May 06, 2016, 02:38 pm Last Edit: May 06, 2016, 02:44 pm by 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.
Hier nochmal ein sehr deutliches Beispiel aus dem Seriellen Monitor:
30*C (Soll-Wert)
23.17*C (Ist-Wert)
30*C (Soll-Wert)
25.61*C (Ist-Wert)
30*C (Soll-Wert)
30.00*C (Ist-Wert)
30*C (Soll-Wert)
23.17*C (Ist-Wert)
30*C (Soll-Wert)
25.61*C (Ist-Wert)

HotSystems

Der Link funktioniert nicht richtig.

Aber wenn es dieses Relais-Board ist, funktioniert es.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

HotSystems

#8
May 06, 2016, 02:47 pm Last Edit: May 06, 2016, 02:55 pm by HotSystems
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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

nicdi

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

ardubu

daraus:
Code: [Select]
int temPin = 0;
int potPin = 1;
machst du
Code: [Select]
int temPin = A0;
int potPin = A1;

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

HotSystems

habe die Pins 0 und 1 jetzt zu 4 und 5 geändert. Auf dem Bild mein Aufbau hoffe er ist leserlich  :)
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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

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

nicdi

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

ardubu

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

Go Up