Olá, estou realizando testes como forma de aprendizado com LCD KEYPAD SHIELD, RTC DS3231 e um sensor de temperatura DS18B20, adaptei um programa do RTC para aparecer os dados do mesmo no Dislplay e funcionou bem (programa abaixo), depois copiei um programa para realizar as leituras do sensor DS18B20 e consegui obter as leituras, ótimo até ai tudo bem, então pensei em achar um programa de menu para usar o KeyPad Shield, consegui achar um bem bacana e o traduzi pro português,  (conforme abaixo), e o mesmo esta funcionando bem, navego nas opções e quando pressiono o botão select ele chama a opção selecionada, até ai tudo bem, o que eu gostaria era saber como eu faço para por neste menu as opções para fazer aparecer no LCD os dados de de data e hora quando por exemplo selecionar a opção 1 do menu, e depois aparecer a temperatura do DS18B20 quando seleciono a opção 2. Talvez esta seja uma solução muito básica, porém pra mim que sou muito leigo no assunto parece um dragão de sete cabeças kkkk. Agradeço antecipadamente pela atenção e ajuda.

//----------------------------------------------------------------------------------------------------------------------------------------------

//PROGRAMA PARA APARECER OS DADOS DO RTC NO DISPLAY

//obs ja tem alguns codigos do DS18B20 

#include <Wire.h>
#include "ds3231.h"
#include "rtc_ds3231.h"
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define BUFF_MAX 128
#define ONE_WIRE_BUS 2 //variavel do pino que esta plugado o Sensor

OneWire oneWire(ONE_WIRE_BUS); //Instacia o Objeto oneWire e Seta o pino do Sensor para iniciar as leituras
DallasTemperature sensor(&oneWire);//Repassa as referencias do oneWire para o Sensor Dallas (DS18B20)
uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev, interval = 1000;
char minuto = 0;
char hora = 0;


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{
//-------------------------------------------------------------------------------------
//INICIO BLOCO TESTE BOTOES DISPLAY
//lcd.begin(16, 2);
//lcd.setCursor(0,0);
//lcd.print("Arduino e Cia");
//lcd.setCursor(0,1);
//lcd.print("Tecla :");
//FIM BLOCO TESTE BOTOES DISLPLAY
//-------------------------------------------------------------------------------------

pinMode(7, OUTPUT); //PINO DO RELE
Serial.begin(9600);
Serial.println("Sensor de temperatura Dallas DS18b20");
sensor.begin();
Wire.begin();
DS3231_init(DS3231_INTCN);
memset(recv, 0, BUFF_MAX);
//Serial.println("GET time");
lcd.begin(16, 2);
lcd.clear();


// ***************************************
// * PARA AJUSTAR RELOGIO *
// * Serial.println("Setting time"); *
// * parse_cmd("T301218513112015",16); *
// ***************************************

}

