#include <LiquidCrystal.h>
#include <DHT.h>
const int rs = 12, rw = 11, e = 10, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, rw, e, d4, d5, d6, d7);
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
const int trigPin = 8, echoPin = 9, pirPin = 6, ledPin = 13;
const long ledOnTime = 1000, ledOffTime = 2000, lcdInterval = 2000, sensorReadInterval = 1000;
float temperature = 0, humidity = 0, distance = 0;
bool pirState = false;
int lcdState = 0;
bool ledState = false; // Inicializando como OFF
long previousMillisLed = 0, previousMillisLCD = 0, previousMillisRead = 0;
void setup() {
lcd.begin(16, 2);
lcd.print("iniciando...");
dht.begin();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // LED OFF no início
delay(2000);
lcd.clear();
lcd.print("sensores prontos");
delay(2000);
}
void loop() {
long currentMillis = millis();
if (currentMillis - previousMillisRead >= sensorReadInterval) {
previousMillisRead = currentMillis;
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (humidity != NAN && temperature != NAN) {
// Leitura de distância
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2;
}
pirState = digitalRead(pirPin);
}
// Controle do LED
if (currentMillis - previousMillisLed >= (ledState ? ledOnTime : ledOffTime)) {
previousMillisLed = currentMillis;
ledState = !ledState; // Alterna o estado do LED
digitalWrite(ledPin, ledState ? HIGH : LOW); // Atualiza o estado do LED
}
// Atualização do LCD
if (currentMillis - previousMillisLCD >= lcdInterval) {
previousMillisLCD = currentMillis;
lcd.clear();
lcd.setCursor(0, 0);
switch (lcdState) {
case 0: lcd.print("temp: " + String(temperature) + " C"); break;
case 1: lcd.print("umid: " + String(humidity) + " %"); break;
case 2: lcd.print("distancia: " + String(distance) + " cm"); break;
case 3: lcd.print(pirState ? "tem movimento." : "sem movimento"); break;
}
lcdState = (lcdState + 1) % 4;
}
}