#include <Arduino.h> // Pustaka utama untuk fungsi Arduino
#include <Adafruit_Sensor.h> // Pustaka untuk sensor Adafruit
#include <TM1637Display.h> // Pustaka untuk mengontrol TM1637 display
#include <DHT.h> // Pustaka untuk sensor DHT
// Mendefinisikan pin yang digunakan
#define CLK 3 // Pin untuk Clock pada TM1637
#define DIO 4 // Pin untuk Data I/O pada TM1637
#define DHTPIN 5 // Pin untuk sensor DHT
#define DHTTYPE DHT22 // Tipe sensor DHT yang digunakan
#define Buzzer 6 // Pin untuk buzzer
#define Reset 7 // Pin untuk tombol reset
// Variabel boolean untuk status alarm dan konfirmasi
bool Alarm; // Status alarm, false berarti tidak aktif
bool telahKonfirmasi; // Status apakah konfirmasi telah dilakukan
bool Konfirmasi; // Status apakah tombol reset ditekan
// Variabel untuk menyimpan nilai suhu
int temperature_celsius; // Suhu dalam Celsius
int temperature_fahrenheit; // Suhu dalam Fahrenheit
float temperatureDHTC; // Suhu desimal dalam Celsius
float temperatureDHTF; // Suhu desimal dalam Fahrenheit
// Variabel untuk pengelolaan waktu
unsigned long konfirmasiTime; // Waktu saat tombol konfirmasi ditekan
unsigned long currentMillis; // Waktu saat ini
const unsigned long interval = 1800000; // 30 menit dalam milidetik
const unsigned long warningDuration = 1000; // 1 detik dalam milidetik
int warningCount; // Menghitung jumlah peringatan yang telah diberikan
// Buat simbol °C untuk tampilan
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Lingkaran
SEG_A | SEG_D | SEG_E | SEG_F // C
};
// Buat simbol °F untuk tampilan
const uint8_t fahrenheit[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Lingkaran
SEG_A | SEG_E | SEG_F | SEG_G // F
};
// Membuat objek untuk mengontrol TM1637 display dan sensor DHT
TM1637Display display(CLK, DIO); // Objek untuk TM1637 display
DHT dht(DHTPIN, DHTTYPE); // Objek untuk sensor DHT
void setup(){
pinMode(Reset, INPUT_PULLUP); // Mengatur pin Reset sebagai INPUT_PULLUP
pinMode(Buzzer, OUTPUT); // Mengatur pin Buzzer sebagai OUTPUT
Serial.begin(9600); // Memulai komunikasi serial dengan baud rate 9600
display.setBrightness(7); // Mengatur kecerahan display
display.clear(); // Membersihkan display
dht.begin(); // Memulai sensor DHT
}
void loop(){
// Membaca suhu dari sensor DHT
temperature_celsius = dht.readTemperature(); // Membaca suhu dalam Celsius
temperature_fahrenheit = dht.readTemperature(true); // Membaca suhu dalam Fahrenheit
float temperatureDHTC = dht.readTemperature();
float temperatureDHTF = dht.readTemperature(true);
// Memeriksa apakah pembacaan suhu berhasil
if (isnan(temperature_celsius) || isnan(temperature_fahrenheit)) {
Serial.println("Failed to read from DHT sensor!"); // Pesan kesalahan jika gagal membaca
return; // Keluar dari loop jika pembacaan gagal
}
// Menampilkan suhu dalam Celsius pada display
display.showNumberDec(temperature_celsius, false, 2, 0); // Menampilkan dua digit suhu Celsius
display.setSegments(celsius, 2, 2); // Menampilkan simbol °C
delay(2000); // Jeda 2 detik
// Menampilkan suhu dalam Fahrenheit pada display
display.showNumberDec(temperature_fahrenheit, false, 2, 0); // Menampilkan dua digit suhu Fahrenheit
display.setSegments(fahrenheit, 2, 2); // Menampilkan simbol °F
delay(1000); // Jeda 1 detik
// Mencetak suhu dalam Celsius dan Fahrenheit ke serial monitor
Serial.print("C_DHT: ");
Serial.println(temperatureDHTC);
Serial.print("F_DHT: ");
Serial.println(temperatureDHTF);
// Memeriksa apakah suhu di bawah 40°C dan menyimpan statusnya dalam `sistemNormal`
bool sistemNormal = (temperature_celsius <= 40);
// Memeriksa status tombol reset dan menyimpannya dalam `Konfirmasi`
Konfirmasi = !digitalRead(Reset);
// Mencatat waktu saat ini dalam `currentMillis`
currentMillis = millis();
if (sistemNormal) {
// Reset semua kondisi jika suhu normal
Alarm = false;
telahKonfirmasi = false;
warningCount;
konfirmasiTime;
} else {
if (!telahKonfirmasi) {
// Suhu di atas 40 dan belum ada konfirmasi, alarm akan berbunyi
Alarm = true;
if (Konfirmasi) {
// Jika tombol konfirmasi ditekan, catat waktu konfirmasi dan matikan alarm
telahKonfirmasi = true;
konfirmasiTime = currentMillis;
Alarm = false;
}
} else {
// Suhu di atas 40 dan sudah ada konfirmasi
if ((currentMillis - konfirmasiTime >= interval) && warningCount < 2) {
// Jika 30 menit berlalu dan peringatan belum mencapai 2 kali, beri peringatan
for (int i = 0; i < 2; i++) {
digitalWrite(Buzzer, HIGH); // Menyalakan buzzer
delay(warningDuration); // Durasi peringatan 1 detik
digitalWrite(Buzzer, LOW); // Mematikan buzzer
delay(1000); // Tambahan delay 1 detik di antara peringatan
}
// Tingkatkan penghitung peringatan dan reset timer untuk peringatan berikutnya
warningCount++;
konfirmasiTime = currentMillis;
}
}
}
// Mengontrol buzzer berdasarkan status alarm
digitalWrite(Buzzer, Alarm ? HIGH : LOW);
delay(1000); // Jeda 1 detik
}