Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Nome do Projeto: Chocadeira
- Nome do Aquivo: Choca_DHT11_Menu_V03.ino
- link: http://labdegaragem.com/forum/topics/ajuda-com-menu-chocadeira?xg_source=activity
- Dependencias: DHT.h Biblioteca de DHT11
- LiquidCrystal.h Biblioteca de LCD
- MCU: ATmega
- Board: Arduino Uno/Mega/Mini
- Compilador N/A
- IDE: Arduino IDE 1.0.6
- Hardware: Arduino UNO/MEGA/Mini
- Escrito por: Rui Viana
- Modificado por: Rui.Viana
- Data: 28/06/2015
- Uso: Didático
- Desenhos Chocadeira_DHT11.jpg
- Copyright @ N/A
- Este programa é software livre;
- e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
- mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
- REVISIONS: (latest entry first)
- 2015-06-28 - Choca_DHT11_V01.ino - First release
- 2015-07-08 - Choca_DHT11_Menu_V03.ino - Inclusão code de menu
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Descricão:
- Este código utilza a biblioteca DHT.h para ler sensores de humidade e de temperatura.
- E a biblioteca LiquidCrystal.h para mostrar a temperatura e a humidade no diplay LCD.
- Compara o valor da leitura com o valor programado, e define se liga ou desliga o rele
- que alimenta as resistencias de aquecimento.
- Tem dois botoes, um para aumentar e outro para diminuir a programação da temperatura
- Ele usa um sistema de menu em LCD,
- com 7 botões sendo 6 nas porta analogicas de A0 até A5 e um na digital 3
- O primeiro botão movimenta o menu para cima
- O segundo botão movimenta o menu para baixo
- O terceiro botão movimenta o sub menu para esquerda
- O quarto botão movimenta o sub menu para direita
- O Quinto botão incrementa o valor
- O sext botão decrementa o valor
- O sétimo botão chama uma função para executar qq código com os valores definidos nos botoes anteriores
- menu0 Sub_menu0 ajusta a temperatura saida rele liga resistencia
- menu0 Sub_menu1 ajusta a temperatura saida rele liga secador
- menu1 ajusta tempo de virar hh/mm/ss saida rele liga motor
- menu2 ajusta horas minutos hh/mm/ss
- menu3 ajusta dias ligado dd
- */
- //--------------------- Variaveis e constantes -----------------
- #include <LiquidCrystal.h> // Inclui a biblioteca do LCD
- #include "DHT.h" // Inclui a biblioteca do DHT11
- #define DHTPIN A0 // pino que estamos conectado
- #define DHTTYPE DHT11 // DHT 11
- DHT dht(DHTPIN, DHTTYPE);
- LiquidCrystal lcd( 7, 8, 9, 10, 11, 12); //Ordem dos pinos RS EN D4 D5 D6 D7
- // Pino LCD 4 6 11 12 13 14
- #define botao0 2 // Botão para Menu_Up
- #define botao1 3 // Botão para Menu_Down
- const int botao2 = A1; // Botão para Sub_Menu_left
- const int botao3 = A2; // Botão para Sub_Menu_right
- const int botao4 = A3; // Botão para Step_Up
- const int botao5 = A4; // Botão para Step_Down
- const int botao6 = A5; // Botão exec
- byte bt0; // Variavel para condição de botão 0
- byte fbt0; // Guarda status do botão 0
- byte bt1 = 1; // Variavel para condição de botão 1
- byte fbt1 = 1; // Guarda status do botão 1
- byte bt2 = 1; // Variavel para condição de botão 2
- byte fbt2 = 1; // Guarda status do botão 2
- byte bt3 = 1; // Variavel para condição de botão 3
- byte fbt3 = 1; // Guarda status do botão 3
- byte bt4 = 1; // Variavel para condição de botão 4
- byte fbt4 = 1; // Guarda status do botão 4
- byte bt5 = 1; // Variavel para condição de botão 5
- byte fbt5 = 1; // Guarda status do botão 5
- byte bt6 = 1; // Variavel para condição de botão 6
- byte fbt6 = 1; // Guarda status do botão 6
- int tot;
- int Nivel = 0; // Variavel para nivel de menu inicie em 0
- int Index_Nivel = 0; // Variavel para status de nivel de menu
- int Sub_Nivel = 0; // Variavel para sub_nivel de menu inicie em 0
- byte Pos = 1; // Variavel para posição de valor posicione em 1
- byte Step_M[4][4]; // Matriz para valores
- String MeuMenu; // Variavel para titulo do Menu
- const int ReleR = 13; // Pino de Saída liga resitencia
- const int ReleH = 6; // Pino de Saída liga secador
- const int Giro = 5; // Pino de Saída liga girador
- float TempProg = 27; // Variavel com temperatura programada
- float HumidProg = 80; // Variavel com humidade programada
- float celsius; // Varialvel para guardar valor de temperatura
- byte humidade; // Varialvel para guardar valor de humidade
- char cnt = 0;
- char cnt2 = 0;
- //--------------------- Setup -----------------
- void setup()
- {
- Serial.begin(9600);
- lcd.begin(16, 2); // Inicia o LCD com dimensões 16x2(Colunas x Linhas)
- pinMode(ReleR, OUTPUT); // Port como saída
- pinMode(ReleH, OUTPUT); // Port como saída
- pinMode(Giro, OUTPUT); // Port como saída
- digitalWrite(ReleR, LOW); // Desliga Rele resistencia
- digitalWrite(ReleH, LOW); // Desliga Rele secador
- digitalWrite(Giro, LOW); // Desliga Rele girador
- dht.begin(); // inicializa o Sensor
- delay(1000); // Aguarda 1 seg antes de acessar as informações do sensor
- lcd.clear(); // Limpa do buffer do LCD
- lcd.setCursor(0, 0); // Seleciona posição 0 da linha 0
- lcd.print("Chocadeira"); // Imprime texto
- lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
- lcd.print(TempProg); // Imprime variavel
- pinMode(botao0, INPUT_PULLUP); // Meunu UP
- pinMode(botao1, INPUT_PULLUP); // Meunu DOWN
- pinMode(botao2, INPUT_PULLUP); // Sub_Meunu Left
- pinMode(botao3, INPUT_PULLUP); // Sub_Meunu Right
- pinMode(botao4, INPUT_PULLUP); // Value Up
- pinMode(botao5, INPUT_PULLUP); // Value Down
- pinMode(botao6, INPUT_PULLUP); // Confirme
- }
- //--------------------- Display Menu -----------------
- void DSP_Menu() // Função para inicialização das variaveis no LCD
- {
- lcd.clear(); // Limpa tel LCD
- lcd.blink(); // Opção de blinking para cursor
- lcd.setCursor(0, 0); // Posiciona o cursor para inicio do titulo
- lcd.print(MeuMenu); // Mostra titulo
- lcd.setCursor(0, 1); // Posiciona cursor para zerar tela de contadores
- lcd.print(" 0 0 0 0"); // Zera tela de contadores
- }
- //--------------------- Display Index -----------------
- void Dsp_Index() // Função para display das variaveis no LCD
- {
- lcd.setCursor(0, 0); // Posiciona o cursor para inicio do titulo
- lcd.print(MeuMenu); // Mostra titulo
- byte j = 1; // Variavel para poição dos valores na linha 1
- for (byte i = 0; i <=3; i++) // Mostra 4 contadores
- {
- lcd.setCursor(j, 1); // Posiciona na linha 1
- lcd.print(" "); // Limpa valor antigo 2 digitos
- lcd.setCursor(j, 1); // Reposiciona na linha 1
- lcd.print(Step_M[Index_Nivel][i]); // Mostra valor atual
- j = j + 4; // Incrementa posição no LCD
- }
- lcd.setCursor(Pos, 1); // Reposiciona na linha 1 e sub_menu
- }
- //--------------------- Main_Menu -----------------
- void Main_Menu()
- {
- while(cnt==1)
- {
- DSP_Menu();
- //--------------------- Menu Up -----------------
- bt0 = digitalRead(botao0); // Le botão em A0
- if ((bt0 == LOW) && (fbt0 == HIGH)) // Se botão apertado e flag ligado
- { // Faça
- delay(30); // 30 ms de de-bouncing
- Nivel =Index_Nivel +1; // Incrementa nivel do Menu
- Index_Nivel = Nivel; // Salva valor de Menu em Indexador
- Sub_Nivel = 0; // Posiciona em sub menu 0
- for (byte i = 0; i <=3; i++) // Faça 4 vezes
- Step_M[Index_Nivel][i] = 0; // Zera contadores
- if (Nivel > 3) // Se nivel de menu maior que 3
- { // Faça
- Nivel = 0; // Set nivel de menu para 0
- Index_Nivel = 0; // Zera indexador
- }
- }
- fbt0 = bt0; // Faça flag = botão evita debouncing
- //--------------------- Menu Down -----------------
- bt1 = digitalRead(botao1); // Le botão em A1
- if ((bt1 == LOW) && (fbt1 == HIGH)) // Se botão apertado e flag ligado
- { // Faça
- delay(30); // 30 ms de de-bouncing
- Nivel = Index_Nivel -1; // Decrementa nivel do Menu
- Index_Nivel = Nivel; // Salva valor de Menu em Indexador
- Sub_Nivel = 0; // Posiciona em sub menu 0
- for (byte i = 0; i <=3; i++) // Faça 4 vezes
- Step_M[Index_Nivel][i] = 0; // Zera contadores
- if (Nivel < 0) // Se nivel de menu menor que 0
- { // Faça
- Nivel = 3; // Set nivel de menu para 3
- Index_Nivel = 3; // Set Indexador para 3
- }
- }
- fbt1 = bt1; // Faça flag = botão evita debouncing
- //--------------------- Sub_Menu Right -----------------
- bt2 = digitalRead(botao2); // Le botão em A2
- if ((bt2 == LOW) && (fbt2 == HIGH)) // Se botão apertado e flag ligado
- { // Faça
- delay(30); // 30 ms de de-bouncing
- Sub_Nivel = Sub_Nivel +1; // Incrementa nivel do Sub Menu
- Dsp_Index(); // Mostra valores no LCD
- if (Sub_Nivel > 3) // Se contagem maior que 3
- { // Faça
- Sub_Nivel = 0; // Vai par o nivel 0
- }
- }
- fbt2 = bt2; // Faça flag = botão evita debouncing
- //--------------------- Sub_Menu left -----------------
- bt3 = digitalRead(botao3); // Le botão em A3
- if ((bt3 == LOW) && (fbt3 == HIGH)) // Se botão apertado e flag ligado
- { // Faça
- delay(30); // 30 ms de de-bouncing
- Sub_Nivel = Sub_Nivel - 1; // Decrementa nivel do Sub Menu
- Dsp_Index(); // Mostra valores no LCD
- if (Sub_Nivel < 0) // Se contagem menor que 0
- { // Faça
- Sub_Nivel = 3; // Vai par o nivel 3
- }
- }
- fbt3 = bt3; // Faça flag = botão evita debouncing
- //--------------------- Step_Up -----------------
- bt4 = digitalRead(botao4); // Le botão em A4
- if ((bt4 == LOW) && (fbt4 == HIGH)) // Se botão apertado e flag ligado
- { // Faça
- delay(30); // 30 ms de de-bouncing
- Step_M[Index_Nivel][Sub_Nivel] = Step_M[Index_Nivel][Sub_Nivel] +1; // Desloca esquerda Item
- if (Step_M[Index_Nivel][Sub_Nivel] > 99) // Se contagem maior que 99
- { // Faça
- Step_M[Index_Nivel][Sub_Nivel]= 0; // Zera contagem
- }
- Dsp_Index(); // Mostra valores no LCD
- }
- fbt4 = bt4; // Faça flag = botão evita debouncing
- //--------------------- Step_Down -----------------
- bt5 = digitalRead(botao5); // Le botão em A5
- if ((bt5 == LOW) && (fbt5 == HIGH)) // Se botão apertado e flag ligado
- { // Faça
- delay(30); // 30 ms de de-bouncing
- Step_M[Index_Nivel][Sub_Nivel] = Step_M[Index_Nivel][Sub_Nivel] -1; // Desloca direita Item
- if (Step_M[Index_Nivel][Sub_Nivel] > 99) // Se contagem maior que 99
- { // Faça
- Step_M[Index_Nivel][Sub_Nivel] = 99; // Set 99
- }
- Dsp_Index(); // Mostra valores no LCD
- }
- fbt5 = bt5; // Faça flag = botão evita debouncing
- //--------------------- Enter -----------------
- bt6 = digitalRead(botao6); // Le botão em D3
- if ((bt6 == LOW) && (fbt6 == HIGH)) // Se botão apertado e flag ligado
- { // Faça
- delay(30); // 30 ms de de-bouncing
- for (unsigned int t = 0; t <4; t++)
- {
- for (unsigned int u = 0; u <4; u++)
- Serial.println(Step_M[t][u]);
- }
- Screen();
- cnt = 0;
- }
- fbt6 = bt6; // Faça flag = botão evita debouncing
- delay(100); // Retardo de 100ms
- //--------------------- switch -----------------
- switch (Nivel) // Controle do nivel do Menu
- {
- case 0: // Se Nivel for 0
- MeuMenu = "TEMP UMD "; // Variavel de display
- Nivel = 10; // Defina nivel 10 para não reexecutar case 0
- Dsp_Index(); // Mostra valores no LCD
- break; // Sai do Switch
- case 1: // Se Nivel for 1
- MeuMenu = " HH MM SS Girar"; // Variavel de display
- Nivel = 10; // Defina nivel 10 para não reexecutar case 1
- Dsp_Index(); // Mostra valores no LCD
- break; // Sai do Switch
- case 2: // Se Nivel for 2
- MeuMenu = " HH MM SS Set"; // Variavel de display
- Nivel = 10; // Defina nivel 10 para não reexecutar case 2
- Dsp_Index(); // Mostra valores no LCD
- break; // Sai do Switch
- case 3: // Se Nivel for 3
- MeuMenu = " DD Tempo ligado"; // Variavel de display
- Nivel = 10; // Defina nivel 10 para não reexecutar case 3
- Dsp_Index(); // Mostra valores no LCD
- break; // Sai do Switch
- default: // Para qq outro valor
- break; // Sai do Switch
- }
- switch (Sub_Nivel) // Controle do nivel do Sub_Menu
- {
- case 0: // Se sub_Nivel for 0
- Pos = 1; // Posiciona cursor em 1
- Dsp_Index(); // Mostra valores no LCD
- break; // Sai do Switch
- case 1: // Se sub_Nivel for 0
- Pos = 5; // Posiciona cursor em 5
- Dsp_Index(); // Mostra valores no LCD
- break; // Sai do Switch
- case 2: // Se sub_Nivel for 0
- Pos = 9; // Posiciona cursor em 9
- Dsp_Index(); // Mostra valores no LCD
- break; // Sai do Switch
- case 3: // Se sub_Nivel for 0
- Pos = 13; // Posiciona cursor em 13
- Dsp_Index(); // Mostra valores no LCD
- break; // Sai do Switch
- }
- delay(2000);
- }
- }
- //--------------------- Rotina PressUp -----------------
- void PressUp() // Rotina chamada pela interrupcao do botão de Menu_up
- {
- if (cnt2 ==1)
- {
- cnt = 1;
- detachInterrupt(0);
- Main_Menu();
- }
- cnt2++;
- if (cnt2 >1)
- cnt2 = 0;
- }
- //--------------------- Screen -----------------
- void Screen()
- {
- celsius = dht.readTemperature(); // Le temperatura no DHT11
- humidade = dht.readHumidity(); // Le humidade no DHT11
- lcd.clear(); // Limpa do buffer do LCD
- lcd.setCursor(0, 0); // Seleciona posição 0 da linha 0
- lcd.print("Chocadeira"); // Imprime texto
- lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
- TempProg = Step_M[0][0]; // Valor da temperatura programda extraida de menu
- lcd.print(TempProg); // Imprime variavel
- lcd.setCursor(11, 0); // Seleciona posição 0 da linha 0
- lcd.print("H "); // Imprime texto
- lcd.print(humidade); // Imprime humidade
- if (celsius >= TempProg) // Faça se a temperatura for maior que a programada
- digitalWrite(ReleR, LOW); // Desliga Rele
- else // Ou se não for
- digitalWrite(ReleR, HIGH); // Liga Rele
- HumidProg = Step_M[0][1]; // Valor da umidade programda extraida de menu
- if (humidade >= HumidProg) // Faça se a humidade for maior que a programada
- digitalWrite(ReleH, HIGH); // Liga Rele
- else // Ou se não for
- digitalWrite(ReleH, LOW); // Desliga Rele
- lcd.setCursor(0, 1); // Seleciona posição 0 da linha 0
- lcd.print(celsius); // Imprime a gemperatura
- lcd.setCursor(6, 1); // Seleciona posição 6 da linha 0
- if (digitalRead(ReleR) == 1) // Faça se o rele tiver operado
- lcd.print("Lig "); // Imprime texto
- else // Ou se não tiver
- lcd.print("Desl"); // Imprime texto
- lcd.noBlink();
- attachInterrupt(0, PressUp, FALLING); // Interrupt de botão ao ficar LOW o pino 2
- // Coloque aqui a rotina de tempo de giro, de horario e de dias
- }
- //--------------------- Loop -----------------
- void loop() // Função para executar code
- {
- Screen();
- delay(1000);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement