Temperatuur regeling

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 13
Geregistreerd: 26 Dec 2013, 12:14

Temperatuur regeling

Berichtdoor danny » 26 Dec 2013, 12:22

even schetsen,
ik probeer een temperatuurregeling met een relais (voor koeltoogje) te maken. Hiervoor gebruik ik de lm35 aangezien ik toch niet onder 0°C moet meten.
Maar doet doet mijn sensor heel raar, als ik hem tussen mijn vingers hou meet hij goed tot hij tot ongeveer 30°C komt dan begint hij heel raar te doen. Hij meet bijvoorbeeld 30°C en de volgende meting in -33°C.
Wat kan hier het probleem van zijn? Is het omdat de relais ook op 5V aangesloten is en de LM35 minder spanning krijgt, of?
Kan iemand me helpen?

zie hier het programma wat ik geschreven heb (al de uitgangen is om een 7led display te sturen).

int IA_Sensor = 0; // de analoge pin voor de temperatuursensor
int compressor = 13; // de pin voor de vewrwarming
int koelingaan = 2;
int koelinguit = 3;
int pin1 = 4;
int pin2 = 5;
int pin3 = 6;
int pin4 = 7;
int pin5 = 8;
int pin6 = 9;
int pin7 = 10;
int Tsensor = 0; // variable voor de sensorwaarde
float Temperatuur;

void setup() {
pinMode(compressor, OUTPUT); // declare the ledPin as an OUTPUT
pinMode ( koelingaan,OUTPUT);
pinMode ( koelinguit,OUTPUT);
pinMode ( pin1,OUTPUT);
pinMode ( pin2,OUTPUT);
pinMode ( pin3,OUTPUT);
pinMode ( pin4,OUTPUT);
pinMode ( pin5,OUTPUT);
pinMode ( pin6,OUTPUT);
pinMode ( pin7,OUTPUT);
Serial.begin(9600);
}
void loop() {{{
Tsensor = analogRead(IA_Sensor); // read the value from the sensor
Temperatuur = (((5*Tsensor*100)/1024)-2);
if (Temperatuur > 21) {
digitalWrite(compressor,LOW); // koeling aan
digitalWrite(koelingaan,HIGH);
digitalWrite(koelinguit,LOW);

}
if (Temperatuur < 21 ) {
digitalWrite(compressor, HIGH); // Koeling uit
digitalWrite(koelingaan,LOW);
digitalWrite(koelinguit,HIGH);
}}
if (Temperatuur < 24){ // waarde 6 verschijnt op het scherm
digitalWrite (pin1,HIGH);
digitalWrite (pin2,HIGH);
digitalWrite (pin3,LOW);
digitalWrite (pin4,LOW);
digitalWrite (pin5,LOW);
digitalWrite (pin6,LOW);
digitalWrite (pin7,LOW);
}
if (Temperatuur < 23){ //waarde 5 verschijnt op het scherm
digitalWrite (pin1,LOW);
digitalWrite (pin2,HIGH);
digitalWrite (pin3,LOW);
digitalWrite (pin4,HIGH);
digitalWrite (pin5,LOW);
digitalWrite (pin6,LOW);
digitalWrite (pin7,LOW);
}
if (Temperatuur < 22){ // waarde 4 verschijnt op het scherm
digitalWrite (pin1,HIGH);
digitalWrite (pin2,LOW);
digitalWrite (pin3,LOW);
digitalWrite (pin4,HIGH);
digitalWrite (pin5,HIGH);
digitalWrite (pin6,LOW);
digitalWrite (pin7,LOW);
}
if (Temperatuur < 21){ // waarde 3 verschijnt op het scherm
digitalWrite (pin1,LOW);
digitalWrite (pin2,LOW);
digitalWrite (pin3,LOW);
digitalWrite (pin4,HIGH);
digitalWrite (pin5,LOW);
digitalWrite (pin6,LOW);
digitalWrite (pin7,HIGH);
}
if (Temperatuur < 20){ // waarde 2 verschijnt op het display
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
digitalWrite(pin5,LOW);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,HIGH);
}
if (Temperatuur < 19){ // waarde 1 verschijnt op het scherm
digitalWrite (pin1,HIGH);
digitalWrite (pin2,LOW);
digitalWrite (pin3,HIGH);
digitalWrite (pin4,HIGH);
digitalWrite (pin5,HIGH);
digitalWrite (pin6,LOW);
digitalWrite (pin7,HIGH);
}
if (Temperatuur < 18){ // waarde 0 verschijnt op het scherm
digitalWrite (pin1,LOW);
digitalWrite (pin2,LOW);
digitalWrite (pin3,HIGH);
digitalWrite (pin4,LOW);
digitalWrite (pin5,LOW);
digitalWrite (pin6,LOW);
digitalWrite (pin7,LOW);
}

}