void loop()
{

//SENSOR DE TEMPERATURA LIQUIDOS DS18B20
sensor.requestTemperatures(); //Envia o comando para obter temperaturas
float leitura=sensor.getTempCByIndex(0); // A temperatura em Celsius para o dispositivo 1 no índice 0 (é possivel ligar varios sensores usando a mesma porta do arduino)
Serial.println(leitura);

// INICIO FUNÇÃO DO RELOGIO

char in;
char tempF[6];
float temperature;
char buff[BUFF_MAX];
unsigned long now = millis();
struct ts t;

// show time once in a while
if ((now - prev > interval) && (Serial.available() <= 0)) {
DS3231_get(&t); //Get time
parse_cmd("C",1);
temperature = DS3231_get_treg(); //Get temperature
dtostrf(temperature, 5, 1, tempF);

lcd.clear();
lcd.setCursor(0,0);

lcd.print(t.mday);

printMonth(t.mon);

lcd.print(t.year);

lcd.setCursor(0,1); //Go to second line of the LCD Screen
lcd.print(t.hour);
lcd.print(":");
if(t.min<10)
{
lcd.print("0");
}
lcd.print(t.min);
lcd.print(":");
if(t.sec<10)
{
lcd.print("0");
}
lcd.print(t.sec);

lcd.print(' ');
lcd.print(tempF);
lcd.print((char)223);
lcd.print("C ");
prev = now;
}


if (Serial.available() > 0) {
in = Serial.read();

if ((in == 10 || in == 13) && (recv_size > 0)) {
parse_cmd(recv, recv_size);
recv_size = 0;
recv[0] = 0;
} else if (in < 48 || in > 122) {; // ignore ~[0-9A-Za-z]
} else if (recv_size > BUFF_MAX - 2) { // drop lines that are too long
// drop
recv_size = 0;
recv[0] = 0;
} else if (recv_size < BUFF_MAX - 2) {
recv[recv_size] = in;
recv[recv_size + 1] = 0;
recv_size += 1;
}

}

// SELEÇÃO DA CADA BOTÃO DO DISLPLAY
int botao;
botao = analogRead (0); //Leitura do valor da porta analógica A0
//Serial.println(botao);
lcd.setCursor(8,1);
if (botao < 100) {
lcd.print ("Direita ");
}
else if (botao < 200) {
lcd.print ("Cima ");
}
else if (botao < 400){
lcd.print ("Baixo ");
}
else if (botao < 600){
lcd.print ("Esquerda");
}
else if (botao < 800){
lcd.print ("Select ");
}
}
//FINAL DE SELEÇÃO DE BOTOES
//------------------------------------------------------------------------------

void parse_cmd(char *cmd, int cmdsize)
{
uint8_t i;
uint8_t reg_val;
char buff[BUFF_MAX];
struct ts t;


if (cmd[0] == 84 && cmdsize == 16) {
t.sec = inp2toi(cmd, 1);
t.min = inp2toi(cmd, 3);
t.hour = inp2toi(cmd, 5);
t.wday = inp2toi(cmd, 7);
t.mday = inp2toi(cmd, 8);
t.mon = inp2toi(cmd, 10);
t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
DS3231_set(t);
Serial.println("OK");
} else if (cmd[0] == 49 && cmdsize == 1) { // "1" get alarm 1
DS3231_get_a1(&buff[0], 59);
Serial.println(buff);
} else if (cmd[0] == 50 && cmdsize == 1) { // "2" get alarm 1
DS3231_get_a2(&buff[0], 59);
Serial.println(buff);
} else if (cmd[0] == 51 && cmdsize == 1) { // "3" get aging register
Serial.print("aging reg is ");
Serial.println(DS3231_get_aging(), DEC);
} else if (cmd[0] == 65 && cmdsize == 9) { // "A" set alarm 1
DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
//ASSMMHHDD
for (i = 0; i < 4; i++) {
time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
}
boolean flags[5] = { 0, 0, 0, 0, 0 };
DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
DS3231_get_a1(&buff[0], 59);
Serial.println(buff);
} else if (cmd[0] == 66 && cmdsize == 7) { // "B" Set Alarm 2
DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
//BMMHHDD
for (i = 0; i < 4; i++) {
time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
}
boolean flags[5] = { 0, 0, 0, 0 };
DS3231_set_a2(time[0], time[1], time[2], flags);
DS3231_get_a2(&buff[0], 59);
Serial.println(buff);
} else if (cmd[0] == 67 && cmdsize == 1) { // "C" - get temperature register
// Serial.print("temperature reg is ");
//Serial.println(DS3231_get_treg(), DEC);
} else if (cmd[0] == 68 && cmdsize == 1) { // "D" - reset status register alarm flags
reg_val = DS3231_get_sreg();
reg_val &= B11111100;
DS3231_set_sreg(reg_val);
} else if (cmd[0] == 70 && cmdsize == 1) { // "F" - custom fct
reg_val = DS3231_get_addr(0x5);
Serial.print("orig ");
Serial.print(reg_val,DEC);
Serial.print("month is ");
Serial.println(bcdtodec(reg_val & 0x1F),DEC);
} else if (cmd[0] == 71 && cmdsize == 1) { // "G" - set aging status register
DS3231_set_aging(0);
} else if (cmd[0] == 83 && cmdsize == 1) { // "S" - get status register
Serial.print("status reg is ");
Serial.println(DS3231_get_sreg(), DEC);
} else {
Serial.print("unknown command prefix ");
Serial.println(cmd[0]);
Serial.println(cmd[0], DEC);
}
}

