#define BLYNK_TEMPLATE_ID "TMPL6v7OhwI7u"
#define BLYNK_TEMPLATE_NAME "IOT Monitoring System"
#define BLYNK_AUTH_TOKEN "MX1NJa6zJYLLRhux0CXYizDzH5VcEO0M"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <BlynkSimpleEsp32_SSL.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define DHTPIN 19
#define DHTTYPE DHT22
const int ledGreen = 26;
const int ledYellow = 27;
const int ledRed = 14;
const int buzzer = 18;
bool buzzerEnabled = true;
bool buzzerState = false;
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(128, 64, &Wire, -1);
BlynkTimer timer;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
WiFiClientSecure client;
BLYNK_WRITE(V4) {
buzzerEnabled = param.asInt();
if (!buzzerEnabled) {
digitalWrite(buzzer, LOW);
buzzerState = false;
}
}
void sendSensorData() {
WiFi.begin(ssid, pass);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected to WiFi");
Blynk.begin(auth, ssid, pass, "blynk.cloud", 443);
float temp = dht.readTemperature();
float hum = dht.readHumidity();
Serial.print("Temperature: "); Serial.print(temp); Serial.print(" C, ");
Serial.print("Humidity: "); Serial.print(hum); Serial.println(" %");
String statusText = "";
bool isAman = (temp >= 20 && temp <= 28) && (hum >= 45 && hum <= 60);
bool isWaspada = (temp >= 29 && temp <= 31) && (hum >= 61 && hum <= 65);
bool isKritis = !isAman && !isWaspada;
if (isAman) {
digitalWrite(ledGreen, HIGH);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
digitalWrite(buzzer, LOW);
statusText = "AMAN";
} else if (isWaspada) {
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledRed, LOW);
statusText = "WASPADA";
Blynk.logEvent("warning", "Kondisi waspada!cek ruang penyimpanan!");
} else if (isKritis) {
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, HIGH);
statusText = "KRITIS";
if (buzzerEnabled) {
digitalWrite(buzzer, HIGH);
}
Blynk.logEvent("danger", "Suhu atau kelembapan di luar batas aman kritis bro!");
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Monitoring Obat");
display.setCursor(0, 15);
display.print("Temp: "); display.print(temp); display.println(" C");
display.print("Hum : "); display.print(hum); display.println(" %");
display.print("Status: "); display.println(statusText);
display.display();
Blynk.virtualWrite(V3, temp);
Blynk.virtualWrite(V1, hum);
Blynk.virtualWrite(V2, statusText);
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
Serial.println("Waiting for time sync...");
while (time(nullptr) < 100000) {
delay(500);
Serial.print(".");
}
Serial.println("Time synchronized!");
}
void toggleBuzzer() {
if (buzzerEnabled && digitalRead(ledYellow) == HIGH) {
buzzerState = !buzzerState;
digitalWrite(buzzer, buzzerState ? HIGH : LOW);
} else if (!buzzerEnabled || digitalRead(ledYellow) == LOW) {
digitalWrite(buzzer, LOW);
buzzerState = false;
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(ledGreen, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(buzzer, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED gagal!");
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Monitoring Obat");
display.display();
client.setInsecure();
timer.setInterval(2000L, sendSensorData);
timer.setInterval(500L, toggleBuzzer);
}
void loop() {
Blynk.run();
sendSensorData();
toggleBuzzer();
timer.run();
}