#include <DHT.h>
// ---------------- PIN CONFIG ----------------
#define POT_PIN 15
#define TRIG_PIN 4
#define ECHO_PIN 2
#define PIR_PIN 16
#define LED1 17
#define LED2 5
#define LED3 18
#define LED4 19
#define SERVO_PIN 21
#define DHT_PIN 23
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
// ---------------- VARIABLES ----------------
int servoAngle = 0;
int previousAngle = 0;
bool pirTriggered = false;
bool lastPirState = LOW;
// ---------------- SERVO FUNCTION ----------------
void setServoAngle(int angle) {
int pulseWidth = map(angle, 0, 180, 500, 2500);
digitalWrite(SERVO_PIN, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(SERVO_PIN, LOW);
delay(20);
}
// ---------------- ULTRASONIC ----------------
long getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
return duration * 0.034 / 2;
}
// ---------------- SETUP ----------------
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(SERVO_PIN, OUTPUT);
dht.begin();
Serial.println("System Ready (Wait PIR warmup)");
}
// ---------------- LOOP ----------------
void loop() {
// -------- READ POT (always keep updated) --------
int potValue = analogRead(POT_PIN);
int potAngle = map(potValue, 0, 4095, 0, 180);
// -------- PIR DETECTION --------
bool pirState = digitalRead(PIR_PIN);
if (pirState == HIGH && lastPirState == LOW && !pirTriggered) {
pirTriggered = true;
previousAngle = potAngle; // store current position
Serial.println("PIR DETECTED → Servo to 50°");
// move to 50°
for (int i = 0; i < 90; i++) {
setServoAngle(90);
}
delay(3000); // 🔥 3 second hold
Serial.println("Returning to original position");
// return to previous angle
for (int i = 0; i < 50; i++) {
setServoAngle(previousAngle);
}
pirTriggered = false;
}
lastPirState = pirState;
// -------- NORMAL POT CONTROL --------
if (!pirTriggered) {
servoAngle = potAngle;
setServoAngle(servoAngle);
}
// -------- ULTRASONIC LEDs (ACTIVE LOW) --------
long distance = getDistance();
digitalWrite(LED1, !(distance > 0 && distance < 150));
digitalWrite(LED2, !(distance > 0 && distance < 100));
digitalWrite(LED3, !(distance > 0 && distance < 50));
// -------- DHT --------
float temp = dht.readTemperature();
if (!isnan(temp)) {
digitalWrite(LED4, temp > 30 ? LOW : HIGH);
}
// -------- DEBUG --------
Serial.print("PIR: "); Serial.print(pirState);
Serial.print(" | Servo: "); Serial.print(servoAngle);
Serial.print(" | Temp: "); Serial.println(temp);
delay(500);
}