delay(3000); // stop the program 5 min
Serial.println(Temperatuur); //NB afgeronde waarde Als nauwkeuriger, dan eerst met 10 of 100 vermenigvuldigen
}
Knipsel.PNG
de meting die ik krijg
Knipsel.PNG (14.18 KiB) 4289 keer bekeken

Advertisement

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Temperatuur regeling

Berichtdoor Rudi » 26 Dec 2013, 21:52

Eerst een opmerking, wil je voortaan de code tussen de hiervoor bestemde tags zetten aub, dat komt de leesbaarheid ten goed.

De oorzaak van je probleem ontstaat bij het declareren van de variabelen.
Voor "Tsensor" gebruik je een (unsigned) integer wat betekent dat deze een decimale waarde kan bevatten tussen -32768 en 32767.
Wanneer nu het product van
(5*Tsensor*100)

groter wordt dan 32767 dan bekom je een negatief getal als uitkomst. Wat je verder meeneemt in je berekening (vanwaar die -2 trouwens?).

De variabele "Temperatuur" is onnodig een float.

Wissel het datatype van Tsensor en Temperatuur om
Code: Alles selecteren
float Tsensor = 0; // variable voor de sensorwaarde
int Temperatuur;


De rest van de code kan zeker korter en wat me opvalt is dat je onnodig de uitgangen voor de display blijft doorlopen.
Bijvoorbeeld: als "Temperatuur" 18 is dan laat je de display steeds de cijfers 6 t/m 1 tonen wat waarschijnlijk voor enkele flauw oplichtende segmenten zorgt?

Nog iets:
delay(3000); // stop the program 5 min
Serial.println(Temperatuur);

dit zorgt voor 3 seconden wachttijd, geen 5 minuten. En voor test / debugging is het praktischer eerst het resultaat naar de ser.monitor te sturen alvorens te wachten.

Tot slot
Is het omdat de relais ook op 5V aangesloten is en de LM35 minder spanning krijgt, of?

Alleen wanneer je voeding qua vermogen wat krap berekend is en bij het leveren van de stroom voor het relais al iets door zijn knieën gaat.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Berichten: 13
Geregistreerd: 26 Dec 2013, 12:14

Re: Temperatuur regeling

Berichtdoor danny » 26 Dec 2013, 22:21

bedankt het probleem is opgelost

Berichten: 108
Geregistreerd: 07 Aug 2013, 21:34

Re: Temperatuur regeling

Berichtdoor KrisG » 27 Dec 2013, 10:49

Da's handig, mogen we ook weten hoe ?

Kris
Als je het probleem gedetailleerd genoeg omschrijft, heb je meestal al de oplossing.

Berichten: 13
Geregistreerd: 26 Dec 2013, 12:14

Re: Temperatuur regeling

Berichtdoor danny » 27 Dec 2013, 12:10

Ik ben nog wat op zoek geweest en heb ergens op een site een betere formule en inlezing gevonden.
zie hier de oplossing
int reading; // de analoge pin voor de temperatuursensor
int compressor = 13; // de pin voor de vewrwarming
int koelingaan = 2;
int koelinguit = 3;
int pin1 = 4;
int pin2 = 5;
int pin3 = 6;
int pin4 = 7;
int pin5 = 8;
int pin6 = 9;
int pin7 = 10;
int tempPin = 0; // variable voor de sensorwaarde
float tempC;

