#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(12, DHT22);
Servo myServo;
const int TRIG1 = 8;
const int ECHO1 = 9;
const int TRIG2 = 10;
const int ECHO2 = 11;
const int RELAY = 6;
const int RED_LED = 4;
const int GREEN_LED = 5;
unsigned int jarak1, jarak2, k, timer, suhu;
unsigned int masuk, keluar;
float Temp;
void ukur_jarak1() {
digitalWrite(TRIG1, LOW);
delayMicroseconds(2);
digitalWrite(TRIG1, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG1, LOW);
timer = pulseIn(ECHO1, HIGH);
jarak1 = timer / 58;
}
void ukur_jarak2() {
digitalWrite(TRIG2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG2, LOW);
timer = pulseIn(ECHO2, HIGH);
jarak2 = timer / 58;
}
void ukur_temp() {
Temp = dht.readTemperature();
lcd.setCursor(7, 7);
lcd.print(Temp);
delay(300);
}
void kontrol_motor_servo_led() {
if (masuk >= 10 || Temp >= 30) {
myServo.write(90); // Sudut sesuai kebutuhan
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RELAY, HIGH);
} else {
myServo.write(0); // Sudut sesuai kebutuhan (servo mati)
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RELAY, LOW);
}
}
void setup() {
lcd.begin(16, 2);
lcd.backlight();
lcd.print("Jumlah = ");
lcd.setCursor(0, 1);
lcd.print("Suhu = ");
lcd.setCursor(1, 0);
dht.begin();
pinMode(ECHO1, INPUT);
pinMode(TRIG1, OUTPUT);
pinMode(ECHO2, INPUT);
pinMode(TRIG2, OUTPUT);
pinMode(RELAY, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
myServo.attach(7);
}
void loop() {
ukur_temp();
ukur_jarak1();
if (jarak1 < 75) {
jarak1 = 150;
jarak2 = 150;
while (jarak2 > 75) {
ukur_jarak2();
}
while (jarak2 < 120) {
ukur_jarak2();
}
masuk++;
lcd.setCursor(9, 0);
lcd.print(masuk);
delay(1000);
}
ukur_jarak2();
if (jarak2 < 75 && masuk > 0 ) {
jarak1 = 150;
jarak2 = 150;
while (jarak1 > 75) {
ukur_jarak1();
}
while (jarak1 < 120) {
ukur_jarak1();
}
keluar++;
masuk--;
lcd.setCursor(9, 0);
lcd.print(masuk);
delay(1000);
kontrol_motor_servo_led();
if (masuk >= 10 || Temp >= 30) {
digitalWrite(RELAY, HIGH);
} else {
digitalWrite(RELAY, LOW);
}
}
}