#define BLYNK_TEMPLATE_ID "TMPL6Tk813SpL"
#define BLYNK_TEMPLATE_NAME "Latihan2"
#define BLYNK_AUTH_TOKEN "7O_cnLxMc9B7XJdilxKU1WYR_mRVdlj4"
#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHTesp.h"
#include <BlynkSimpleEsp32.h>
// ================== KONFIGURASI ==================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak
String writeApiKey = "RMYHNKHF6YMTWTAK";
String serverUrl = "https://api.thingspeak.com/update";
#define BLYNK_TEMPLATE_ID "TMPL6Tk813SpL"
#define BLYNK_TEMPLATE_NAME "Latihan2"
#define BLYNK_AUTH_TOKEN "7O_cnLxMc9B7XJdilxKU1WYR_mRVdlj4"
// PIN
#define LED_BLYNK 2 // LED hijau
#define LED_TS 4 // LED biru
#define DHT_PIN 15
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
// INTERVAL
#define INTERVAL_BLYNK 2000 // 2 detik
#define INTERVAL_TS 15000 // 15 detik
// ================== OBJEK ==================
DHTesp dht;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
unsigned long lastBlynk = 0;
unsigned long lastTS = 0;
// ================== SETUP ==================
void setup() {
Serial.begin(115200);
pinMode(LED_BLYNK, OUTPUT);
pinMode(LED_TS, OUTPUT);
digitalWrite(LED_BLYNK, LOW);
digitalWrite(LED_TS, LOW);
dht.setup(DHT_PIN, DHTesp::DHT22);
// OLED
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
}
// Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
}
// ================== LOOP ==================
void loop() {
Blynk.run();
unsigned long now = millis();
TempAndHumidity data = dht.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) return;
// ===== BLYNK (2 detik) =====
if (now - lastBlynk >= INTERVAL_BLYNK) {
lastBlynk = now;
Blynk.virtualWrite(V0, data.temperature);
Blynk.virtualWrite(V1, data.humidity);
digitalWrite(LED_BLYNK, HIGH);
delay(80);
digitalWrite(LED_BLYNK, LOW);
display.clearDisplay();
display.setCursor(0,0);
display.printf("T: %.2f C\n", data.temperature);
display.printf("H: %.2f %%\n", data.humidity);
display.println("Blynk: SUCCESS");
display.display();
}
// ===== THINGSPEAK (15 detik) =====
if (now - lastTS >= INTERVAL_TS) {
lastTS = now;
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();
bool sendOK = false;
if (code > 0 && payload.toInt() > 0) sendOK = true;
if (sendOK) {
digitalWrite(LED_TS, HIGH);
delay(80);
digitalWrite(LED_TS, LOW);
}
display.clearDisplay();
display.setCursor(0,0);
display.printf("T: %.2f C\n", data.temperature);
display.printf("H: %.2f %%\n", data.humidity);
display.println("ThingSpeak:");
display.println(sendOK ? "SUCCESS" : "FAILED");
display.display();
Serial.println("====================");
Serial.println(url);
Serial.print("HTTP: "); Serial.println(code);
Serial.print("RESP: "); Serial.println(payload);
}
}