Dúvidas sobre sketch... HIGH e LOW

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(); 
}

Não hesites em postar a tua solução para ajudar futuros makers e fazer parte da discussão.

Montei um sistema para controlar a temperatura de uma geladeira. Dentro dela tem um pequeno aquecedor.

Uma geladeira com aquecedor?

Como tens os relés ligados? Essas instruções tem ifs antes deles e esses ifs é que controlam se o aquecedor aquece ou não.

Sim... uso para fermentação. Então, a temperatura tem que ser controlada. Tipo... seto para 10° com variação de 0,2°. Então, quando a temperatura baixa de 9,8°, aciona o aquecedor para fazer voltar ao alvo.

A questão dos relês é que LOW acionava o relê no lugar de desligar como eu imaginava. Então, obviamente não estava funcionando como eu esperava.

No fim, acrescentei muitas outras instruções. Funciona com o Blynk e vc pode atualizar via HTTPServer. Caso alguém se interesse, tá aqui o sketch.

/************************************************************************************

 Controle da Fermentação com atualização via HTTPServer
  
************************************************************************************/

#define BLYNK_TEMPLATE_ID "xxxxx"
#define BLYNK_DEVICE_NAME "Controle Fermentador"
#define BLYNK_AUTH_TOKEN "xxxxx"
#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>
#include <LittleFS.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#ifndef STASSID
#define STASSID "xxx"
#define STAPSK  "xxx"
#endif

char auth[] = BLYNK_AUTH_TOKEN;
const char* host = "controle-geladeira";
const char* ssid = STASSID;
const char* pass = STAPSK;

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;

#define geladeira D0
#define aquecedor D1
#define ds18b20 D2
#define LedSistema D5 //Led vermelho
#define LedGeladeira D6 //Led verde
#define LedAquecedor D8 //Led amarelo

BlynkTimer timer;

int estadoGelad = 0;
int estadoAquec = 0;
int desligaGelad = 0;
int desligaAquec = 0;
int tempo = 0;
int tempAlvo;
float histerese;
float refFrio;
float refQuente;
float tempC;
long tempoLiga;
long setIntervCont;
int geladLigada = 0;
int aquecLigado = 0;
int controle_ID;
int tempoPLiga_ID;

/*
 VO: Comando para ligar ou desligar a geladeira manualmente
 V1: Comando para ligar ou desligar o aquecedor manualmente - não coloquei para atualizar pois o próprio sistema irá ligar desligar dependendo da temperatura e parâmetros
 V2: Parâmetro de temperatura alvo
 V3: Parâmetro de histerese
 V4: Temperatura BS18B20
 V5: Label geladeira ligada ou desligada - automaticamente
 V6: Label aquecedor ligado ou desligado - automaticamente
 V9: Define tempo de descanso após atingir alvo
 */
 
// 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, V9);
}

//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, LOW); // Envia comando para relê ligar a geladeira
    digitalWrite(LedGeladeira, HIGH); //Liga o led verde
    Serial.println("Geladeira ligada manualmente!");
  }
  
  if (estadoGelad == 0)  {
    digitalWrite(geladeira, HIGH); // Envia comando para relê desligar a geladeira
    digitalWrite(LedGeladeira, LOW); //Desliga o led verde
    Blynk.virtualWrite(V5, LOW); //Desliga o led Geladeira automática no Blynk
    Serial.println("Geladeira desligada manualmente!");
   }
}

//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, LOW); // Envia comando para relê ligar o aquecedor
    digitalWrite(LedAquecedor, HIGH); //Liga o led amarelo    
    Serial.println("Aquecedor ligado manualmente!");
  }
  
  if (estadoAquec == 0)  {
    digitalWrite(aquecedor, HIGH); // Envia comando para relê desligar o aquecedor
    digitalWrite(LedAquecedor, LOW); //Desliga o led amarelo
    Blynk.virtualWrite(V6, LOW); //Desliga o led Aquecedor automático no Blynk
    Serial.println("Aquecedor desligado manualmente!");    
  }
}

