// ETECAF
// SISTEMAS EMBARCADOS 2
// SEM2 - 3 BIMESTRE - 2024
// TRABALHO LCD+I2C+DHT+POT+RGB+LED+MILLIS+MEDIA
// SALVAR ESTE ARQUIVO ASSIM:
// LCD+I2C+DHT+POT+RGB+LED+MILLIS+MEDIA_(INICIAIS DOS NOMES)
// EXEMPLO - SE FOSSE O MEU
// LCD+I2C+DHT+POT+RGB+LED+MILLIS+MEDIA_CBSF
//****** ESCREVA SEU NOME COMPLETO ABAIXO ********
// Breno Correia Lociks
//************************************************
// CADA PARTE DO CÓDIGO DEVE SER EXPLICADA.
// EM ESPECIAL:
// ==> COMO FOI FEITA A MÉDIA DE CADA UMA DAS MEDIÇÕES
// TEMPERATURA;
// UMIDADE;
// POSIÇÃO DO POTENCIÔMETRO
// ==> EXPLIQUE TAMBÉM O USO DO MILLIS
// VARIÁVEIS GLOBAIS
// NAO ESQUEÇA DE EXPLICAR CADA UMA
// BIBLIOTECAS
#include <LiquidCrystal_I2C.h> // Inclui a biblioteca para controle do LCD I2C
#include <dht.h> // Inclui a biblioteca para controle do sensor DHT
// DEFINIÇÕES
#define dataPin 8 // Define o pino digital 8 para o sensor DHT
#define Red 2 // Define o pino digital 2 para o LED vermelho do RGB
#define Green 3 // Define o pino digital 3 para o LED verde do RGB
#define Blue 4 // Define o pino digital 4 para o LED azul do RGB
#define led_var 5 // Define o pino digital 5 para o LED que indica variação de temperatura
#define led_tmp 6 // Define o pino digital 6 para o LED que indica alta temperatura
#define led_umd 7 // Define o pino digital 7 para o LED que indica alta umidade
// VARIÁVEIS DE MILLISEGUNDOS DO RGB E DO LCD I2C
unsigned long millisAnteriorRGB = 0; // Cria a variável "millisAnteriorRGB" para armazenar o último tempo de atualização do RGB em millisegundos
unsigned long millisAnteriorLCD = 0; // Cria a variável "millisAnteriorLCD" para armazenar o último tempo de atualização do LCD em millisegundos
// VARIÁVEIS DE SOMA E MÉDIA
float somaTmp = 0; // Cria a variável "somaTmp" para armazenar a soma das leituras de temperatura
float somaUmd = 0; // Cria a variável "somaUmd" para armazenar a soma das leituras de umidade
float somaPot = 0; // Cria a variável "somaPot" para armazenar a soma das leituras do potenciômetro
float mediaTmp = 0; // Cria a variável "mediaTmp" para armazenar a média das leituras de temperatura
float mediaUmd = 0; // Cria a variável "mediaUmd" para armazenar a média das leituras de umidade
float mediaPot = 0; // Cria a variável "mediaPot" para armazenar a média das leituras do potenciômetro
// VARIÁVEIS DO CONTADOR E DA TELA ATUAL
int contador = 0; // Cria a variável "contador" para armazenar a contagem
int telaAtual = 0; // Cria a variável "telaAtual" para armazenar qual é a tela atual no LCD I2C
// CRIAÇÃO DOS OBJETOS PARA O LCD I2C E PARA O SENSOR DHT
LiquidCrystal_I2C lcd(0x27, 16, 2); // Cria o objeto "lcd" para o LCD I2C com endereço 0x27 e display de 16x2 caracteres
dht DHT; // Cria o objeto "DHT" para o sensor DHT
void setup() {
// CONFIGURAÇÕES
// NÃO ESQUEÇA DE EXPLICAR CADA UMA
// CONFIGURAÇÃO DOS PINOS
pinMode(Red, OUTPUT); // Configura o pino do LED vermelho do RGB como saída
pinMode(Green, OUTPUT); // Configura o pino do LED verde do RGB como saída
pinMode(Blue, OUTPUT); // Configura o pino do LED azul do RGB como saída
pinMode(led_var, OUTPUT); // Configura o pino do LED de variação de temperatura como saída
pinMode(led_tmp, OUTPUT); // Configura o pino do LED de alta temperatura como saída
pinMode(led_umd, OUTPUT); // Configura o pino do LED de alta umidade como saída
// CONFIGURAÇÕES DE INICIALIZAÇÃO DO LCD
lcd.init(); // Inicializa o LCD I2C
lcd.setBacklight(HIGH); // Liga a luz de fundo do LCD I2C
}
void loop() {
// PROGRAMA PRINCIPAL
// NÃO ESQUEÇA DE EXPLICAR CADA PARTE
// TEMPO ATUAL EM MILLISEGUNDOS
unsigned long millisAtual = millis(); // Cria a variável "millisAtual" para armazenar o tempo atual em millisegundos desde o início do programa
// LEITURA DOS LEDS DO RGB
int RedLeitura = digitalRead(Red); // Cria a variável "RedLeitura" para armazenar a leitura do estado do LED vermelho do RGB
int GreenLeitura = digitalRead(Green); // Cria a variável "GreenLeitura" para armazenar a leitura do estado do LED verde do RGB
int BlueLeitura = digitalRead(Blue); // Cria a variável "BlueLeitura" para armazenar a leitura do estado do LED azul do RGB
// LEITURA DO POTENCIÔMETRO e MAPEAMENTO DO ÂNGULO
int pot = analogRead(A3); // Cria a variável "pot" para armazenar o valor lido no potenciômetro ligado no pino analógico A3
int angPot = map(pot, 0, 1023, 0, 270); // Cria a variável "angPot" para armazenar o mapeamento da leitura do potenciômetro para um intervalo de 0 a 270 graus de ângulo
// LEITURA DO SENSOR DHT
int readData = DHT.read22(dataPin); // Cria a variável "readData" para armazenar os dados lidos pelo sensor DHT
float t = DHT.temperature; // Cria a variável "t" para armazenar a temperatura lida pelo sensor DHT
float h = DHT.humidity; // Cria a variável "h" para armazenar a umidade lida pelo sensor DHT
// MAPEAMENTO DO BRILHO DO LED
int t_led = map(t, 10, 20, 0, 255); // Cria a variável "t_led" para armazenar o mapeamento da temperatura para um intervalo de brilho do LED
// FUNCIONAMENTO DAS SOMAS E DO CONTADOR
somaTmp += t; // Adiciona na variável "somaTmp" o valor da temperatura atual à soma total
somaUmd += h; // Adiciona na variável "somaUmd" o valor da umidade atual à soma total
somaPot += pot; // Adiciona na variável "somaPot" o valor da leitura do potenciômetro atual à soma total
contador++; // Adiciona na variável "contador" o incremento do contador
// CONTROLE DO CONTADOR
if (contador >= 100) { // Verifica se o valor do contador é maior ou igual a 100
mediaTmp = somaTmp / 100.0; // Calcula a média de temperatura dividindo a soma das leituras por 100 e adiciona o resultado na variável "mediaTmp"
mediaUmd = somaUmd / 100.0; // Calcula a média de umidade dividindo a soma das leituras por 100 e adiciona o resultado na variável "mediaUmd"
mediaPot = somaPot / 100.0; // Calcula a média de leitura do potenciômetro dividindo a soma das leituras por 100 e adiciona o resultado na variável "mediaPot"
somaTmp = 0; // Reseta a soma da temperatura
somaUmd = 0; // Reseta a soma da umidade
somaPot = 0; // Reseta a soma da leitura do potenciômetro
contador = 0; // Reseta o contador
}
// MAPEAMENTO DA MÉDIA PARA O ÂNGULO
int angMed = map(mediaPot, 0, 1023, 0, 270); // Cria a variável "angMed" para armazenar o mapeamento da média de leitura do potenciômetro para um intervalo de 0 a 270 graus de ângulo
// CONTROLE DO RGB
if (angPot >= 90) { // Verifica se o ângulo do potenciômetro é maior ou igual 90 graus
if ((millisAtual - millisAnteriorRGB) > 1000) { // Verifica se passaram 1000 millisegundos desde a última mudança de cor do RGB
millisAnteriorRGB = millisAtual; // Atualiza o temporizador do RGB para o tempo atual em millisegundos
if (RedLeitura == LOW && GreenLeitura == LOW && BlueLeitura == LOW) { // Verifica se os três LEDs do RGB estão apagados
digitalWrite(Red, HIGH); // Acende o LED vermelho do RGB
}
if (RedLeitura == HIGH) { // Verifica se o LED vermelho do RGB está aceso
digitalWrite(Red, LOW); // Apaga o LED vermelho do RGB
digitalWrite(Green, HIGH); // Acende o LED verde do RGB
}
if (GreenLeitura == HIGH) { // Verifica se o LED verde do RGB está aceso
digitalWrite(Green, LOW); // Apaga o LED verde do RGB
digitalWrite(Blue, HIGH); // Acende o LED azul do RGB
}
if (BlueLeitura == HIGH) { // Verifica se o LED azul do RGB está aceso
digitalWrite(Blue, LOW); // Apaga o LED azul do RGB
}
}
}
else { // Caso contrário
digitalWrite(Red, LOW); // O LED vermelho do RGB apaga
digitalWrite(Green, LOW); // O LED verde do RGB apaga
digitalWrite(Blue, LOW); // O LED azul do RGB apaga
}
// CONTROLE DOS LEDS
if (mediaTmp >= 10 && mediaTmp <= 20) { // Verifica se a média de temperatura está entre 10 e 20 graus Celsius
analogWrite(led_var, t_led); // Define a intensidade do brilho do LED de variação de temperatura
}
if (mediaTmp > 20) { // Verifica se a média de temperatura é maior que 20 graus Celsius
digitalWrite(led_var, HIGH); // Acende o LED de variação de temperatura
}
if (mediaTmp < 10) { // Verifica se a média de temperatura é menor que 10 graus Celsius
digitalWrite(led_var, LOW); // Apaga o LED de variação de temperatura
}
if (mediaTmp >= 40) { // Verifica se a média de temperatura é maior ou igual a 40 graus Celsius
digitalWrite(led_tmp, HIGH); // Acende o LED de alta temperatura
}
else { // Caso contrário
digitalWrite(led_tmp, LOW); // Apaga o LED de alta temperatura
}
if (mediaUmd >= 75) { // Verifica se a média de umidade é maior ou igual a 75%
digitalWrite(led_umd, HIGH); // Acende o LED de alta umidade
}
else { // Caso contrário
digitalWrite(led_umd, LOW); // Apaga o LED de alta umidade
}
// CONTROLE DO LCD I2C
if ((millisAtual - millisAnteriorLCD) > 1000) { // Verifica se passaram 1000 millisegundos desde a última atualização de tela do LCD
millisAnteriorLCD = millisAtual; // Atualiza o temporizador do LCD para o tempo atual em millisegundos
if (telaAtual == 0) { // Verifica se é a primeira tela do LCD
lcd.clear(); // Limpa o display
lcd.setCursor(0, 0); // Define o cursor na primeira coluna e na primeira linha
lcd.print("Tmp. = "); // Exibe o texto da temperatura
lcd.print(mediaTmp); // Exibe o valor da média de temperatura
lcd.print(" "); // Espaço
lcd.print((char)223); // Exibe o símbolo de grau
lcd.print("C"); // Exibe o símbolo de celsius
lcd.setCursor(0, 1); // Define o cursor na primeira coluna e na segunda linha
lcd.print("Umd. = "); // Exibe o texto da umidade
lcd.print(mediaUmd); // Exibe o valor da média de umidade
lcd.print((char)37); // Exibe o símbolo de porcentagem
telaAtual = 1; // Muda para a próxima tela
}
else if (telaAtual == 1) { // Caso contrário, verifica se é a segunda tela do LCD
lcd.clear(); // Limpa o display
lcd.setCursor(0, 0); // Define o cursor na primeira coluna e na primeira linha
lcd.print("Ang. = "); // Exibe o texto do ângulo do potenciômetro
lcd.print(angMed); // Exibe o valor do ângulo do potenciômetro
lcd.print((char)223); // Exibe o símbolo de grau
telaAtual = 0; // Muda para a tela anterior
}
}
}