void setup() {
pinMode(compressor, OUTPUT); // declare the ledPin as an OUTPUT
pinMode ( koelingaan,OUTPUT);
pinMode ( koelinguit,OUTPUT);
pinMode ( pin1,OUTPUT);
pinMode ( pin2,OUTPUT);
pinMode ( pin3,OUTPUT);
pinMode ( pin4,OUTPUT);
pinMode ( pin5,OUTPUT);
pinMode ( pin6,OUTPUT);
pinMode ( pin7,OUTPUT);
Serial.begin(9600);
analogReference (INTERNAL);
}
void loop() {{{
reading = analogRead(tempPin); // read the value from the sensor
tempC = reading/9.31;
if (tempC > 3) {
digitalWrite(compressor,LOW); // koeling aan
digitalWrite(koelingaan,HIGH);
digitalWrite(koelinguit,LOW);

}
if (tempC < 3 ) {
digitalWrite(compressor, HIGH); // Koeling uit
digitalWrite(koelingaan,LOW);
digitalWrite(koelinguit,HIGH);
}}
if (tempC > 6){ // waarde 6 verschijnt op het scherm
digitalWrite (pin1,HIGH);
digitalWrite (pin2,HIGH);
digitalWrite (pin3,LOW);
digitalWrite (pin4,LOW);
digitalWrite (pin5,LOW);
digitalWrite (pin6,LOW);
digitalWrite (pin7,LOW);
}
if (tempC < 6){ //waarde 5 verschijnt op het scherm
digitalWrite (pin1,LOW);
digitalWrite (pin2,HIGH);
digitalWrite (pin3,LOW);
digitalWrite (pin4,HIGH);
digitalWrite (pin5,LOW);
digitalWrite (pin6,LOW);
digitalWrite (pin7,LOW);
}
if (tempC < 5){ // waarde 4 verschijnt op het scherm
digitalWrite (pin1,HIGH);
digitalWrite (pin2,LOW);
digitalWrite (pin3,LOW);
digitalWrite (pin4,HIGH);
digitalWrite (pin5,HIGH);
digitalWrite (pin6,LOW);
digitalWrite (pin7,LOW);
}
if (tempC < 4 ){ // waarde 3 verschijnt op het scherm
digitalWrite (pin1,LOW);
digitalWrite (pin2,LOW);
digitalWrite (pin3,LOW);
digitalWrite (pin4,HIGH);
digitalWrite (pin5,LOW);
digitalWrite (pin6,LOW);
digitalWrite (pin7,HIGH);
}
if (tempC < 3){ // waarde 2 verschijnt op het display
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
digitalWrite(pin5,LOW);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,HIGH);
}
if (tempC < 2){ // waarde 1 verschijnt op het scherm
digitalWrite (pin1,HIGH);
digitalWrite (pin2,LOW);
digitalWrite (pin3,HIGH);
digitalWrite (pin4,HIGH);
digitalWrite (pin5,HIGH);
digitalWrite (pin6,LOW);
digitalWrite (pin7,HIGH);
}
if (tempC < 1){ // waarde 0 verschijnt op het scherm
digitalWrite (pin1,LOW);
digitalWrite (pin2,LOW);
digitalWrite (pin3,HIGH);
digitalWrite (pin4,LOW);
digitalWrite (pin5,LOW);
digitalWrite (pin6,LOW);
digitalWrite (pin7,LOW);
}

}

Serial.println(tempC); //NB afgeronde waarde Als nauwkeuriger, dan eerst met 10 of 100 vermenigvuldigen
delay(3000); // stop the program 1 min

}

ps ik stuur een 7sigment display aan om de temperatuur te laten zien aangezien het koeltoogje toch rond de 3 graden moet zitten gaat dat gemakkelijk op die manier

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten