Ir ao conteúdo
  • Cadastre-se

Arduino rogramação de MENU em uma chocadeira


Posts recomendados

Olá amigos, estou desenvolvendo uma chocadeira com PID via DIMMER PWM..

Eu estou conseguindo bons resultados. Mas meu nível de programação não permite eu desenvolver apenas uma parte do MENU..

Que seria criar um processo de choca, com o RTC contar os dias a partir do momento que a pessoa inicia o processo.. Um jeito de cancelar o processo atual para iniciar um novo!

 

Eu fiz um menu com 4 buttons, um UP e DOWN responsável por navegar pelos menus, e dois que estão sem uso ainda, para o processo de choca.

Menus: Mostrar data e hora (RTC), Temperatura (ds18b20), Umidade (DHT11) e "processo de choca" (não está pronto ainda), estão funcionando normalmente junto ao PID.

 

Porque depois do décimo quinto dia de incubação, o ovo começa a produzir seu próprio calor, e eu gostaria de ir diminuindo o SET point de temperatura gradualmente ao longo de cada dia depois desse período. Ou seja, tem que ter uma lógica com os dias!

 




// --- Bibliotecas Auxiliares ---
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Time.h>
#include <DS3232RTC.h>
#include <DHT.h>



// --- Definições e Objetos ---
#define butUp    12                                     //Botão para selecionar tela acima no digital 12
#define butDown  11                                     //Botão para selecionar tela abaixo no digital 11
#define butP     10                                     //Botão de ajuste mais no digital 10
#define butM      9                                     //Botão de ajuste menos no digital 9
#define DHTPIN A1 // pino que estamos conectado
#define DHTTYPE DHT11 // DHT 11
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);   //objeto para o OLED
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// ========================================================================================================
DHT dht(DHTPIN, DHTTYPE);

// --- Protótipo das Funções Auxiliares ---
void changeMenu();                                      //Função para modificar o menu atual
void dispMenu();                                        //Função para mostrar o menu atual
void data_hora();                                       //Função do menu1, data e hora
void temperatura();                                     //Função do menu2, temperatura
void lights();                                          //Função do menu3, acionamento de lampadas
void menu4();                                           //Função do menu4

// --- Variáveis Globais ---
int temp;
float hum;
char menu = 0x01;                                       //Variável para selecionar o menu
char set1 = 0x00, set2 = 0x00;                          //Controle das lâmpadas
boolean t_butUp, t_butDown, t_butP, t_butM;             //Flags para armazenar o estado dos botões
// ========================================================================================================

void setup ()
// --- Função setup ---
{
  Serial.begin(9600);   //serial em 9600 baud rate

  setSyncProvider(RTC.get); // the function to get the time from the RTC

  for(char i=9; i<13; i++) pinMode(i, INPUT_PULLUP);     //Entrada para os botões (digitais 9 a 12) com pull-ups internos
     t_butUp   = 0x00;                                      //limpa flag do botão Up
     t_butDown = 0x00;                                      //limpa flag do botão Down
     t_butP    = 0x00;                                      //limpa flag do botão P
     t_butM    = 0x00;                                      //limpa flag do botão M

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //Inicializa OLED com endereço I2C 0x3C (para 128x64)
  display.clearDisplay();
  display.display();

  }
// ========================================================================================================


// --- Função Loop ---
void loop ()
{
  temp = sensors.getTempCByIndex(0);
  hum =  dht.readHumidity();
    sensors.requestTemperatures();


   changeMenu();
   dispMenu();

   
}
// ========================================================================================================


