#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Pin assignments for Arduino Mega
const int trigPin = 22;
const int echoPin = 23;
const int pirPin = 25;
const int ldrPin = A8;
const int servoPin = 26;
const int oneWireBus = 24;
// Create objects
Servo myServo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD address to 0x27 for a 16x2 display
OneWire oneWire(oneWireBus);
DallasTemperature ds18b20(&oneWire);
// Variables
long duration;
int distance;
int pirState = LOW;
int ldrValue;
float temperatureC;
void setup() {
// Initialize LCD with 16 columns and 2 rows
lcd.begin(16, 2);
lcd.backlight();
// Attach the servo
myServo.attach(servoPin);
// Initialize DS18B20 sensor
ds18b20.begin();
// Pin Modes
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pirPin, INPUT);
// Set initial servo position
myServo.write(0);
// Start serial communication
Serial.begin(9600);
}
void loop() {
// Read ultrasonic sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
// Read PIR sensor
pirState = digitalRead(pirPin);
// Read DS18B20 temperature
ds18b20.requestTemperatures();
temperatureC = ds18b20.getTempCByIndex(0);
// Read LDR value
ldrValue = analogRead(ldrPin);
// Display data on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.print(temperatureC);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Dist:");
lcd.print(distance);
lcd.print("cm");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PIR:");
lcd.print(pirState ? "Motion" : "NoMotion");
lcd.setCursor(0, 1);
lcd.print("LDR:");
lcd.print(ldrValue);
delay(2000);
// Servo control based on temperature
if (temperatureC > 30) {
myServo.write(90); // Move servo to 90 degrees
} else {
myServo.write(0); // Move servo back to 0 degrees
}
delay(1000);
}