// • SOBRE O PROJETO:
// O projeto presente utiliza um DHT22, um LDR, um sensor ultrassônico HC-SR04 e um LED
// para monitorar e reagir a variáveis ambientais.
// Ele faz leituras regulares da luminosidade,
// temperatura, umidade e distância.
// O código calcula como esses valores mudam com o tempo,
// mostrando a variação em cada um deles.
// Dependendo da média de luminosidade,
// o LED pisca de formas diferentes:
// se a média atual for maior do que a anterior,
// ele pisca uma vez; se for menor ou igual,
// ele pisca duas vezes. Todas essas informações,
// incluindo as variações e uma tabela com os dados
// e tempos, são enviadas para o monitor serial,
// permitindo que você acompanhe o que está acontecendo em tempo real.
// ---------------------------------------------
#include <DHT.h>
#define LDR_PIN 27
#define DHTPIN 33
#define DHTTYPE DHT22
#define TRIG_PIN 25
#define ECHO_PIN 26
#define LED_PIN 32
DHT dht(DHTPIN, DHTTYPE);
int valorLDR1 = 0, valorLDR2 = 0, valorLDR3 = 0;
float temp1 = 0, temp2 = 0, temp3 = 0;
float umid1 = 0, umid2 = 0, umid3 = 0;
float dist1 = 0, dist2 = 0, dist3 = 0;
unsigned long tempoLDR1 = 0, tempoLDR2 = 0, tempoLDR3 = 0;
unsigned long tempoTemp1 = 0, tempoTemp2 = 0, tempoTemp3 = 0;
unsigned long tempoUmid1 = 0, tempoUmid2 = 0, tempoUmid3 = 0;
unsigned long tempoDist1 = 0, tempoDist2 = 0, tempoDist3 = 0;
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LDR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
float HCSR04() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duracao = pulseIn(ECHO_PIN, HIGH);
return duracao * 0.034 / 2;
}
void loop() {
// Lê os sensores
int valorLDR = analogRead(LDR_PIN);
int luxMap = map(valorLDR, 0, 4095, 1000, 0);
valorLDR = luxMap;
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
float distancia = HCSR04();
// Atualiza os valores dos sensores
unsigned long tempoAtual = millis();
valorLDR3 = valorLDR2;
valorLDR2 = valorLDR1;
valorLDR1 = valorLDR;
tempoLDR3 = tempoLDR2;
tempoLDR2 = tempoLDR1;
tempoLDR1 = tempoAtual;
temp3 = temp2;
temp2 = temp1;
temp1 = temperatura;
tempoTemp3 = tempoTemp2;
tempoTemp2 = tempoTemp1;
tempoTemp1 = tempoAtual;
umid3 = umid2;
umid2 = umid1;
umid1 = umidade;
tempoUmid3 = tempoUmid2;
tempoUmid2 = tempoUmid1;
tempoUmid1 = tempoAtual;
dist3 = dist2;
dist2 = dist1;
dist1 = distancia;
tempoDist3 = tempoDist2;
tempoDist2 = tempoDist1;
tempoDist1 = tempoAtual;
// Calcula as derivadas
float intervalo = 2.0; // Delay em segundos
float derivadaLDR = (valorLDR3 - valorLDR1) / intervalo;
float derivadaTemp = (temp3 - temp1) / intervalo;
float derivadaUmid = (umid3 - umid1) / intervalo;
float derivadaDist = (dist3 - dist1) / intervalo;
float mediaLDR = (valorLDR1 + valorLDR2 + valorLDR3) / 3.0;
// Controla o LED com base na média de LDR
int tempoPiscar = 200;
if (mediaLDR > 800) {
digitalWrite(LED_PIN, HIGH);
delay(tempoPiscar);
digitalWrite(LED_PIN, LOW);
delay(tempoPiscar);
digitalWrite(LED_PIN, HIGH);
delay(tempoPiscar);
digitalWrite(LED_PIN, LOW);
delay(tempoPiscar);
digitalWrite(LED_PIN, HIGH);
delay(tempoPiscar);
digitalWrite(LED_PIN, LOW);
delay(tempoPiscar);
} else if (mediaLDR > 500){
digitalWrite(LED_PIN, HIGH);
delay(tempoPiscar);
digitalWrite(LED_PIN, LOW);
delay(tempoPiscar);
digitalWrite(LED_PIN, HIGH);
delay(tempoPiscar);
digitalWrite(LED_PIN, LOW);
delay(tempoPiscar);
} else {
digitalWrite(LED_PIN, HIGH);
delay(tempoPiscar);
digitalWrite(LED_PIN, LOW);
delay(tempoPiscar);
}
// Exibe resultados no monitor serial
Serial.println("RESULTADOS:");
Serial.println("------------------------------------------");
Serial.println("Derivadas:");
Serial.print("LDR: ");
Serial.println(derivadaLDR);
Serial.print("Temperatura: ");
Serial.println(derivadaTemp);
Serial.print("Umidade: ");
Serial.println(derivadaUmid);
Serial.print("Distância: ");
Serial.println(derivadaDist);
Serial.println("\nMatriz (Valores e Tempos):");
Serial.println("V1\tV2\tV3\tT1\tT2\tT3");
// LDR
Serial.print(valorLDR1); Serial.print("\t");
Serial.print(valorLDR2); Serial.print("\t");
Serial.print(valorLDR3); Serial.print("\t");
Serial.print(tempoLDR1 / 1000); Serial.print("\t");
Serial.print(tempoLDR2 / 1000); Serial.print("\t");
Serial.println(tempoLDR3 / 1000);
// Temperatura
Serial.print(temp1); Serial.print("\t");
Serial.print(temp2); Serial.print("\t");
Serial.print(temp3); Serial.print("\t");
Serial.print(tempoTemp1 / 1000); Serial.print("\t");
Serial.print(tempoTemp2 / 1000); Serial.print("\t");
Serial.println(tempoTemp3 / 1000);
// Umidade
Serial.print(umid1); Serial.print("\t");
Serial.print(umid2); Serial.print("\t");
Serial.print(umid3); Serial.print("\t");
Serial.print(tempoUmid1 / 1000); Serial.print("\t");
Serial.print(tempoUmid2 / 1000); Serial.print("\t");
Serial.println(tempoUmid3 / 1000);
// Distância
Serial.print(dist1); Serial.print("\t");
Serial.print(dist2); Serial.print("\t");
Serial.print(dist3); Serial.print("\t");
Serial.print(tempoDist1 / 1000); Serial.print("\t");
Serial.print(tempoDist2 / 1000); Serial.print("\t");
Serial.println(tempoDist3 / 1000);
delay(2000); // Aguarda 2 segundos
}