#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#define DHTTYPE DHT22
#define DHT1_PIN 2 // Pin sensor lantai 1
DHT dht1(DHT1_PIN, DHTTYPE);
#define BUTTON_PIN_ADD 12 // Tombol untuk menambah jumlah
#define BUTTON_PIN_SUBTRACT 13 // Tombol untuk mengurangi jumlah
#define BUTTON_PIN_MODE 11 // Tombol untuk mengubah mode count
RTC_DS1307 rtc; // Inisialisasi RTC
unsigned long previousMillis1 = 0;
const long interval1 = 2100; // Interval pembacaan DHT
float count1 = 0.0; // Variabel untuk menyimpan jumlah tombol ditekan dalam mode count 1
float count2 = 0.0; // Variabel untuk menyimpan jumlah tombol ditekan dalam mode count 2
float count3 = 0.0; // Variabel untuk menyimpan jumlah tombol ditekan dalam mode count 3
float scale = 0.1; // Skala penjumlahan/pengurangan
// Variabel untuk menyimpan status tombol sebelumnya
bool previousButtonStateAdd = HIGH;
bool previousButtonStateSubtract = HIGH;
bool previousButtonStateMode = HIGH;
// Variabel untuk penanganan waktu
unsigned long previousMillis = 0;
const long interval = 200; // Interval debounce untuk tombol
// Variabel untuk melacak jumlah penekanan tombol mode
int modeButtonPressCount = 0;
void setup() {
Serial.begin(9600);
dht1.begin();
pinMode(BUTTON_PIN_ADD, INPUT_PULLUP);
pinMode(BUTTON_PIN_SUBTRACT, INPUT_PULLUP);
pinMode(BUTTON_PIN_MODE, INPUT_PULLUP);
Wire.begin();
rtc.begin();
// Cek apakah RTC sudah berjalan, jika belum, atur waktu default
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
unsigned long currentMillis = millis();
// Baca status tombol
bool currentButtonStateAdd = digitalRead(BUTTON_PIN_ADD);
bool currentButtonStateSubtract = digitalRead(BUTTON_PIN_SUBTRACT);
bool currentButtonStateMode = digitalRead(BUTTON_PIN_MODE);
// Tambahkan jumlah jika tombol add ditekan
if (currentButtonStateAdd == LOW && previousButtonStateAdd == HIGH && currentMillis - previousMillis >= interval) {
if (modeButtonPressCount == 1) {
count1 += scale;
} else if (modeButtonPressCount == 2) {
count2 += scale;
} else if (modeButtonPressCount == 3) {
count3 += scale;
} else if (modeButtonPressCount == 4) {
// Ubah detik RTC ke depan
DateTime now = rtc.now();
rtc.adjust(DateTime(now.unixtime() + 1));
} else if (modeButtonPressCount == 5) {
// Kembali ke mode 0 jika mode mencapai 5
modeButtonPressCount = 0;
}
previousMillis = currentMillis;
}
// Kurangi jumlah jika tombol subtract ditekan
if (currentButtonStateSubtract == LOW && previousButtonStateSubtract == HIGH && currentMillis - previousMillis >= interval) {
if (modeButtonPressCount == 1) {
count1 -= scale;
} else if (modeButtonPressCount == 2) {
count2 -= scale;
} else if (modeButtonPressCount == 3) {
count3 -= scale;
} else if (modeButtonPressCount == 4) {
// Ubah detik RTC ke belakang
DateTime now = rtc.now();
rtc.adjust(DateTime(now.unixtime() - 1));
} else if (modeButtonPressCount == 5) {
// Kembali ke mode 0 jika mode mencapai 5
modeButtonPressCount = 0;
}
previousMillis = currentMillis;
}
// Ubah mode count jika tombol mode ditekan
if (currentButtonStateMode == LOW && previousButtonStateMode == HIGH && currentMillis - previousMillis >= interval) {
modeButtonPressCount++;
if (modeButtonPressCount > 5) {
modeButtonPressCount = 0; // Kembali ke mode 0 setelah mode 5
}
previousMillis = currentMillis;
}
// Simpan status tombol sebelumnya untuk debounce
previousButtonStateAdd = currentButtonStateAdd;
previousButtonStateSubtract = currentButtonStateSubtract;
previousButtonStateMode = currentButtonStateMode;
// Tampilkan nilai suhu dan kelembaban dengan penyesuaian dari count1 dan count2
if (currentMillis - previousMillis1 >= interval1) {
previousMillis1 = currentMillis;
float suhu1 = dht1.readTemperature() + count1;
float kelembaban1 = dht1.readHumidity() + count2;
if (isnan(suhu1) || isnan(kelembaban1)) {
Serial.println("Gagal membaca sensor!");
return;
}
Serial.print("Suhu 1: ");
Serial.print(suhu1);
Serial.print(" °C, Kelembaban 1: ");
Serial.print(kelembaban1);
Serial.println(" %");
// Baca waktu dari RTC dan tampilkan
}
DateTime now = rtc.now();
Serial.print("Waktu RTC: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.print(now.second());
Serial.println();
// Tunggu sebentar sebelum membaca tombol lagi
delay(100);
}