#include <WiFi.h> //Library WiFi
#include "DHT.h"
#include <HTTPClient.h>
//PIN
DHT dht(15, DHT22);
//IntervalDHT22
unsigned long lastDHT22Read = 0;
const long DHT22Interval = 2000; // Baca sensor tiap 2 detik
//Filter const
float filteredTemp = 0;
float filteredHum = 0;
float alpha = 0.2; // Semakin kecil semakin mulus, semakin besar semakin responsif
//SSID n Wifi Pass
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
void MulaiWifi (){
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,pass);
}
void CekWiFiStatus() {
static bool sudahCetakIP = false;
if (WiFi.status() == WL_CONNECTED) {
if (!sudahCetakIP){
Serial.print("Koneksi Berhasil! IP Anda: ");
Serial.println(WiFi.localIP());
sudahCetakIP = true;
}
//publish data suhu dan kelembaban
} else {
sudahCetakIP = false;
ReconnectWiFi();
}
}
void ReconnectWiFi() {
static unsigned long lastRetry = 0;
unsigned long retryInterval = 10000; // Coba lagi setiap 10 detik
if (millis() - lastRetry >= retryInterval) {
Serial.println("Mencoba koneksi ulang...");
WiFi.begin(ssid,pass);
lastRetry = millis();
}
}
//Read n Filter Suhu
void FilterTemp(){
float rawTemp = dht.readTemperature();
// Cek apakah data valid (bukan NaN atau outlier ekstrem)
if (!isnan(rawTemp) && rawTemp > 14 && rawTemp < 45) {
// Rumus EMA
filteredTemp = (alpha * rawTemp) + ((1.0 - alpha) * filteredTemp);
Serial.print("RawTemp: "); Serial.print(rawTemp);
Serial.print(" | FilteredTemp: "); Serial.println(filteredTemp);
}
}
//Read n Filter Kelembaban
void FilterHum(){
float rawHum = dht.readHumidity();
// Cek apakah data valid (bukan NaN atau outlier ekstrem)
if (!isnan(rawHum) && rawHum > 30 && rawHum < 90) {
// Rumus EMA
filteredHum = (alpha * rawHum) + ((1.0 - alpha) * filteredHum);
Serial.print("RawHum: "); Serial.print(rawHum);
Serial.print(" | FilteredHum: "); Serial.println(filteredHum);
}
}
void KirimData(){
if(WiFi.status()==WL_CONNECTED){
HTTPClient http;
//1.Tentukan endpoint
http.begin("http://alamat-server.com/api/sensor");
//2.Set Header
http.addHeader("Content-Type","application/json");
//3. Susun payload
String httpRequestData ="{\"temperature\":\""+String(filteredTemp,2)+"\", \"humidity\":\""+String(filteredHum,1)+"\"}";
//4. Kirim post
int httpResponseCode = http.POST(httpRequestData);
if(httpResponseCode>0){
Serial.print("Data Terkirim, Server Response : ");
Serial.println(httpResponseCode);
}
else{
Serial.print("Error saat mengirim :");
Serial.println(httpResponseCode);
}
//5.bebaskan resource
http.end();
}
}
void setup() {
Serial.begin(115200);
dht.begin();
MulaiWifi();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis-lastDHT22Read>=DHT22Interval){
FilterTemp();
FilterHum();
lastDHT22Read = currentMillis;
}
CekWiFiStatus();
KirimData();
}
/*
1. Nambah https (per bagian)
2. Nambah sharp dust sensor
*/