Ir para conteúdo
  • Cadastre-se

dúvida Projeto Incubadora CO2

Avalie este tópico:


Everton Aljonas

Posts em destaque

Saudações pessoal. Estou desenvolvendo aos poucos um software para controlar uma incubadora.

Minha ideia é setar uma temperatura (menu 2), e na tela inicial (menu 1), mostrar a temperatura e o CO2 (que não esta sendo trabalhado no momento), e futuramente novas funções serão adicionadas como Overtemp, Temperatura da porta, etc.

Consigo ver a variação de temperatura, porém o rele nao desliga quando atinge a temperatura de setpoint que programei.

 

 

 

Programa todo abaixo.

Utilizado um shield LCD com teclado + modulo rele serial (4 reles) + sensor DS18B20

 

/*-----------------------------------------------------------------------------------------------------------------*/

#include <LiquidCrystal.h>                              //Biblioteca para o display LCD
#include <DallasTemperature.h>                          //Biblioteca Dallas
#include <OneWire.h>                                     //protocolo de Barramento da Dallas - Pode adicionar varios sensores a um mesmo pino
#include <SerialRelay.h>                                //Biblioteca Modulo Serial de Reles
#include <EEPROM.h>

// --- Mapeamento de Hardware ---

OneWire pino(11);                                       //Define o pino que receberá a informação
DallasTemperature barramento(&pino);                    //Objeto que define o barramento dos sensores
DeviceAddress sensor1;                                //Define Sensor 1

// --- Protótipo das Funções Auxiliares ---
void keyboardRead();                                       //Função para modificar o menu atual
void dispMenu();                                        //Função para mostrar o menu atual
void INICIO();                                   //Funçao do menu1, temperatura e co2
void relay1();                                   //função do rele 1
void TEMP();                                    //função do menu 2, setpoint de tempetura.



// --- Variáveis Globais ---
char menu = 0x01;                                       //Variável para selecionar o menu

int adc_value = 0x00;                       //armazena o valor digital do conversor AD

boolean RIGHT  = 0x00, butt01 = 0x00,       //botão e flag Right
        UP     = 0x00, butt02 = 0x00,       //botão e flag Up
        DOWN   = 0x00, butt03 = 0x00,       //botão e flag Down
        LEFT   = 0x00, butt04 = 0x00,       //botão e flag Left
        SELECT = 0x00, butt05 = 0x00;        //botão e flag Select

float temp1,T_SET=25;

const int NUMERO_MODULOS = 1; //determina a quantidade de modulos conectados (maximo de 10)
SerialRelay reles (13, 12, NUMERO_MODULOS); //definicao da pinagem de data e clock do modulo, e da quantidade de modulos

// --- Hardware do LCD ---
LiquidCrystal disp(8,  //RS no digital 8
                   9,  //EN no digital 9
                   4,  //D4 no digital 4
                   5,  //D5 no digital 5
                   6,  //D6 no digital 6
                   7); //D7 no digital 7

// --- Configurações Iniciais ---
void setup()
{
  
  disp.begin(16,2);                                      //Inicializa LCD 16 x 2
  barramento.begin();
  barramento.getAddress(sensor1,0);
  disp.setCursor(3,0);
  disp.print("TECHNOLAB");//mensagem na primeira linha
  disp.setCursor(3,1);
  disp.print("SOLUCOES");//mensagem segunda linha
  delay (5000);
  disp.clear();
 
} //end setup
// --- Loop Infinito ---
void loop()
{
   keyboardRead(); 
   dispMenu();
   relay1();
   
       if(SELECT == 0X01)                   //tecla SELECT pressionada?
    {                                       //sim
      SELECT =0x00;                          //limpa flag da tecla
    }//end if select
      if(RIGHT == 0x01)                              //tecla right pressionada?
    {                                              //sim...
      RIGHT = 0x00;                                //limpa flag da tecla
      delay(500);
      disp.clear();                                 //Posiciona cursor na coluna 1, linha 2
      menu++;                                     //Imprime mensagem
      if(menu > 0x02) menu = 0x01; 
    } //end if right

    if(UP == 0x01)                                 //tecla up pressionada?
    {                                              //sim...
      UP = 0x00;                                   //limpa flag da tecla
      delay (500);
        T_SET++;
 
       EEPROM[1] = T_SET;
        
   
    } //end if up
    
    if(DOWN == 0x01)                               //tecla down pressionada?
    {                                              //sim...
      DOWN = 0x00;                                 //limpa flag da tecla
      delay (500);
      T_SET--;
      EEPROM[1] = T_SET;
    } //end if down
    
    if(LEFT == 0x01)                               //tecla left pressionada?
    {                                              //sim...
      LEFT = 0x00;                                 //limpa flag da tecla
      delay(500);
      disp.clear();                                 //Imprime mensagem
      menu--;
      if(menu < 0x01) menu = 0x02;
    } //end IF left

}