// --- Desenvolvimento das Funções ---
void changeMenu()                                       //Modifica o menu atual
{
   if(!digitalRead(butUp))   t_butUp   = 0x01;          //Botão Up pressionado? Seta flag
   if(!digitalRead(butDown)) t_butDown = 0x01;          //Botão Down pressionado? Seta flag
      
   if(digitalRead(butUp) && t_butUp)                    //Botão Up solto e flag setada?
   {                                                    //Sim...
      t_butUp = 0x00;                                   //Limpa flag
      
  display.clearDisplay(); //limpa o display OLED                                   //Limpa display
      menu++;                                           //Incrementa menu
      
      if(menu > 0x04) menu = 0x01;                      //Se menu maior que 4, volta a ser 1
   
   } //end butUp
   
   if(digitalRead(butDown) && t_butDown)                //Botão Down solto e flag setada?
   {                                                    //Sim...
      t_butDown = 0x00;                                 //Limpa flag
      
  display.clearDisplay(); //limpa o display OLED                                   //Limpa display
      menu--;                                           //Decrementa menu
      
      if(menu < 0x01) menu = 0x04;                      //Se menu menor que 1, volta a ser 4
   
   } //end butDown   

} //end changeMenu

void dispMenu()                                         //Mostra o menu atual
{
    switch(menu)                                        //Controle da variável menu
    {
       case 0x01:                                       //Caso 1
    disp_data();                               //Chama a função de relógio
             
             break;                                     //break
       case 0x02:                                       //Caso 2
    disp_temp();                             //Chama a função do termômetro
             
             break;                                     //break
       case 0x03:                                       //Caso 3
     disp_umid(); ;                                  //Chama função para acionamento de lâmpadas
            
             break;                                     //break
       case 0x04:                                       //Caso 4
             choca();                                   //Chama função para o menu4
             
             break;                                     //break
    
    } //end switch menu

} //end dispMenu

  void disp_temp()
{
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("Temp.");
  display.setTextSize(2);
  display.setCursor(3, 12);
  display.setTextColor(WHITE);
  display.print(temp);
  display.print(" C");
  display.display();
  display.clearDisplay();

} //end disp_temp


void disp_umid()
{
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(40, 0);
  display.print("Umid.");
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(40, 12);
  display.print(hum);
  display.print(" %");
  display.display();
  display.clearDisplay();
} 

void disp_data()
{
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("Hora");
  display.setTextSize(1.75);
  display.setTextColor(WHITE);
  display.setCursor(3, 15);
    display.print(hour());
  display.print(":");
 display.print(minute());
 display.print(":");
 display.print(second());
   display.setTextSize(1.5);
  display.setTextColor(WHITE);
  display.setCursor(65, 0);
  display.print("Data");
   display.setTextSize(1.75);
  display.setTextColor(WHITE);
  display.setCursor(65, 15);
  display.print(day());
   display.print("-");
  display.print(month());
   display.print("-");
  display.print(year());
  display.display();
  display.clearDisplay();
} 

 void choca()
 {
 }

// ========================================================================================================

 

 

Dados 1.jpg

IMG_1346.JPG

IMG_1347.JPG

IMG_1344.JPG

IMG_1345.JPG

Link para o comentário
Compartilhar em outros sites

millis() conta o tempo desde a hora que você ligou o arduino. Faça um programaminha para exibir o millis para você ter ideia de como usa-lo, ma tenha ideia de que esse millis é limitado e ele vai para zero depois de alguns dias e volta para zero. Dá uma procurada que você acha sobre esse  "rolls over" do millis.

 

Como disse no outro tópico se você não se programar para esse problema você vai ter que comprar um módulo externo de tempo para poder contar mais tempo.

Link para o comentário
Compartilhar em outros sites

Ah vou largar mão desse processo de choca, tenho nem ideia de como vou fazer isso e vai me dar mt trabalho...

Vou deixar só os displays mesmo e talvez fazer uns modos de temperatura a partir de buttons, por exemplo.. Modo 1 set point com 37.5, modo 2 com set point para do dia 15-17 e modo 3 para temperatua pro final da eclosão..

 

Um problema que eu to tendo, é que com o arduino conectado ao computador via USB, quando eu carrego o código ele funciona normalmente..

Pelo ambiente de visualização o processing ele funciona normalmente quando eu inicio por ele.

 

Porém já com o código já carregado no arduino, quando eu conecto e desconecto o cabo usb a programação não funciona corretamente, nem o PID acontece nem o Display liga!

 

Alguem sabe porque isso pode ta acontecendo?

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...