/*spray disinfektan dan UV otomatis yang akan menyala ketika barang masuk ke box khusus
yang di lengkapi suhu optimation di 30 derajat celcius tampilkan kondisi di OLED*/
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <DHT.h>
#include <Servo.h>
// Definisikan parameter layar OLED
#define LEBAR_LAYAR 128 // Ukuran OLED
#define TINGGI_LAYAR 64
#define OLED_RESET -1
#define ALAMAT_I2C_OLED 0x3C
Adafruit_SSD1306 display(LEBAR_LAYAR, TINGGI_LAYAR, &Wire, OLED_RESET);
#define PIN_DHT 6
#define JENIS_DHT DHT22
DHT dht(PIN_DHT, JENIS_DHT);
#define PIN_LED A3
#define PIN_PIR 5
#define PIN_SERVO 4
Servo servo;
bool gerakanTerakhirTerdeteksi = false;
unsigned long ledStartTime = 0;
const unsigned long ledDuration = 5000; // Durasi nyala LED
void setup() {
Serial.begin(9600); // Mengatur komunikasi Serial
pinMode(PIN_LED, OUTPUT); // Pin mode
pinMode(PIN_PIR, INPUT);
digitalWrite(PIN_LED, LOW);
servo.attach(PIN_SERVO);
servo.write(0);
Wire.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, ALAMAT_I2C_OLED)) { // Memulai komunikasi I2C
Serial.println(F("Gagal inisialisasi SSD1306"));
for (;;) ;
}
display.clearDisplay(); // Mempersiapkan OLED
dht.begin(); // Mempersiapkan sensor
}
void loop() {
float suhu = dht.readTemperature(); // Membaca suhu
bool gerakanTerdeteksi = digitalRead(PIN_PIR); // Mendeteksi gerakan
Serial.print(F("Suhu: ")); // Menampilkan informasi suhu
Serial.println(suhu);
Serial.print(F("Gerakan Terdeteksi: ")); // Status gerakan pada serial monitor.
Serial.println(gerakanTerdeteksi);
perbaruiDisplay(suhu, gerakanTerdeteksi);
if (gerakanTerdeteksi != gerakanTerakhirTerdeteksi) { // Mengaktifkan jika ada gerakan
if (gerakanTerdeteksi) {
aktifkanSprayDanUV(suhu);
}
gerakanTerakhirTerdeteksi = gerakanTerdeteksi;
}
// Periksa apakah sudah waktunya mematikan LED
if (millis() - ledStartTime >= ledDuration) {
digitalWrite(PIN_LED, LOW);
}
delay(50);
}
void perbaruiDisplay(float suhu, bool gerakanTerdeteksi) {
display.clearDisplay(); // Membersihkan layar OLED
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
if (isnan(suhu)) { // Menampilkan informasi suhu
display.setCursor(0, 0);
display.print(F("Sensor Error"));
} else {
display.setCursor(0, 0);
display.print(F("Suhu: "));
display.print(suhu);
display.print(F(" C"));
display.setCursor(0, 16);
display.print(suhu >= 30.0 ? F("Suhu Tinggi") : F("Suhu Rendah"));
}
display.setCursor(0, 32); // Status spray
display.print(F("Spray: "));
display.print(gerakanTerdeteksi && (suhu >= 29.5 && suhu <= 30.5) ? F("ON") : F("OFF"));
display.setCursor(0, 48); // Status UV
display.print(F("UV: "));
display.print(gerakanTerdeteksi ? F("ON") : F("OFF"));
display.display();
}
void aktifkanSprayDanUV(float suhu) {
digitalWrite(PIN_LED, HIGH); // Mengaktifkan LED
ledStartTime = millis(); // Catat waktu saat LED dinyalakan
display.setCursor(0, 32);
display.print(F("Spray: ")); // Menampilkan status spray
display.print(suhu >= 29.5 && suhu <= 30.5 ? F("ON") : F("OFF"));
display.setCursor(0, 48); // Menampilkan UV pada layar OLED
display.print(F("UV: ON"));
display.display();
if (suhu >= 29.5 && suhu <= 30.5) {
for (int i = 0; i < 3; i++) {
servo.write(90);
delay(500); // Menggerakkan servo ke posisi 90 derajat dan menunggu setengah detik
servo.write(0);
delay(500); // Mengembalikan servo ke posisi 0 derajat dan menunggu setengah detik
}
}
}