BLYNK_WRITE(V2) // Parâmetro de temperatura alvo
  {
    tempAlvo = param.asInt();
  }

BLYNK_WRITE(V3) // Parâmetro de histerese
  {
    histerese = param.asFloat();
  }

BLYNK_WRITE(V9)
{ 
  int novoTimer = param.asInt();
  timer.deleteTimer(tempoPLiga_ID);
  tempoPLiga_ID = timer.setInterval(novoTimer * 60000L, tempoPLiga);
}

void handleNotFound() {
  String message = "Página web não encontrada - arquivo não está no esp\n\n";
  message += "URI: ";
  message += httpServer.uri();
  message += "\nMethod: ";
  message += (httpServer.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += httpServer.args();
  message += "\n";

  for (uint8_t i = 0; i < httpServer.args(); i++) {
    message += " " + httpServer.argName(i) + ": " + httpServer.arg(i) + "\n";
  }

  httpServer.send(404, "text/plain", message);
}

bool loadFromFS(String path, String dataType) {
  Serial.print("Requested page -> ");
  Serial.println(path);
  if (LittleFS.exists(path)){
      File dataFile = LittleFS.open(path, "r");
      if (!dataFile) {
          handleNotFound();
          return false;
      }

      if (httpServer.streamFile(dataFile, dataType) != dataFile.size()) {
        Serial.println("Enviados menos dados do que o esperado!");
      }else{
          Serial.println("Page served!");
      }

      dataFile.close();
  }else{
      handleNotFound();
      return false;
  }
  return true;
}

void handleRoot() {
  loadFromFS("/index_color.html.gz", "text/html");
//  loadFromFS("/index_black_white.html.gz", "text/html");
}

void temperatura() //Envia dados da temperatura e valores alvos para o Blynk
  {
    sensors.requestTemperatures();
    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
  }

void tempoPLiga() // Quando a geladeira ligar, vai desabilitar o timer controle e habilitar o timer deste tempoLiga, que é mais longo. Apos passar o tempo, habilita o timer mais curto
  {
    timer.enable(controle_ID);
    timer.disable(tempoPLiga_ID); 
    Serial.println("Passou tempo longo e geladeira ou aquecedor podem voltar a ligar");
  }  

void controle() //Liga ou desliga geladeira ou aquecedor se temperatura estiver fora da histerese
  {
    if (tempC > refQuente) { // Se a temperatura estiver maior que refQuente, liga a geladeira
      digitalWrite(geladeira, LOW);
      digitalWrite(LedGeladeira, HIGH); //Liga o led verde
      Blynk.virtualWrite(V5, HIGH);
      Serial.println("Geladeira Ligada");
      Serial.print("Temperatura atual: ");
      Serial.println(tempC);
      Serial.print("Temperatura referência: ");
      Serial.println(refQuente);
      geladLigada = 1;
      timer.disable(controle_ID);
  } 
  
    else if (tempC < refFrio){ // Se a temperatura estiver menor que refFrio, liga o aquecedor
      digitalWrite(aquecedor, LOW);
      Blynk.virtualWrite(V6, HIGH);
      digitalWrite(LedAquecedor, HIGH); //Liga o led amarelo
      Serial.println("Aquecedor Ligado");
      Serial.print("Temperatura atual: ");
      Serial.println(tempC);
      Serial.print("Temperatura referência: ");
      Serial.println(refFrio);
      aquecLigado = 1;
      timer.disable(controle_ID);      
  }
    else {
      timer.disable(tempoPLiga_ID); //Evita ligar o tempo longo para ligar geladeira ou aquecedor
    }
  }

void noAlvo() //Desliga geladeira e aquecedor se temperatura dentro do alvo + histerese
  {
    if ((geladLigada == 0) && (estadoGelad == 0)){
      if ((tempC < refQuente) && (tempC > refFrio)){
        digitalWrite(geladeira, HIGH);
        Blynk.virtualWrite(V5, LOW);
        digitalWrite(LedGeladeira, LOW); //Desiga o led verde
        Serial.println("Geladeira desligada!");
        }
      }

    if ((aquecLigado == 0) && (estadoAquec == 0)){
      if ((tempC < refQuente) && (tempC > refFrio)){
        digitalWrite(aquecedor, HIGH);
        Blynk.virtualWrite(V6, LOW);
        digitalWrite(LedAquecedor, LOW); //Liga o led amarelo
        Serial.println("Aquecedor desligado!");
        }      
      }
      
    if ((geladLigada == 1) && (estadoGelad == 0)){ //Se geladeira ligada no modo automatico e atingir temp alvo (não histerese), desliga geladeira e liga timer longo
      if (tempC < tempAlvo){
        digitalWrite(geladeira, HIGH);
        Blynk.virtualWrite(V5, LOW);
        digitalWrite(LedGeladeira, LOW); //Desiga o led verde
        geladLigada = 0;
        Serial.print("Geladeira desligada! Temperatura: ");
        Serial.println(tempC);
        Serial.println("Geladeira acabou de desligar e começou contagem de tempo longo para ligar novamente");
        timer.enable(tempoPLiga_ID);
        }     
      }

    if ((aquecLigado == 1) && (estadoAquec == 0)){ //Se aquecedor ligado no modo automatico e atingir temp alvo (não histere), desliga aquecedor e liga timer longo
      if (tempC > tempAlvo){
        digitalWrite(aquecedor, HIGH);
        Blynk.virtualWrite(V6, LOW);
        digitalWrite(LedAquecedor, LOW); //Desliga o led amarelo
        aquecLigado = 0;
        Serial.print("Aquecedor desligado! Temperatura: ");
        Serial.println(tempC);
        Serial.println("Aquecedor acabou de desligar e começou contagem de tempo longo para ligar novamente");        
        timer.enable(tempoPLiga_ID);
        }
      }
  }
void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println("Booting Sketch...");
  Blynk.begin(auth, ssid, pass);

  Serial.print(F("Inicializando FS..."));
  if (LittleFS.begin()){
    Serial.println(F("done."));
  }else{
    Serial.println(F("fail."));
  }

  MDNS.begin(host);

  // handler for the /update form page
  httpServer.on("/update", HTTP_GET, handleRoot);

  httpUpdater.setup(&httpServer);

  httpServer.begin();

  MDNS.addService("http", "tcp", 80);
  Serial.printf("HTTPUpdateServer modified ready! Open http://%s.local/update in your browser\n", host);
    pinMode(geladeira,OUTPUT);
    pinMode(aquecedor,OUTPUT);
    pinMode(LedSistema, OUTPUT);
    pinMode(LedGeladeira, OUTPUT);
    pinMode(LedAquecedor, OUTPUT);
    digitalWrite(geladeira, HIGH); // Envia comando para relê desligar a geladeira
    digitalWrite(aquecedor, HIGH); // Envia comando para relê desligar o aquecedor
    digitalWrite(LedSistema, HIGH); //Liga o led vermelho
    digitalWrite(LedGeladeira, LOW); //Mantem o led verde desligado
    digitalWrite(LedAquecedor, LOW); //Mantem o led amarelo desligado
    Blynk.virtualWrite(V5, LOW); //Mantem o led Geladeira automática do Blynk desligado
    Blynk.virtualWrite(V6, LOW); //Mantem o led Aquecedor automático do Blynk desligado
    Serial.begin(9600);
    timer.setInterval(5000L, temperatura);
    timer.setInterval(6000L, noAlvo);
    controle_ID = timer.setInterval(8000L, controle);
    tempoPLiga_ID = timer.setInterval(300000L, tempoPLiga);
}

void loop() {
  httpServer.handleClient();
  MDNS.update();
  Blynk.run();
  timer.run(); 
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.