// Nayla Januarisa Prihadi - J0404241149
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL64h27hz-i"
#define BLYNK_TEMPLATE_NAME "Latihan DHT22"
#define BLYNK_AUTH_TOKEN "l4oRQZVwzY8vm3nsFxXLUc_1ip6nUARn"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <HTTPClient.h>
#include "DHTesp.h"
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
// ===== TFT PIN =====
#define TFT_CS 5
#define TFT_RST 4
#define TFT_DC 2
Adafruit_ILI9341 tft(TFT_CS, TFT_DC, TFT_RST);
// ===== WIFI =====
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
char auth[] = BLYNK_AUTH_TOKEN;
// ===== THINGSPEAK =====
String writeApiKey = "Q22EHTX6N7UY0U2T";
String serverUrl = "http://api.thingspeak.com/update";
// ===== DHT =====
DHTesp dht;
const int DHT_PIN = 15;
// ===== LED =====
#define LED_BLYNK 25
#define LED_TS 26
BlynkTimer timer;
// ===== GLOBAL STATUS =====
float suhu = 0;
float hum = 0;
String statusBlynk = "-";
String statusTS = "-";
void setup() {
Serial.begin(115200);
pinMode(LED_BLYNK, OUTPUT);
pinMode(LED_TS, OUTPUT);
dht.setup(DHT_PIN, DHTesp::DHT22);
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
}
Blynk.begin(auth, ssid, pass);
timer.setInterval(2000L, kirimBlynk);
timer.setInterval(15000L, kirimThingSpeak);
}
void loop() {
Blynk.run();
timer.run();
}
// ===== KIRIM BLYNK =====
void kirimBlynk() {
TempAndHumidity data = dht.getTempAndHumidity();
if (isnan(data.temperature)) return;
suhu = data.temperature;
hum = data.humidity;
if (Blynk.connected()) {
Blynk.virtualWrite(V0, suhu);
Blynk.virtualWrite(V1, hum);
digitalWrite(LED_BLYNK, HIGH);
timer.setTimeout(200, []() {
digitalWrite(LED_BLYNK, LOW);
});
statusBlynk = "OK";
} else {
statusBlynk = "Fail";
}
updateTFT();
}
// ===== KIRIM THINGSPEAK =====
void kirimThingSpeak() {
String url = serverUrl +
"?api_key=" + writeApiKey +
"&field1=" + String(suhu, 2) +
"&field2=" + String(hum, 2);
HTTPClient http;
http.begin(url);
int code = http.GET();
String payload = http.getString();
http.end();
if (code > 0 && payload.toInt() > 0) {
digitalWrite(LED_TS, HIGH);
timer.setTimeout(200, []() {
digitalWrite(LED_TS, LOW);
});
statusTS = "OK";
} else {
statusTS = "Fail";
}
updateTFT();
}
// ===== UPDATE TFT =====
void updateTFT() {
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.setCursor(20,20);
tft.print("Temp: ");
tft.print(suhu);
tft.println(" C");
tft.setCursor(20,60);
tft.print("Hum : ");
tft.print(hum);
tft.println(" %");
tft.setTextSize(2);
tft.setCursor(20,120);
tft.setTextColor(ILI9341_YELLOW);
tft.print("Blynk: ");
tft.println(statusBlynk);
tft.setCursor(20,160);
tft.print("TS : ");
tft.println(statusTS);
}