// --- Desenvolvimento das Funções Auxiliares ---
void keyboardRead()                                       //Modifica o menu atual
{
     adc_value = analogRead(A0);                       //Variável para leitura recebe valor AD de A0

     // --- Testa se os botões foram pressionados ---
     // Se foi pressionado, seta a respectiva flag
     if      (adc_value <  50)                    butt01 = 0x01;
     else if (adc_value > 103 && adc_value < 200) butt02 = 0x01;
     else if (adc_value > 250 && adc_value < 380) butt03 = 0x01;
     else if (adc_value > 450 && adc_value < 550) butt04 = 0x01;
     else if (adc_value > 600 && adc_value <780) butt05 = 0x01;
     
    

     // --- Testa se os botões foram liberados ---
     //
     if (adc_value > 50 && butt01)             //Botão right solto e flag butt01 setada?
     {                                         //Sim...
         butt01 = 0x00;                        //Limpa flag butt01
         RIGHT  = 0x01;                        //Seta flag right
         
     } //end right
     if (adc_value > 200 && butt02)            //Botão up solto e flag butt02 setada?
     {                                         //Sim...
         butt02 = 0x00;                        //Limpa flag butt02
         UP     = 0x01;                        //Seta flag up
      
     } //end up
     if (adc_value > 380 && butt03)            //Botão down solto e flag butt03 setada?
     {                                         //Sim...
         butt03 = 0x00;                        //Limpa flag butt03
         DOWN   = 0x01;                        //Seta flag down
       
     } //end down
     if (adc_value > 550 && butt04)            //Botão left solto e flag butt04 setada?
     {                                         //Sim...
         butt04 = 0x00;                        //Limpa flag butt04
         LEFT   = 0x01;                        //Seta flag left
       
     } //end left
     if (adc_value > 780 && butt05)            //Botão left solto e flag butt04 setada?
     {                                         //Sim...
         butt05 = 0x00;                        //Limpa flag butt04
         SELECT   = 0x01;                        //Seta flag left
       
     } //end SELECT


} //end keyboardRead
/*---------------------------------------------------------------------------------------------*/
void dispMenu()                                         //Mostra o menu atual
{
    switch(menu)                                        //Controle da variável menu
    {
       case 0x01:                                       //Caso 1
             INICIO();                                 //Chama a tela inciail que mostra nivel de CO2 e temperatura atual
             
             break;                                     //break
       case 0x02:                                       //Caso 2
             TEMP();                                   //Chama a função de setpoint de temperatura
             break;
             
    }}
/*-----------------------------------------------------------------------------------------------------*/
void INICIO()                                        //TELA INICIAL (MENU1)
{
  barramento.requestTemperatures();// realiza leitura do sensor de temperatura
  float temp1 = barramento.getTempC(sensor1);
   delay(1000);
  disp.setCursor(0,0);
  disp.print("TEMP:");//mensagem na primeira linha
  disp.print(temp1);//valor lido no sensor de temperatura interno
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
  disp.setCursor(0,1);
  disp.print("CO2:  ");//Mensagem segunda linha
 // disp.print(valorCO2);// valor lido no sensor de CO2
  disp.write(B00100101);//SIMBOLO DE %

} //end telaInicial
/*---------------------------------------------------------------------------------------------*/
void TEMP()                                        //SETPOINT TEMPERATURA(menu2)
{
  disp.setCursor(2,0);
  disp.print("TEMPERATURA");//mensagem na primeira linha
  disp.setCursor(5,1);
  disp.print(T_SET);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
  if(EEPROM[0] !=25){
    EEPROM[0]= 25;
    EEPROM[1]= T_SET;
  }
  else {
    T_SET = EEPROM[1];
  }
}

void relay1() {
    //condicao de acionamento
    if (T_SET > temp1){ //se a temperatura do sensor 1 for menor que a temperatura de setpoint
      reles.SetRelay(1, SERIAL_RELAY_ON, 1); //liga o rele 1
    }
      while (T_SET <= temp1) {      //se a temperatura do sensor 1 for maior que a temperatura de setpoint
      reles.SetRelay(1, SERIAL_RELAY_OFF, 1); //desliga o rele 1
    }
  }


        

 

Editado: por Everton Aljonas
Detalhamento de informações
Link para o comentário
Compartilhar em outros sites

  • Everton Aljonas alterou o título para Projeto Incubadora CO2
  • 1 ano depois...
void relay1() {
    barramento.requestTemperatures(); // Solicita a leitura dos sensores de temperatura
    float temp1 = barramento.getTempC(sensor1); // Lê a temperatura atual do sensor

    // Condição de acionamento do relé
    if (temp1 < T_SET) { // Se a temperatura atual for menor que a temperatura de setpoint
        reles.SetRelay(1, SERIAL_RELAY_ON, 1); // Liga o relé 1
    } else { // Se a temperatura atual for maior ou igual ao setpoint
        reles.SetRelay(1, SERIAL_RELAY_OFF, 1); // Desliga o relé 1
    }
}

 

tenta ver se funciona, tem rele que e ativado com 0v ....

Link para o comentário
Compartilhar em outros sites

Participe agora da conversa!

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, faça login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restaurar formatação

  Apenas 75 emoticons máximos são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir apenas como um link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Você não pode colar imagens diretamente. Envie ou insira imagens do URL.

SOBRE O ELETRÔNICABR

EletrônicaBR é o melhor fórum técnico online, temos o maior e mais atualizado acervo de Esquemas, Bios e Firmwares da internet. Através de nosso sistema de créditos, usuários participativos têm acesso totalmente gratuito. Os melhores técnicos do mundo estão aqui!
Técnico sem o EletrônicaBR não é um técnico completo! Leia Mais...
×
×
  • Criar Novo...