#include <WiFi.h>
#include <HTTPClient.h>
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define LED_PIN 2
#define DHT_PIN 15
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHTesp dht;
// ===== WIFI =====
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ===== THINGSPEAK =====
String writeApiKey = "66P5HDZKJII66MKC";
String serverUrl = "https://api.thingspeak.com/update";
unsigned long lastSend = 0;
const unsigned long SEND_INTERVAL = 2000; // 2 detik
// ================= OLED FUNCTION =================
void tampilOLED(float suhu, float hum,
String wifiStatus,
String sendStatus,
String httpInfo)
{
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.println("Monitoring IoT");
display.print("T:");
display.print(suhu,1);
display.println(" C");
display.print("H:");
display.print(hum,1);
display.println(" %");
display.println("----------------");
display.print("WiFi : ");
display.println(wifiStatus);
display.print("Send : ");
display.println(sendStatus);
display.print("HTTP : ");
display.println(httpInfo);
display.display();
}
// ================= WIFI CONNECT =================
void connectWiFi()
{
Serial.print("Menghubungkan WiFi");
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("\n✅ WiFi Connected");
}
// ================= SETUP =================
void setup()
{
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
dht.setup(DHT_PIN, DHTesp::DHT22);
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("ESP32 Starting...");
display.display();
connectWiFi();
delay(2000);
}
// ================= LOOP =================
void loop()
{
if(millis() - lastSend < SEND_INTERVAL)
return;
lastSend = millis();
TempAndHumidity data = dht.getTempAndHumidity();
float suhu = data.temperature;
float hum = data.humidity;
// ==== VALIDASI SENSOR ====
if(isnan(suhu) || isnan(hum))
{
Serial.println("❌ DHT22 ERROR");
tampilOLED(0,0,
"Connected",
"Sensor Error",
"-");
digitalWrite(LED_PIN, LOW);
return;
}
String wifiStatus =
(WiFi.status()==WL_CONNECTED) ?
"Connected" : "Disconnected";
// ==== WIFI CHECK ====
if(WiFi.status()!=WL_CONNECTED)
{
Serial.println("WiFi Putus!");
digitalWrite(LED_PIN, LOW);
tampilOLED(
suhu,
hum,
"Disconnected",
"Fail",
"-"
);
connectWiFi();
return;
}
// ==== BUILD URL ====
String url = serverUrl +
"?api_key=" + writeApiKey +
"&field1=" + String(suhu,2) +
"&field2=" + String(hum,2);
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
String payload = http.getString();
http.end();
// ==== SERIAL MONITOR ====
Serial.println("====== SEND DATA ======");
Serial.println(url);
Serial.print("HTTP Code : ");
Serial.println(httpCode);
Serial.print("Response : ");
Serial.println(payload);
// ==== VALIDASI RESPONSE ====
String sendStatus="Fail";
String httpInfo="-";
if(httpCode > 0)
{
httpInfo = String(httpCode);
if(payload.toInt() > 0)
{
Serial.println("✅ BERHASIL");
sendStatus="Success";
// LED BLINK
digitalWrite(LED_PIN,HIGH);
delay(200);
digitalWrite(LED_PIN,LOW);
}
else
{
Serial.println("⚠ Response 0 ERROR");
sendStatus="Resp=0";
digitalWrite(LED_PIN,LOW);
}
}
else
{
Serial.print("HTTP ERROR : ");
Serial.println(httpCode);
sendStatus="HTTP Fail";
httpInfo = String(httpCode);
digitalWrite(LED_PIN,LOW);
}
// ==== OLED DISPLAY ====
tampilOLED(
suhu,
hum,
wifiStatus,
sendStatus,
httpInfo
);
}