#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
#define powerPin 8 // Pin untuk power control
// 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
bool suhuTelegram;
// Variabel untuk menyimpan nilai suhu
int temperature_celsius; // Suhu dalam Celsius
int temperature_fahrenheit; // Suhu dalam Fahrenheit
int kelembapan_rh;
float temperatureDHTC;
float temperatureDHTF;
float kelembapanDHTRH;
// Variabel untuk pengelolaan waktu
unsigned long konfirmasiTime = 0; // Waktu saat tombol konfirmasi ditekan
unsigned long currentMillis = 0; // Waktu saat ini
unsigned long TelegramTime = 0; // Waktu saat ini
const unsigned long interval = 1800000; // 30 menit dalam milidetik
const unsigned long intervalTelegram = 60000; // 30 menit dalam milidetik
const unsigned long warningDuration = 1000; // 1 detik dalam milidetik
int warningCount = 0; // 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
};
// Buat simbol °C untuk tampilan
const uint8_t RH[] = {
SEG_A | SEG_B | SEG_C| SEG_E | SEG_F | SEG_G, // R
SEG_B | SEG_C | SEG_E | SEG_F | SEG_G // H
};
// 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(powerPin, OUTPUT); // Mengatur powerPin sebagai OUTPUT
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(){
digitalWrite(powerPin, HIGH); // Menyalakan power pin
// Membaca suhu dari sensor DHT
temperature_celsius = dht.readTemperature(); // Membaca suhu dalam Celsius
temperature_fahrenheit = dht.readTemperature(true); // Membaca suhu dalam Fahrenheit
kelembapan_rh = dht.readHumidity();
float temperatureDHTC = dht.readTemperature();
float kelembapanDHTRH = dht.readHumidity();
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 Celsius pada display
display.showNumberDec(kelembapan_rh, false, 2, 0); // Menampilkan dua digit suhu Celsius
display.setSegments(RH, 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 ke serial monitor
Serial.print(temperatureDHTC);
Serial.print(",");
Serial.println(kelembapanDHTRH);
// Memeriksa apakah suhu di bawah 40°C dan menyimpan statusnya dalam `sistemNormal`
bool sistemNormal = (temperature_celsius <= 40 && kelembapan_rh <=98 );
bool sistemtidakNormal = (temperature_celsius > 40 && kelembapan_rh > 98);
// 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;
suhuTelegram = false;
warningCount;
konfirmasiTime;
}
else {
if (sistemtidakNormal) {
if (!suhuTelegram || millis()- TelegramTime > intervalTelegram){
Serial.write(2);
suhuTelegram = true;
}
}
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;
}
if (Serial.available()>0) {
// Jika tombol konfirmasi ditekan, catat waktu konfirmasi dan matikan alarm
int reading = Serial.read();
if(reading == 1) {
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
}