#include "DHT.h"
#include <Servo.h>
// Pin Definitions
#define DHT_PIN 2
#define PIR_PIN 3
#define LED_PIN 4
#define SERVO_PIN 7
// DHT Sensor Type
#define DHT_TYPE DHT22
// Debug Mode (set to 1 for debug messages, 0 to disable)
#define DEBUG_MODE 0
// Delay Times (in milliseconds)
#define TEMP_HUMIDITY_DELAY 1000
#define PIR_DELAY 1000
#define SERVO_MOVE_DELAY 500
DHT dht(DHT_PIN, DHT_TYPE); // Initialize DHT sensor
Servo servo; // Initialize Servo
void readDHT();
void readPIR();
void setServo(uint8_t angle);
void setup() {
pinMode(PIR_PIN, INPUT); // Set PIR pin as input
pinMode(LED_PIN, OUTPUT); // Set LED pin as output
Serial.begin(9600); // Begin serial communication at 9600 baud rate
dht.begin(); // Initialize the DHT sensor
servo.attach(SERVO_PIN); // Attach the servo to the specified pin
Serial.println(F("IoT-Based Home Monitoring System"));
}
void loop() {
readDHT(); // Read temperature and humidity
readPIR(); // Read PIR sensor value
#if DEBUG_MODE
setServo(90); // Move servo to 90 degrees for testing
setServo(0); // Move servo back to 0 degrees for testing
#endif
}
void readDHT() {
float temperature = dht.readTemperature(); // Read temperature
float humidity = dht.readHumidity(); // Read humidity
// Check if any reads failed and exit early (to try again)
if (isnan(temperature) || isnan(humidity)) {
#if DEBUG_MODE
Serial.println(F("Failed to read from DHT sensor!"));
#endif
return;
}
Serial.print("a");
Serial.println(temperature);
delay(TEMP_HUMIDITY_DELAY);
Serial.print("b");
Serial.println(humidity);
delay(TEMP_HUMIDITY_DELAY);
#if DEBUG_MODE
Serial.print(F("Humidity: "));
Serial.print(humidity);
Serial.print(F("% Temperature: "));
Serial.print(temperature);
Serial.println(F("°C"));
delay(SERVO_MOVE_DELAY);
#endif
}
void readPIR() {
bool pir_value = digitalRead(PIR_PIN); // Read PIR sensor value
Serial.print("c");
if (pir_value) {
Serial.println(1);
#if DEBUG_MODE
Serial.println(F("Motion triggered!"));
#endif
} else {
Serial.println(0);
}
digitalWrite(LED_PIN, pir_value); // Set LED based on PIR value
delay(PIR_DELAY);
#if DEBUG_MODE
delay(SERVO_MOVE_DELAY);
#endif
}
void setServo(uint8_t angle) {
servo.write(angle); // Move servo to the specified angle
#if DEBUG_MODE
delay(SERVO_MOVE_DELAY);
#endif
}
void serialEvent() {
while (Serial.available()) {
char sensor_id = Serial.read(); // Read sensor ID
int value = Serial.parseInt(); // Parse the integer value
if (Serial.read() == char(13)) { // Check for carriage return
if (sensor_id == 'd') setServo(value); // Set servo position if sensor ID is 'd'
}
}
}