#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <RTClib.h>
#include <SD.h>
// Definisikan pin dan tipe sensor DHT
#define DHTPIN 4
#define DHTTYPE DHT22
// Definisikan pin buzzer dan sc card
#define BUZZER_PIN 15
#define CS_PIN 5
// Inisialisasi LCD, DHT, dan RTC
LiquidCrystal_I2C lcd(0x27, 16, 2); // Sesuaikan alamat I2C jika berbeda
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
// Inisialisasi modul SD dan file untuk data CSV
File dataFile;
void setup() {
// Inisialisasi serial monitor untuk debugging
Serial.begin(115200);
// Inisialisasi LCD
lcd.init(); // Menggunakan init() bukan begin() di beberapa library
lcd.backlight();
// Menampilkan tulisan awal
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("RUANG");
lcd.setCursor(1, 1);
lcd.print("MASTER STATION");
delay(5000);
lcd.clear();
// Inisialisasi DHT
dht.begin();
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RTC Error!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC tidak berjalan, set waktu ke default.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Inisialisasi buzzer sebagai output
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW); // Pastikan buzzer mati di awal
// Inisialisasi modul SD
if (!SD.begin(CS_PIN)) { // Pin SS untuk modul SD, ubah sesuai kebutuhan Anda
lcd.clear();
Serial.println("Gagal inisialisasi SD Card!");
lcd.setCursor(1, 0);
lcd.print("Ada Masalah");
delay(3000);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("SD Card Error!");
while (true);
}
// Buka file untuk menambahkan data
dataFile = SD.open("data.csv", FILE_WRITE);
if (!dataFile) {
Serial.println("Gagal membuka file data.csv");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("File Error!");
while (1);
}
// Tambahkan header CSV jika file kosong
if (dataFile.size() == 0) {
dataFile.println("Tanggal, Waktu, Suhu (C)");
}
}
void loop() {
// Membaca suhu dari sensor DHT22
float suhu = dht.readTemperature();
// Membaca waktu dari RTC
DateTime now = rtc.now();
// Periksa apakah pembacaan suhu valid
if (isnan(suhu)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Error baca DHT");
Serial.println("Error membaca dari sensor DHT");
return;
}
// Menampilkan suhu di LCD
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.print(" C");
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.println(" C");
// Tulis data ke file CSV
dataFile.print(now.day());
dataFile.print('/');
dataFile.print(now.month());
dataFile.print('/');
dataFile.print(now.year());
dataFile.print(",");
dataFile.print(now.hour());
dataFile.print(":");
if (now.minute() < 10) dataFile.print('0');
dataFile.print(now.minute());
dataFile.print(":");
if (now.second() < 10) dataFile.print('0');
dataFile.print(now.second());
dataFile.print(",");
dataFile.println(suhu);
// Tunda untuk menghindari penulisan yang terlalu cepat
delay(1000); // Misalnya, tulis data setiap 5 detik
// Jika suhu melebihi 30 derajat, aktifkan buzzer
if (suhu > 30) {
digitalWrite(BUZZER_PIN, HIGH); // Aktifkan buzzer (buzzer aktif dengan ground)
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("SUHU BERLEBIH");
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.print(" C");
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.println(" C");
} else {
digitalWrite(BUZZER_PIN, LOW); // Matikan buzzer
delay(2000); // Misalnya, tulis data setiap 5 detik
lcd.clear();
// Menampilkan waktu di LCD
lcd.setCursor(0, 0);
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print('0');
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) lcd.print('0');
lcd.print(now.second());
}
}