#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6gipLqUDK"
#define BLYNK_TEMPLATE_NAME "DHT22 Monitoring 2 LED"
#define BLYNK_AUTH_TOKEN "89m3suMDGumOFozUnGJRalMoaXSayRq8"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <HTTPClient.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define LED_BLYNK 2
#define LED_TS 4
String apiKey = "IACX7IM6UCHG0KQC";
const char* server = "http://api.thingspeak.com/update";
#define TFT_CS 5
#define TFT_RST 4
#define TFT_DC 16
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
BlynkTimer timer;
String statusBlynk = "Waiting";
String statusTS = "Waiting";
float lastTemp = 0;
float lastHum = 0;
void kirimBlynk() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("❌ Gagal membaca DHT");
statusBlynk = "Sensor Error";
return;
}
lastTemp = t;
lastHum = h;
if (Blynk.connected()) {
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
digitalWrite(LED_BLYNK, HIGH);
timer.setTimeout(200L, [](){ digitalWrite(LED_BLYNK, LOW); });
statusBlynk = "SUCCESS";
Serial.println("✅ Blynk SUCCESS");
} else {
statusBlynk = "FAILED";
Serial.println("⚠ Blynk Disconnected");
}
}
void kirimThingSpeak() {
if (WiFi.status() != WL_CONNECTED) {
statusTS = "No WiFi";
return;
}
HTTPClient http;
String url = server;
url += "?api_key=" + apiKey;
url += "&field1=" + String(lastTemp);
url += "&field2=" + String(lastHum);
http.begin(url);
int response = http.GET();
Serial.print("ThingSpeak Response: ");
Serial.println(response);
if (response > 0) {
digitalWrite(LED_TS, HIGH);
timer.setTimeout(200L, [](){ digitalWrite(LED_TS, LOW); });
statusTS = "SUCCESS";
} else {
statusTS = "FAILED";
}
http.end();
}
void updateTFT() {
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0,0);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(1);
tft.println("=== MONITORING ===");
tft.print("Temp: ");
tft.println(lastTemp);
tft.print("Hum : ");
tft.println(lastHum);
tft.println("-----------------");
tft.print("WiFi: ");
tft.println(WiFi.status()==WL_CONNECTED ? "OK" : "NO");
tft.print("Blynk: ");
tft.println(statusBlynk);
tft.print("TS: ");
tft.println(statusTS);
}
void setup() {
Serial.begin(115200);
pinMode(LED_BLYNK, OUTPUT);
pinMode(LED_TS, OUTPUT);
digitalWrite(LED_BLYNK, LOW);
digitalWrite(LED_TS, LOW);
dht.begin();
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST77XX_BLACK);
Blynk.begin(auth, ssid, pass);
// Timer berbeda
timer.setInterval(2000L, kirimBlynk);
timer.setInterval(15000L, kirimThingSpeak);
timer.setInterval(1000L, updateTFT);
}
void loop() {
Blynk.run();
timer.run();
}