Colegas... não tenho muito conhecimento em C e Arduino. Estou mais para curioso hobbysta. Gosto de montar as coisas.
Montei um sistema para controlar a temperatura de uma geladeira. Dentro dela tem um pequeno aquecedor. Tudo controlado por dois relês.
Minhas dúvidas são as seguintes:
Toda vez que inicio o sistema, tanto a geladeira quanto o aquecedor ligam. Como fazer para não ligarem? Meu palpite é colocar uma instrução no setup mas como não tenho certeza se é o local certo, achei melhor perguntar.
Outra dúvida é a seguinte. Em vários ifs, para desligar a geladeira e o aquecedor, uso a seguinte instrução:
digitalWrite(geladeira, LOW);
digitalWrite(aquecedor, LOW);
Funciona em 4 ifs...
Mas em um deles, só desliga a geladeira e o aquecedor se eu fizer o inverso
digitalWrite(geladeira, HIGH);
digitalWrite(aquecedor, HIGH);
Porque isso acontece?
EDITADO... precisava de uma ideia mas achei uma forma de resolver
O sketch "básico" é esse:
/************************************************************************************
Controle da Temperatura
************************************************************************************/
#define BLYNK_TEMPLATE_ID "TMPLigQ_rZSH"
#define BLYNK_DEVICE_NAME "Controle"
#define BLYNK_AUTH_TOKEN "xxxxx"
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "xxxx";
char pass[] = "xxxx";
#define geladeira D0
#define aquecedor D1
#define ds18b20 D2
BlynkTimer timer;
int estadoGelad = 0;
int estadoAquec = 0;
int desligaGelad = 0;
int desligaAquec = 0;
int tempAlvo;
float histerese;
float refFrio;
float refQuente;
// Objeto que tratará da troca de dados com o sensor DS18B20
OneWire oneWire(ds18b20);
DallasTemperature sensors(&oneWire);
//Atualiza os pinos virtuais com os dados salvos no servidor Blynk. Importante em caso de quedas de energia/conexão
BLYNK_CONNECTED() {
Blynk.syncVirtual(V2, V3);
}
//Recebe comando do Blynk para ligar ou desligar a geladeira manualmente
BLYNK_WRITE(V0)
{
estadoGelad = param.asInt(); //Recebe 1 para ligar ou 0 para desligar
if (estadoGelad == 1){
digitalWrite(geladeira, HIGH); // Envia comando para relê ligar a geladeira
}
if (estadoGelad == 0) {
digitalWrite(geladeira, LOW); // Envia comando para relê desligar a geladeira
}
}
//Recebe comando do Blynk para ligar ou desligar o aquecedor manualmente
BLYNK_WRITE(V1)
{
estadoAquec = param.asInt(); //Recebe 1 para ligar ou 0 para desligar
if (estadoAquec == 1){
digitalWrite(aquecedor, HIGH); // Envia comando para relê ligar o aquecedor
}
if (estadoAquec == 0) {
digitalWrite(aquecedor, LOW); // Envia comando para relê desligar a geladeira
}
}
BLYNK_WRITE(V2) // Parâmetro de temperatura alvo
{
tempAlvo = param.asInt();
}
BLYNK_WRITE(V3) // Parâmetro de histerese
{
histerese = param.asFloat();
}
//Se clicar no botão V5, que é só pra mostrar se a geladeira está ligada ou não, desliga novamente o botão, ou seja, não serve pra ligar a geladeira
BLYNK_WRITE(V5)
{
Blynk.virtualWrite(V5, LOW);
}
//Se clicar no botão V5, que é só pra mostrar se o aquecedor está ligado ou não, desliga novamente o botão, ou seja, não serve pra ligar o aquecedor
BLYNK_WRITE(V6)
{
Blynk.virtualWrite(V6, LOW);
}
void Controle()
{
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
Blynk.virtualWrite(V4, tempC); //Envia temperatura (DS18B20) para o Blynk
refFrio = tempAlvo - histerese; // Define temperatura alvo mais histerese para frio
refQuente = tempAlvo + histerese; // Define temperatura alvo mais histerese para quente
Blynk.virtualWrite(V7, refFrio); //Envia refencia para o Blynk
Blynk.virtualWrite(V8, refQuente); //Envia referencia para o Blynk
if (tempC > refQuente) { // Se a temperatura estiver maior que refQuente, liga a geladeira e desliga aquecedor
digitalWrite(geladeira, HIGH);
digitalWrite(aquecedor, LOW);
Blynk.virtualWrite(V5, HIGH);
Blynk.virtualWrite(V6, LOW);
Serial.println("Geladeira Ligada");
Serial.print("A temperatura é: ");
Serial.println(tempC);
Serial.print("A referência é: ");
Serial.println(refQuente);
desligaGelad = 1;
}
else if (tempC < refFrio) { // Se a temperatura estiver menor que refFrio, liga o aquecedor e desliga geladeira
digitalWrite(geladeira, LOW);
digitalWrite(aquecedor, HIGH);
Blynk.virtualWrite(V5, LOW);
Blynk.virtualWrite(V6, HIGH);
Serial.println("Aquecedor Ligado");
Serial.print("A temperatura é ");
Serial.println(tempC);
Serial.print("A referência é ");
Serial.println(refFrio);
desligaAquec = 1;
}
if ((desligaGelad == 1) && (tempC < refQuente)){
digitalWrite(geladeira, LOW);
Blynk.virtualWrite(V5, LOW);
desligaGelad = 0;
}
if ((desligaAquec == 1) && (tempC > refFrio)){
digitalWrite(aquecedor, LOW);
Blynk.virtualWrite(V6, LOW);
desligaAquec = 0;
}
if ((tempC < refQuente) && (tempC > refFrio)){
digitalWrite(aquecedor, HIGH);
digitalWrite(geladeira, HIGH);
Blynk.virtualWrite(V5, LOW);
Blynk.virtualWrite(V6, LOW);
}
}
void setup()
{
pinMode(geladeira,OUTPUT);
pinMode(aquecedor,OUTPUT);
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, Controle);
}
void loop()
{
Blynk.run();
timer.run();
}