void printMonth(int month)
{

switch(month)
{
case 1: lcd.print(" Janeiro ");break;
case 2: lcd.print(" Fevereiro ");break;
case 3: lcd.print(" Março ");break;
case 4: lcd.print(" Abril ");break;
case 5: lcd.print(" Maio ");break;
case 6: lcd.print(" Junho ");break;
case 7: lcd.print(" Julho ");break;
case 8: lcd.print(" Agosto ");break;
case 9: lcd.print(" Setembro ");break;
case 10: lcd.print(" Outubro ");break;
case 11: lcd.print(" Novembro ");break;
case 12: lcd.print(" Dezembro ");break;
default: lcd.print(" Error ");break;
}
}
//FINAL FUNÇÃO RELOGIO
//---------------------------------------------------------------------------

//PROGRAMA DE MENUS PARA LCD KEYPAD SHIELD

#include <LiquidCrystal.h>

// Pinos para LCD Shield Keypad - Não serve para lcd comum
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//Estados do menus
int atualMenuItem = 0;
int lastState = 0;

void setup() {
//Iniciando o LCD 16x2 do Display Keypad.
lcd.begin(16, 2);
//Mostar o Titulo do Menu.
clearPrintTitle();
}

void loop() {
//Chma o menu principal
mainMenu();
}

void mainMenu() {
//Estado = 0 cada ciclo de loop.
int state = 0;
//Atualiza o botão pressionado.
int x = analogRead (0);
//Define a linha e a coluna.
lcd.setCursor(0,0);

//Verifica os valores analogicos da porta A0 do LCD Keypad Shield
if (x < 100) {
//Direita
} else if (x < 200) {
//Cima
state = 1;
} else if (x < 400){
//Baixo
state = 2;
} else if (x < 600){
//Esquerda
} else if (x < 800){
//Selecionar
state = 3;
}

//Se os limites do MENU for ultrapassados o reiniciamos
if (atualMenuItem < 0 || atualMenuItem > 4) {
atualMenuItem = 0; 
}

//Se mudarmos o index o redesenhamos.
if (state != lastState) {
if (state == 1) {
//Se pra cima
atualMenuItem = atualMenuItem - 1; 
displayMenu(atualMenuItem);
} else if (state == 2) {
//Se pra baixo
atualMenuItem = atualMenuItem + 1; 
displayMenu(atualMenuItem);
} else if (state == 3) {
//Se selecionado
selectMenu(atualMenuItem); 
}
//Salva o estado anterior para compara-lo.
lastState = state;

//Pequeno delay
delay(5);
}

//Opções do menu.
void displayMenu(int x) {
switch (x) {
case 1:
clearPrintTitle();
lcd.print ("-> Menu Opcao 1");
break;
case 2:
clearPrintTitle();
lcd.print ("-> Menu Opcao 2");
break;
case 3:
clearPrintTitle();
lcd.print ("-> Menu Opcao 3");
break;
case 4:
clearPrintTitle();
lcd.print ("-> Menu Opcao 4");
break;
}
}

//Bloco para o cabeçalho do MENU.
void clearPrintTitle() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" MEU-MENU ");
lcd.setCursor(0,1); 
}

//Bloco que mostra a seleção na tela
void selectMenu(int x) {
switch (x) {
case 1:
clearPrintTitle();
lcd.print ("Op 1 Selecionada");
//Chama a função da Opção 1
break;
case 2:
clearPrintTitle();
lcd.print ("Op 2 Selecionada");
//Chama a função da Opção 2
break;
case 3:
clearPrintTitle();
lcd.print ("Op 3 Selecionada");
//Chama a função da Opção 3
break;
case 4:
clearPrintTitle();
lcd.print ("Op 4 Selecionada");
//CChama a função da Opção 4
break;
}
}

Exibições: 530

Responder esta

Respostas a este tópico

Vamos la gente, achei que era simples, ninguém tem nenhuma saída? Me ajudem com essa.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço