Thermostat-Code problem
-
Hi, so im trying to make a a project with the arduino, where i have this:
-Potenciometer
-temperature sensor
-RelaySo the goal is to read the temperature of something that is heating and turn that off at a certain value that is regulated with the potenciometer.This Is simple , but i want to do something like turn off at 100ºC and only turn that on again at 95ºC. How can you help me? This is the code:
// Relé ligado ao pino 7
int porta_rele1 = 7;
//Relé ligado ao pino 8
int porta_rele2 = 8;float celsius;
const int porta_sensor1 = A0; // sonda 1 ligada ao pino AO
const int porta_sensor2 = A2; // sonda 2 ligada ao pino A1
const int porta_pot1 = A1; // potenciometro 1 ligada ao pino AO
const int porta_pot2 = A3; // potenciometro 2 ligada ao pino AOvoid setup()
{
//Define pinos para o rele como saida
pinMode(porta_rele1, OUTPUT);
pinMode(porta_rele2, OUTPUT);
//Define pinos dos sensores como entrada
pinMode(porta_pot1, INPUT);
pinMode(porta_pot2, INPUT);
pinMode(porta_sensor1, INPUT);
pinMode(porta_sensor2, INPUT);
//Estado inicial dos reles - desligados
digitalWrite(porta_rele1, LOW);
digitalWrite(porta_rele2, LOW);analogReference(INTERNAL);
Serial.begin(9600);Serial.begin(9600);
pinMode(porta_pot1, INPUT);
pinMode(porta_sensor1, INPUT);
pinMode(porta_pot2, OUTPUT);
pinMode(porta_sensor2, OUTPUT);
}void loop()
{
int value1 = analogRead(porta_sensor1); //valor lido na sonda 1
long celsius1 = value1/9.31;
int value2 = analogRead(porta_sensor1); //valor lido na sonda 2
long celsius2 = value2/9.31;
Serial.print(celsius1);
Serial.print(celsius2);int valueA = analogRead(porta_pot1);
int valueB = analogRead(porta_pot2);long celsiusA = valueA/9.31; // 10 mV por graus C.
Serial.print(celsiusA);
long celsiusB = valueB/9.31; // 10 mV por graus C.
Serial.print(celsiusB);if(celsius1 <= celsiusA)
{digitalWrite(porta_sensor1, HIGH); // aquecedor no pino 9
}
else
{digitalWrite(porta_sensor1, LOW); // aquecedor no pino 9
}
delay(1000);
}
-
Big welcome to the MySensors community @Bruno-Cunha !
I don't understand what valueA and valueB in your sketch is, but I would just add
#define HYSTERESIS 5 // 5 Degrees hysteresis bool heating = false;
at start of the sketch
and changeif(celsius1 <= celsiusA) { digitalWrite(porta_sensor1, HIGH); // aquecedor no pino 9 } else { digitalWrite(porta_sensor1, LOW); // aquecedor no pino 9 }
to
if(heating) if (celsius1 > celsiusA) { digitalWrite(porta_sensor1, LOW); heating = false; } } else { if (celsius1 <= celsiusA - HYSTERESIS) { digitalWrite(porta_sensor1, HIGH); heating = true; } }
Edit: Sorry. I messed up. The original code was wrong but I think the updated post should be ok.
-
celsius1 is the value read by the sensor anda cesliusA is the value regulated by the potenciometer. One question, what is the purpose of the "#define HYSTERESIS 5"?
-
@Bruno-Cunha it sets the hysteresis to 5 degrees
-
I figured out a simpler way. There is no need for the heating variable.
if (celsius1 > celsiusA) { digitalWrite(porta_sensor1, LOW); } if (celsius1 <= celsiusA - HYSTERESIS) { digitalWrite(porta_sensor1, HIGH); }
-
Yes it worked, i tried something similar before but i did "celsiusA -5" i didnt know i need a variable.I think its solved, thank you very much :)))
-
@Bruno-Cunha it is not a variable, and using - 5 would be the same, but using 5 makes it harder to understand and maintain the code. See https://refactoring.com/catalog/replaceMagicNumberWithSymbolicConstant.html for more info on why I prefer using define.