#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <dht.h>
int time = 1000;
int angulo = 0;
unsigned long tempoanterior = 0;
int passo = 0;
#define sensordht 2 // Define o número do pino onde o sensor está conectado
#define pot A0 // Pino do potenciômetro
#define ledBaixaTemperatura 11
#define ledAltaTemperatura 10
#define ledAltaUmidade 9
#define ledRed 5
#define ledGreen 6
#define ledBlue 3
dht sensorDHT; // Criando o objeto para o sensor DHT
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int LeiturasA = 10; // Número de leituras para calcular a média
float leiturasUmidade[LeiturasA];
float leiturasTemperatura[LeiturasA];
int leiturasAngulo[LeiturasA];
int indiceLeitura = 0; // Índice atual de leitura
bool leiturasCompletas = false; // Indica se já foi possível completar as leituras
void setup() {
lcd.init();
Serial.begin(9600); // Qualquer taxa de transmissão deve funcionar
pinMode(ledBaixaTemperatura, OUTPUT);
pinMode(ledAltaTemperatura, OUTPUT);
pinMode(ledAltaUmidade, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(ledBlue, OUTPUT);
}
void loop() {
int leituraSensor = sensorDHT.read22(sensordht); // DHT22/AM2302
float temperatura = sensorDHT.temperature; // Lendo o valor da temperatura
float umidade = sensorDHT.humidity; // Lendo o valor da umidade
// Controle do LED RGB baseado no ângulo
int valorPotenciometro = analogRead(A0);
angulo = map(valorPotenciometro, 0, 1023, 0, 270);
if (angulo < 90) {
analogWrite(ledRed, 0);
analogWrite(ledGreen, 255);
analogWrite(ledBlue, 255);
} else if (angulo < 180) {
analogWrite(ledRed, 255);
analogWrite(ledGreen, 0);
analogWrite(ledBlue, 255);
} else {
analogWrite(ledRed, 255);
analogWrite(ledGreen, 255);
analogWrite(ledBlue, 0);
}
// Controle do LED para baixa temperatura
if (temperatura < 10) {
analogWrite(ledBaixaTemperatura, 0); // LED apagado para temperaturas abaixo de 10°C
} else if (temperatura <= 20) {
int brilho = map(temperatura, 10, 20, 0, 255);
analogWrite(ledBaixaTemperatura, brilho);
} else if (temperatura < 40) {
analogWrite(ledBaixaTemperatura, 255); // LED totalmente aceso para temperaturas acima de 20°C
}
// Controle do LED para alta temperatura
if (temperatura > 40) {
digitalWrite(ledAltaTemperatura, HIGH);
} else {
digitalWrite(ledAltaTemperatura, LOW);
}
// Controle do LED para alta umidade
if (umidade > 75) {
digitalWrite(ledAltaUmidade, HIGH);
} else {
digitalWrite(ledAltaUmidade, LOW);
}
// Armazena as leituras para calcular a média
leiturasUmidade[indiceLeitura] = umidade;
leiturasTemperatura[indiceLeitura] = temperatura;
leiturasAngulo[indiceLeitura] = angulo;
indiceLeitura++;
if (indiceLeitura >= LeiturasA) {
indiceLeitura = 0;
leiturasCompletas = true; // Depois de preencher uma vez, setar como completo
}
// Calcula e exibe as médias após completar as leituras
if (leiturasCompletas) {
float mediaUmidade = calcularMedia(leiturasUmidade, LeiturasA);
float mediaTemperatura = calcularMedia(leiturasTemperatura, LeiturasA);
float mediaAngulo = calcularMedia(leiturasAngulo, LeiturasA);
Serial.print("Média da umidade: ");
Serial.println(mediaUmidade);
Serial.print("Média da temperatura: ");
Serial.println(mediaTemperatura);
Serial.print("Média do ângulo: ");
Serial.println(mediaAngulo);
}
// Exibição no LCD
if (millis() - tempoanterior > 1000) {
tempoanterior = millis();
lcd.clear(); // Limpa o display apenas ao iniciar uma nova exibição
lcd.setBacklight(HIGH);
if (passo == 0) {
lcd.setCursor(1, 0);
lcd.print("temp. = ");
lcd.print(temperatura);
lcd.print(" C");
lcd.setCursor(1, 1);
lcd.print("humid. = ");
lcd.print(umidade);
lcd.print("%");
passo = 1; // Muda para a próxima etapa
} else if (passo == 1) {
lcd.setCursor(1, 0);
lcd.print("angulo = ");
lcd.print(angulo);
passo = 0; // Volta para a etapa anterior
}
}
}
// Função para calcular a média de um array de valores
float calcularMedia(float valores[], int tamanho) {
float soma = 0;
for (int i = 0; i < tamanho; i++) {
soma += valores[i];
}
return soma / tamanho;
}
// Função para calcular a média de um array de inteiros
float calcularMedia(int valores[], int tamanho) {
int soma = 0;
for (int i = 0; i < tamanho; i++) {
soma += valores[i];
}
return (float)soma / tamanho;
}