#include <DallasTemperature.h>
#include <DHT.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2591.h>
#include <Wire.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 4 // Pin data sensor DS18B20
#define DHT_PIN 2 // Pin data sensor DHT22
#define POT_PIN 14 // Pin ADC untuk potensiometer
#define ULTRASONIC_TRIGGER_PIN 12 // Pin trigger sensor ultrasonik
#define ULTRASONIC_ECHO_PIN 13 // Pin echo sensor ultrasonik
#define RELAY_PIN_1 46 // Pin relay 1
#define RELAY_PIN_2 45 // Pin relay 2
#define RELAY_PIN_3 42 // Pin relay 3
#define RELAY_PIN_4 41 // Pin relay 4
#define RELAY_PIN_5 33 // Pin relay 5
#define RELAY_PIN_6 21 // Pin relay 6
#define MOTOR_PIN 19 // Pin untuk menghidupkan motor DC
#define RELAY_ON LOW // Untuk relay active LOW
#define TEMP_THRESHOLD 30.0 // Ambang batas suhu untuk relay 1
#define TEMP_MIN 5.5 // Ambang batas minimal suhu untuk relay 2 dan relay 3
#define TEMP_MAX 7.5 // Ambang batas maksimal suhu untuk relay 2 dan relay 3
#define POT_MIN 5 // Ambang batas minimal potensiometer untuk relay 4 dan relay 5
#define POT_MAX 9 // Ambang batas maksimal potensiometer untuk relay 4 dan relay 5
#define ULTRASONIC_DISTANCE_THRESHOLD 400 // Ambang batas jarak untuk relay 6 (dalam satuan mm)
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DHT dht(DHT_PIN, DHT22);
Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591);
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN_1, OUTPUT);
pinMode(RELAY_PIN_2, OUTPUT);
pinMode(RELAY_PIN_3, OUTPUT);
pinMode(RELAY_PIN_4, OUTPUT);
pinMode(RELAY_PIN_5, OUTPUT);
pinMode(RELAY_PIN_6, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
pinMode(ULTRASONIC_TRIGGER_PIN, OUTPUT);
pinMode(ULTRASONIC_ECHO_PIN, INPUT);
sensors.begin();
dht.begin();
tsl.begin();
}
void loop() {
float temp_ds18b20 = getTemperatureDS18B20();
float temp_dht22 = getTemperatureDHT22();
float humidity = getHumidity();
int pot_value = getPotentiometerValue();
int ultrasonic_distance = getUltrasonicDistance();
// Menghidupkan relay 1 jika suhu di atas ambang batas
if (temp_ds18b20 > TEMP_THRESHOLD) {
digitalWrite(RELAY_PIN_1, RELAY_ON);
} else {
digitalWrite(RELAY_PIN_1, !RELAY_ON);
}
// Menghidupkan relay 2 dan relay 3 jika suhu berada dalam rentang yang ditentukan
if (temp_dht22 >= TEMP_MIN && temp_dht22 <= TEMP_MAX) {
digitalWrite(RELAY_PIN_2, RELAY_ON);
digitalWrite(RELAY_PIN_3, RELAY_ON);
} else {
digitalWrite(RELAY_PIN_2, !RELAY_ON);
digitalWrite(RELAY_PIN_3, !RELAY_ON);
}
// Menghidupkan relay 4 dan relay 5 jika potensiometer berada dalam rentang yang ditentukan
if (pot_value >= POT_MIN && pot_value <= POT_MAX) {
digitalWrite(RELAY_PIN_4, RELAY_ON);
digitalWrite(RELAY_PIN_5, RELAY_ON);
} else {
digitalWrite(RELAY_PIN_4, !RELAY_ON);
digitalWrite(RELAY_PIN_5, !RELAY_ON);
}
// Menghidupkan relay 6 jika jarak ultrasonik kurang dari ambang batas
if (ultrasonic_distance < ULTRASONIC_DISTANCE_THRESHOLD) {
digitalWrite(RELAY_PIN_6, RELAY_ON);
} else {
digitalWrite(RELAY_PIN_6, !RELAY_ON);
}
// Menghidupkan motor DC jika salah satu dari relay 2, 3, 4, atau 5 aktif
if (digitalRead(RELAY_PIN_2) == RELAY_ON || digitalRead(RELAY_PIN_3) == RELAY_ON ||
digitalRead(RELAY_PIN_4) == RELAY_ON || digitalRead(RELAY_PIN_5) == RELAY_ON) {
digitalWrite(MOTOR_PIN, HIGH);
delay(10000); // Menjalankan motor DC selama 10 detik
digitalWrite(MOTOR_PIN, LOW);
}
delay(1000); // Delay 1 detik antara pembacaan sensor
}
float getTemperatureDS18B20() {
sensors.requestTemperatures();
return sensors.getTempCByIndex(0);
}
float getTemperatureDHT22() {
return dht.readTemperature();
}
float getHumidity() {
return dht.readHumidity();
}
int getPotentiometerValue() {
return analogRead(POT_PIN);
}
int getUltrasonicDistance() {
digitalWrite(ULTRASONIC_TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIGGER_PIN, LOW);
return pulseIn(ULTRASONIC_ECHO_PIN, HIGH) * 0.034 / 2;
}