#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ================== Multi-Zone Monitoring ==================
// PIR sensors
const int pirA = 2;
const int pirB = 3;
const int pirC = 4;
// DS18B20 sensors (each on a separate pin)
const int tempA_pin = 7; // Zone A
const int tempB_pin = 8; // Zone B
const int tempC_pin = 10; // Zone C
OneWire oneWireA(tempA_pin);
OneWire oneWireB(tempB_pin);
OneWire oneWireC(tempC_pin);
DallasTemperature sensorA(&oneWireA);
DallasTemperature sensorB(&oneWireB);
DallasTemperature sensorC(&oneWireC);
// Alert devices
const int buzzerZone = 9;
const int ledZone = 13;
// Counters
int countA = 0, countB = 0, countC = 0;
// Thresholds
int movementThreshold = 5;
float tempThresholdZone = 40.0;
// ================== LCD + Ultrasonic + PIR + LM35 ==================
constexpr uint8_t PIR = 11;
constexpr uint8_t LED = 33;
constexpr uint8_t BUZ = 37;
constexpr uint8_t TRIG = 27;
constexpr uint8_t ECHO = 41;
constexpr uint8_t TEMP_PIN = A0; // LM35 should be analog pin
constexpr uint8_t TEMP_LED = 39;
constexpr float TEMP_THRESHOLD = 37.0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Timings
constexpr unsigned long DOT_T = 500;
constexpr unsigned long ALARM_T = 5000;
constexpr unsigned long LED_SOLID = 2000;
constexpr unsigned long LED_BLINK = 200;
constexpr unsigned long BUZ_SW = 100;
enum State { WAIT, ALARM };
State state = WAIT;
unsigned long dotT = 0, alarmT = 0;
uint8_t dotF = 0;
bool pirPrev = LOW;
// Ultrasonic vars
long duration;
int distance;
// ================== Setup ==================
void setup() {
Serial.begin(9600);
// --- Multi-zone pins ---
pinMode(pirA, INPUT);
pinMode(pirB, INPUT);
pinMode(pirC, INPUT);
pinMode(ledZone, OUTPUT);
pinMode(buzzerZone, OUTPUT);
sensorA.begin();
sensorB.begin();
sensorC.begin();
Serial.println("=== Combined Monitoring System Started ===");
// --- LCD + Ultrasonic pins ---
pinMode(PIR, INPUT);
pinMode(LED, OUTPUT);
pinMode(BUZ, OUTPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(TEMP_LED, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0); lcd.print("Waiting for");
lcd.setCursor(0,1); lcd.print("Movements...");
}
// ================== Ultrasonic Distance Function ==================
int readUltrasonicDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH, 30000);
distance = duration * 0.034 / 2;
return distance;
}
// ================== Loop ==================
void loop() {
unsigned long now = millis();
// -------- Multi-zone PIR + Temp --------
if (digitalRead(pirA) == HIGH) countA++;
if (digitalRead(pirB) == HIGH) countB++;
if (digitalRead(pirC) == HIGH) countC++;
sensorA.requestTemperatures();
sensorB.requestTemperatures();
sensorC.requestTemperatures();
float tempValA = sensorA.getTempCByIndex(0);
float tempValB = sensorB.getTempCByIndex(0);
float tempValC = sensorC.getTempCByIndex(0);
if (tempValA == DEVICE_DISCONNECTED_C) tempValA = -127;
if (tempValB == DEVICE_DISCONNECTED_C) tempValB = -127;
if (tempValC == DEVICE_DISCONNECTED_C) tempValC = -127;
Serial.println("------ ZONE STATUS ------");
Serial.print("Zone A -> Movements: "); Serial.print(countA);
Serial.print(" | Temp: "); Serial.print(tempValA); Serial.println(" °C");
Serial.print("Zone B -> Movements: "); Serial.print(countB);
Serial.print(" | Temp: "); Serial.print(tempValB); Serial.println(" °C");
Serial.print("Zone C -> Movements: "); Serial.print(countC);
Serial.print(" | Temp: "); Serial.print(tempValC); Serial.println(" °C");
Serial.println("-------------------------");
bool motionDetected = (countA > movementThreshold || countB > movementThreshold || countC > movementThreshold);
bool tempHigh = (tempValA > tempThresholdZone || tempValB > tempThresholdZone || tempValC > tempThresholdZone);
if (motionDetected && tempHigh) {
tone(buzzerZone, 2000);
digitalWrite(ledZone, HIGH);
delay(200);
digitalWrite(ledZone, LOW);
delay(200);
} else {
noTone(buzzerZone);
digitalWrite(ledZone, LOW);
}
// -------- LCD + Ultrasonic + PIR --------
int dist = readUltrasonicDistance();
Serial.print("Distance: "); Serial.println(dist);
if (state == WAIT) {
if (now - dotT >= DOT_T) {
dotT = now; dotF = (dotF + 1) % 4;
lcd.setCursor(9,1);
lcd.print(dotF==0?" ":dotF==1?". ":dotF==2?".. ":"...");
}
bool pir = digitalRead(PIR);
if ((pir && !pirPrev) || (dist > 0 && dist < 20)) {
alarmT = now; state = ALARM;
lcd.clear();
lcd.setCursor(0,0); lcd.print("Intruder Alert!");
lcd.setCursor(0,1);
if (dist > 0 && dist < 20) {
lcd.print("Dist: "); lcd.print(dist); lcd.print("cm");
} else {
lcd.print("By PIR sensor");
}
digitalWrite(LED, HIGH);
}
pirPrev = pir;
}
else {
unsigned long el = now - alarmT;
if (el >= ALARM_T) {
noTone(BUZ);
digitalWrite(LED, LOW);
lcd.clear();
lcd.setCursor(0,0); lcd.print("Waiting for");
lcd.setCursor(0,1); lcd.print("Movements...");
dotF = 0; dotT = now; state = WAIT;
} else {
if (el < LED_SOLID) digitalWrite(LED, HIGH);
else digitalWrite(LED, ((el-LED_SOLID)%LED_BLINK) < (LED_BLINK/2));
if (el < 2000) {
tone(BUZ, (el % (2*BUZ_SW) < BUZ_SW) ? 1200 : 1800);
} else {
noTone(BUZ);
}
}
}
// -------- LM35 Temperature Sensor --------
int tempRaw = analogRead(TEMP_PIN); // FIXED: analogRead instead of digitalRead
float voltage = tempRaw * (5.0 / 1023.0);
float temperatureC = voltage * 100.0;
Serial.println("=== LM35 ===");
Serial.print("TempC: "); Serial.print(temperatureC); Serial.println(" °C");
Serial.println("------------------");
if (temperatureC > TEMP_THRESHOLD) {
if ((millis() / 200) % 2 == 0) {
digitalWrite(TEMP_LED, HIGH);
} else {
digitalWrite(TEMP_LED, LOW);
}
} else {
digitalWrite(TEMP_LED, LOW);
}
delay(500);
}
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20