#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h> // menyertakan library servo ke dalam program
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD dan ukuran (16x2)
#include <DHT.h>
#define DHTPIN 2 // Pin data DHT11/DHT22 terhubung ke pin 2
#define DHTTYPE DHT22 // Jenis sensor yang digunakan (DHT11 atau DHT22)
#define RELAY_PIN 3 // Pin yang terhubung ke relay
DHT dht(DHTPIN, DHTTYPE);
Servo myservo; // variable untuk menyimpan posisi data
int pos = 00;
const int TRIGPIN = 11;
const int ECHOPIN = 12;
long timer;
int jarak;
unsigned long previousTempPrintTime = 6000; // Waktu terakhir suhu ditampilkan
unsigned long previousHumiPrintTime = 0; // Waktu terakhir kelembaban ditampilkan
unsigned long lcdUpdateTime = 4000; // Interval waktu pembaruan LCD (dalam milidetik)
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT); // Mengatur pin relay sebagai output
digitalWrite(RELAY_PIN, HIGH); // Mengatur kondisi default relay menjadi high saat awal hidup
dht.begin();
lcd.setCursor(0, 0); // column, row
lcd.print("Dibuat Oleh :");
lcd.setCursor(0, 1); // column, row
lcd.print("Kelompok 4");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Terima Kasih");
delay(3000);
lcd.clear();
myservo.attach(5); //sinyal data kabel motor servo dikonekan di pin 5 Arduino
pinMode(ECHOPIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
pinMode(A0, INPUT);
}
void loop() {
// Membaca kelembaban dan suhu dari sensor
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Verifikasi apakah pembacaan suhu berhasil
if (isnan(temperature)) {
Serial.println("Gagal membaca suhu dari sensor DHT!");
return;
}
// Menampilkan suhu dan kelembaban pada Serial Monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.print(" °C\t");
//Serial.print("Kelembapan: ");
//Serial.print(humidity);
//Serial.println(" %");
// Menampilkan suhu dan status relay pada LCD
if (millis() - previousTempPrintTime >= lcdUpdateTime) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Fan: ");
if (temperature > 35) {
// Jika suhu lebih dari 30°C, relay akan dinyalakan
digitalWrite(RELAY_PIN, HIGH);
lcd.print("ON");
} else {
// Jika suhu 30°C atau kurang, relay akan dimatikan
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("\xDF" "C");
previousTempPrintTime = millis();
}
//if (millis() - previousHumiPrintTime >= lcdUpdateTime / 2) {
// lcd.setCursor(0, 0);
// lcd.print("Humi: ");
// lcd.print(humidity);
// lcd.print("% ");
// previousHumiPrintTime = millis();
//}
for(pos = 00; pos <100; pos += 1) //fungsi perulangan yang akan dijadikan PWM dengan kenaikan 1
{
myservo.write(pos); //prosedur penulisan data PWM ke motor servo
delay(50); //waktu tunda 15 ms
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
timer = pulseIn(ECHOPIN, HIGH);
jarak = timer/58;
delay(10);
Serial.print("Jarak = ");
Serial.print(jarak);
Serial.print(" cm");
Serial.println();
if (jarak < 10) {
myservo.detach();
}
else {
myservo.attach(5);
}
delay (10);
}
for(pos = 100; pos>=1; pos-=1) //fungsi perulangan yang akan dijadikan PWM dengan penurunan 1
{
myservo.write(pos);
delay(50);
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
timer = pulseIn(ECHOPIN, HIGH);
jarak = timer/58;
delay(10);
Serial.print("Jarak = ");
Serial.print(jarak);
Serial.print(" cm");
Serial.println();
if (jarak < 10) {
myservo.detach();
}
else {
myservo.attach(5);
}
delay (10);
}
}