#include <avr/io.h>
#include <util/delay.h>
//#include "dht22.h"
// Definições do LCD
#define LCD_DADOS PORTA // Porta A para dados
#define LCD_CONTROLE PORTH // Porta H para controle
#define RS PH5 // Pino 8 do Arduino Mega
#define E PH3 // Pino 6 do Arduino Mega
#define D4 PA4 // Pino 26 do Arduino Mega
#define D5 PA5 // Pino 27 do Arduino Mega
#define D6 PA6 // Pino 28 do Arduino Mega
#define D7 PA7 // Pino 29 do Arduino Mega
// Definições do Sensor DHT22
#define DHT22_PIN PH6 // Pino 9 do Arduino Mega
// Protótipos de função
void init_LCD();
void LCD_command(unsigned char command);
void LCD_dados(unsigned char data);
void LCD_string(char *str);
void LCD_clear();
void read_DHT22(uint8_t *temp_int, uint8_t *temp_dec);
// Definindo os textos que serão exibidos no led
char txt1[] = "Temperatura";
char txt2[] = "Min:"
char txt3[] = "Max:"
char txt4[] = "Media:"
void show_SCREEN_HOME()
{
send_command_to_LCD(0X01, 0); // clear display
send_command_to_LCD(0X80, 0);
show_temperature_on_LCD();
}
void show_temperature_on_LCD()
{
float aux_temp = sensor_temperature;
char unit[2]; unit[0] = 'C'; unit[1] = '\0';
if(TEMP_UNIT_OPTION == TEMP_FAHRENHEIT){
aux_temp = (sensor_temperature * (9.0/5.0)) + 32;
unit[0] = 'F';
}else if (TEMP_UNIT_OPTION == TEMP_KELVIN){
aux_temp = sensor_temperature + 273.15;
unit[0] = 'K';
}
char str_temperature[20];
dtostrf(aux_temp, 6, 2, str_temperature);
writes_on_LCD("Temp: ");
writes_on_LCD(str_temperature);
writes_on_LCD(unit);
}
void check_sensor_informations()
{
// Se temperatura do sensor for menor que 34 ou maior que 45
if ( (sensor_temperature < MIN_TEMP || sensor_temperature > MAX_TEMP)
&& (CURRENT_SCREEN == SCREEN_HOME || CURRENT_SCREEN == SCREEN_WARN_LIMIT) )
{
// LED acende (como fazer isso?)
CURRENT_SCREEN = SCREEN_WARN_LIMIT;
update_screen();
}
else if (CURRENT_SCREEN == SCREEN_WARN_LIMIT)
{
CURRENT_SCREEN = SCREEN_HOME;
update_screen();
}
}
void show_SCREEN_WARN_LIMIT()
{
float aux_temp = sensor_temperature;
char unit[2]; unit[0] = 'C'; unit[1] = '\0';
if(TEMP_UNIT_OPTION == TEMP_FAHRENHEIT){
aux_temp = (sensor_temperature * (9.0/5.0)) + 32;
unit[0] = 'F';
}else if (TEMP_UNIT_OPTION == TEMP_KELVIN){
aux_temp = sensor_temperature + 273.15;
unit[0] = 'K';
}
char str_temperature[20];
dtostrf(aux_temp, 4, 1, str_temperature);
char str_humidity[20];
dtostrf(sensor_humidity, 3, 1, str_humidity);
send_command_to_LCD(0X01, 0);
send_command_to_LCD(0X80, 0);
writes_on_LCD(" LIMIT EXCEEDED");
send_command_to_LCD(0XC0, 0);
writes_on_LCD("T:");
writes_on_LCD(str_temperature);
writes_on_LCD(unit);
writes_on_LCD(" H: ");
writes_on_LCD(str_humidity);
writes_on_LCD("%");
_delay_ms(1000);
turn_on_red_led();
}
void update_screen()
{
switch(CURRENT_SCREEN){
case SCREEN_HOME:
show_SCREEN_HOME();
break;
case SCREEN_SETUP:
show_SCREEN_SETUP();
break;
case SCREEN_TUNIT:
show_SCREEN_TUNIT();
break;
case SCREEN_TEMP:
show_SCREEN_TEMP();
break;
case SCREEN_MIN_TEMP:
show_SCREEN_MIN_TEMP();
break;
case SCREEN_MAX_TEMP:
show_SCREEN_MAX_TEMP();
break;
case SCREEN_HUM:
show_SCREEN_HUM();
break;
case SCREEN_MIN_HUM:
show_SCREEN_MIN_HUM();
break;
case SCREEN_MAX_HUM:
show_SCREEN_MAX_HUM();
break;
case SCREEN_SAMPPLING:
show_SCREEN_SAMPPLING();
break;
case SCREEN_WARN_SMOKE:
show_SCREEN_WARN_SMOKE();
break;
case SCREEN_WARN_LIMIT:
show_SCREEN_WARN_LIMIT();
break;
default:
show_error();
break;
}
}
// char i; // variável para loop
// int main(void)
// {
// // Função que inicializa o LCD
// Lcd_Init();
// // Função que limpa o LCD
// Lcd_Cmd(_LCD_CLEAR);
// // Função para desligar o cursor
// Lcd_Cmd(_LCD_CURSOR_OFF);
// Lcd_Out(1,6,txt1);
// }
// // função usada para mover
// void Move_Delay() {
// _delay_ms(500);
// }