#include <Servo.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 7 // Pin yang digunakan untuk sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT
DHT dht(DHTPIN, DHTTYPE);
Servo myservo; // Objek untuk kontrol servo
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C untuk LCD 20x4
int servoPin = 9; // Pin yang terhubung ke kontrol servo
int buttonPin = 2; // Pin untuk tombol setting waktu servo
int hourButtonPin = 3; // Pin untuk tombol input jam
int minuteButtonPin = 4; // Pin untuk tombol input menit
int servoPos = 0; // Posisi awal servo
bool setTime = false; // Untuk menandai ketika waktu setting servo
int setHour = 0; // Variabel untuk jam yang diatur
int setMinute = 0; // Variabel untuk menit yang diatur
void setup() {
Serial.begin(9600);
myservo.attach(servoPin); // Menghubungkan pin kontrol servo
pinMode(buttonPin, INPUT_PULLUP); // Mengatur pin tombol sebagai input dengan pull-up resistor
pinMode(hourButtonPin, INPUT_PULLUP); // Mengatur pin tombol jam sebagai input dengan pull-up resistor
pinMode(minuteButtonPin, INPUT_PULLUP); // Mengatur pin tombol menit sebagai input dengan pull-up resistor
lcd.init(); // Menginisialisasi LCD
lcd.backlight(); // Menghidupkan backlight LCD
dht.begin(); // Memulai sensor DHT22
}
void loop() {
// Membaca suhu dan kelembapan
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Menampilkan suhu dan kelembapan pada LCD
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(humidity);
lcd.print("%");
// Membaca tombol untuk setting waktu servo
if (digitalRead(buttonPin) == LOW) {
setTime = true; // Memulai setting waktu servo
delay(500); // Memberikan delay untuk menghindari bounce pada tombol
}
// Jika dalam mode setting waktu servo
if (setTime) {
lcd.setCursor(0, 3);
lcd.print("Setting servo time");
// Memeriksa tombol input jam
if (digitalRead(hourButtonPin) == LOW) {
setHour++; // Menambah jam yang diatur
delay(250); // Delay untuk menghindari bounce pada tombol
}
// Memeriksa tombol input menit
if (digitalRead(minuteButtonPin) == LOW) {
setMinute++; // Menambah menit yang diatur
delay(250); // Delay untuk menghindari bounce pada tombol
}
// Menampilkan waktu yang diatur pada LCD
lcd.setCursor(0, 2);
lcd.print("Set time: ");
lcd.print(setHour);
lcd.print(":");
if (setMinute < 10) {
lcd.print("0"); // Menampilkan 0 di depan angka jika menit kurang dari 10
}
lcd.print(setMinute);
// Set servo position based on set time (for example, at 06:00, 12:00, and 21:00)
unsigned long currentTime = millis();
if ((currentTime >= setMillis(6, 0) && currentTime < setMillis(6, 1)) ||
(currentTime >= setMillis(12, 0) && currentTime < setMillis(12, 1)) ||
(currentTime >= setMillis(21, 0) && currentTime < setMillis(21, 1))) {
myservo.write(90); // Contoh posisi 90 derajat
}
// Akhiri mode setting waktu setelah beberapa waktu atau kondisi tertentu
// setTime = false;
} else {
// Operasi normal lainnya dilakukan di sini
// ...
}
}
// Fungsi untuk mengubah waktu menjadi milidetik sejak opersi dimulai
unsigned long setMillis(int hours, int minutes) {
return hours * 3600000UL + minutes * 60000UL;
}