/********** BLYNK CONFIG **********/
#define BLYNK_TEMPLATE_ID "TMPL6hWTUmree"
#define BLYNK_TEMPLATE_NAME "LatihanDHT22"
#define BLYNK_AUTH_TOKEN "VDeHdzvOSMsFSZOgMCZbTUTYU_Bp0mBo"
/********** LIBRARY **********/
#include <WiFi.h>
#include <HTTPClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
/********** WIFI **********/
const char* ssid = "Wokwi-GUEST";
const char* password = "";
/********** THINGSPEAK **********/
String writeApiKey = "URA7V4AHSRGCFQ9H";
String serverUrl = "https://api.thingspeak.com/update";
/********** PIN **********/
#define DHT_PIN 15
#define LED_BLYNK 2
#define LED_TS 4
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
/********** TIMER **********/
unsigned long lastBlynk = 0;
unsigned long lastTS = 0;
const unsigned long INTERVAL_BLYNK = 2000;
const unsigned long INTERVAL_TS = 15000;
/********** STATUS **********/
String wifiStatus = "DISCONNECTED";
String blynkStatus = "IDLE";
String tsStatus = "IDLE";
/********** OBJEK **********/
DHTesp dht;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
/********** OLED **********/
void tampilOLED(float t, float h) {
display.clearDisplay();
display.setCursor(0, 0);
display.print("T:");
display.print(t, 1);
display.print("C H:");
display.print(h, 1);
display.println("%");
display.print("WiFi: ");
display.println(wifiStatus);
display.print("Blynk: ");
display.println(blynkStatus);
display.print("TS: ");
display.println(tsStatus);
display.display();
}
/********** SETUP **********/
void setup() {
Serial.begin(115200);
pinMode(LED_BLYNK, OUTPUT);
pinMode(LED_TS, OUTPUT);
dht.setup(DHT_PIN, DHTesp::DHT22);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(1);
display.setTextColor(WHITE);
Serial.println("=== SYSTEM BOOT ===");
WiFi.begin(ssid, password);
Serial.print("Connecting WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(200);
Serial.print(".");
}
wifiStatus = "CONNECTED";
Serial.println("\nWiFi CONNECTED");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
Serial.println("Blynk Initialized");
}
/********** LOOP **********/
void loop() {
Blynk.run();
unsigned long now = millis();
TempAndHumidity data = dht.getTempAndHumidity();
// ===== SENSOR VALIDATION =====
if (isnan(data.temperature) || isnan(data.humidity)) {
blynkStatus = "SENSOR ERR";
tsStatus = "SENSOR ERR";
Serial.println("[ERROR] DHT22 read failed");
tampilOLED(0, 0);
return;
}
// ===== UPDATE WIFI STATUS =====
wifiStatus = (WiFi.status() == WL_CONNECTED) ? "CONNECTED" : "DISCONNECTED";
// ===== BLYNK (2 DETIK) =====
if (now - lastBlynk >= INTERVAL_BLYNK) {
lastBlynk = now;
Serial.println("---- BLYNK UPDATE ----");
Serial.printf("Temp: %.2f C | Hum: %.2f %%\n",
data.temperature, data.humidity);
if (Blynk.connected()) {
Blynk.virtualWrite(V0, data.temperature);
Blynk.virtualWrite(V1, data.humidity);
blynkStatus = "SUCCESS";
Serial.println("Blynk Send: SUCCESS");
digitalWrite(LED_BLYNK, HIGH);
} else {
blynkStatus = "FAILED";
Serial.println("Blynk Send: FAILED (Not Connected)");
digitalWrite(LED_BLYNK, LOW);
}
}
// ===== THINGSPEAK (15 DETIK) =====
if (now - lastTS >= INTERVAL_TS) {
lastTS = now;
Serial.println("---- THINGSPEAK UPDATE ----");
String url = serverUrl +
"?api_key=" + writeApiKey +
"&field1=" + String(data.temperature, 2) +
"&field2=" + String(data.humidity, 2);
HTTPClient http;
http.begin(url);
int code = http.GET();
String payload = http.getString();
http.end();
Serial.print("HTTP Code: ");
Serial.println(code);
Serial.print("Response : ");
Serial.println(payload);
if (code > 0 && payload.toInt() > 0) {
tsStatus = "SUCCESS";
Serial.println("ThingSpeak Send: SUCCESS");
digitalWrite(LED_TS, HIGH);
} else {
tsStatus = "FAILED";
Serial.println("ThingSpeak Send: FAILED");
digitalWrite(LED_TS, LOW);
}
}
// ===== OLED UPDATE =====
tampilOLED(data.temperature, data.humidity);
// ===== AUTO OFF LED =====
if (now - lastBlynk > 300) digitalWrite(LED_BLYNK, LOW);
if (now - lastTS > 300) digitalWrite(LED_TS, LOW);
}