#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Servo.h>
#include <TM1637.h>
// Pin definition for TM1637
const int CLK1 = 2;
const int DIO1 = 3;
const int CLK2 = 4;
const int DIO2 = 5;
// Create TM1637 display objects
TM1637 tmTemp(CLK1, DIO1);
TM1637 tmSmoke(CLK2, DIO2);
// Pin definition for other components
const int smokeA0 = A0;
const int dhtPin = 6;
const int buzzer = 9;
const int led = 8;
const int waterLed = 10;
const int blueLed = 7;
const int servoPin = 13;
// Create DHT sensor object
#define DHTTYPE DHT22
DHT dht(dhtPin, DHTTYPE);
// Create Servo motor object
Servo servoMotor;
// Create LCD object
LiquidCrystal_I2C lcd(0x27, 20, 4); // Address 0x27 for 20x4 I2C LCD
// Variable to store smoke level
int smokeLevel;
void setup() {
// Initialize TM1637 displays
tmTemp.init();
tmTemp.set(BRIGHT_TYPICAL);
tmSmoke.init();
tmSmoke.set(BRIGHT_TYPICAL);
// Initialize LCD
lcd.begin(20, 4); // No need to specify dimensions for 20x4 LCD
lcd.print("SYSTEM SIAP BERJAGA");
// Initialize pins
pinMode(smokeA0, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(led, OUTPUT);
pinMode(waterLed, OUTPUT);
pinMode(blueLed, OUTPUT);
// Initialize Serial communication
Serial.begin(9600);
// Initialize DHT sensor
dht.begin();
// Attach servo motor
servoMotor.attach(servoPin);
}
void loop() {
// Read smoke level
smokeLevel = analogRead(smokeA0);
// Read temperature
float temperature = dht.readTemperature();
// Check if temperature reading failed
if (isnan(temperature)) {
Serial.println("Gagal membaca sensor dht22");
return;
}
// Print smoke level and temperature to Serial
Serial.print("Tingkatan Asap : ");
Serial.print(smokeLevel);
Serial.print(" Temperature: ");
Serial.println(temperature);
// Display temperature and smoke level on TM1637
displayTemperature(temperature);
displaySmoke(smokeLevel);
// Alarm and water release conditions
if (smokeLevel > 300 && temperature > 50) {
Serial.println("Asap dan Suhu tinggi Terdeteksi Aktifkan alarm dan keluarkan Air");
tone(buzzer, 262);
lcd.clear();
lcd.print("Evakuasi!!");
lcd.setCursor(0, 1);
lcd.print("ASAP SUHU Tinggi");
servoMotor.write(90);
digitalWrite(blueLed, HIGH);
for (int i = 0; i < 10; i++) {
digitalWrite(led, HIGH);
digitalWrite(waterLed, HIGH);
delay(500);
digitalWrite(led, LOW);
digitalWrite(waterLed, LOW);
delay(500);
}
noTone(buzzer);
} else if (smokeLevel > 300) {
Serial.println("Asap tinggi terdeteksi, Aktifkan alarm");
tone(buzzer, 262);
lcd.clear();
lcd.print("WASPADA!!!");
lcd.setCursor(0, 1);
lcd.print("Asap disini");
servoMotor.write(90);
digitalWrite(blueLed, HIGH);
for (int i = 0; i < 10; i++) {
digitalWrite(led, HIGH);
digitalWrite(waterLed, HIGH);
delay(500);
digitalWrite(led, LOW);
digitalWrite(waterLed, LOW);
delay(500);
}
noTone(buzzer);
} else if (temperature > 50) {
Serial.println("Suhu tinggi terdeteksi, Aktifkan alarm");
tone(buzzer, 262);
lcd.clear();
lcd.print("WASPADA!!!");
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print("C");
servoMotor.write(90);
digitalWrite(blueLed, HIGH);
for (int i = 0; i < 10; i++) {
digitalWrite(led, HIGH);
digitalWrite(waterLed, HIGH);
delay(500);
digitalWrite(led, LOW);
digitalWrite(waterLed, LOW);
delay(500);
}
noTone(buzzer);
} else {
// Reset conditions
noTone(buzzer);
digitalWrite(led, LOW);
digitalWrite(waterLed, LOW);
servoMotor.write(0);
digitalWrite(blueLed, LOW);
lcd.clear();
lcd.print("BERJAGA");
Serial.println("SYSTEM SIAP BERJAGA");
}
delay(1000);
}
void displayTemperature(float temperature) {
// Check if temperature is negative
bool isNegative = (temperature < 0);
// Convert temperature to integer parts
int intPart = abs((int)temperature);
tmTemp.display(0, intPart / 10);
tmTemp.display(1, intPart % 10);
int decPart = (int)((abs(temperature) - intPart) * 10);
tmTemp.display(2, decPart);
if (isNegative) {
tmTemp.display(3, 10);
} else {
tmTemp.display(3, 0);
}
tmTemp.point(true);
}
void displaySmoke(int smokeLevel) {
if (smokeLevel > 9999) {
smokeLevel = 9999;
}
tmSmoke.display(0, smokeLevel / 1000);
tmSmoke.display(1, (smokeLevel / 100) % 10);
tmSmoke.display(2, (smokeLevel / 10) % 10);
tmSmoke.display(3, smokeLevel % 10);
}