119 lines
3.1 KiB
C++
119 lines
3.1 KiB
C++
#include <ESP8266WiFi.h>
|
|
#include <ESP8266HTTPClient.h>
|
|
#include <WiFiClient.h>
|
|
#include <DHT.h>
|
|
|
|
#define DHT22_PIN D5 // Pin data DHT22 di ESP8266
|
|
#define DHTTYPE DHT22
|
|
|
|
DHT dht(DHT22_PIN, DHTTYPE);
|
|
|
|
// 🔹 Ganti dengan nama dan password WiFi Anda
|
|
const char* ssid = "Z";
|
|
const char* password = "zainal123";
|
|
|
|
// 🔹 URL API Laravel
|
|
const char* SERVER_NAME = "http://192.168.38.96:8000/api/sensor"; //ganti sesuai dengan ip laptop
|
|
|
|
// 🔹 Interval pengiriman data (5 menit)
|
|
const long interval = 300000; // 300.000 ms = 5 menit
|
|
unsigned long lastMillis = 0;
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
Serial.println("🚀 ESP8266 Mulai...");
|
|
|
|
dht.begin();
|
|
Serial.println("✅ DHT22 Siap");
|
|
|
|
connectToWiFi();
|
|
}
|
|
|
|
void loop() {
|
|
if (WiFi.status() != WL_CONNECTED) {
|
|
Serial.println("⚠ WiFi Terputus! Mencoba Koneksi Ulang...");
|
|
connectToWiFi();
|
|
}
|
|
|
|
unsigned long currentMillis = millis();
|
|
if (currentMillis - lastMillis >= interval) {
|
|
lastMillis = currentMillis;
|
|
upload_temperature();
|
|
}
|
|
|
|
delay(1000); // 🔹 Tambahkan delay agar tidak looping terlalu cepat
|
|
}
|
|
|
|
// 🔹 Fungsi Koneksi WiFi (Hanya Cetak IP Sekali)
|
|
void connectToWiFi() {
|
|
Serial.print("🔗 Menghubungkan ke WiFi...");
|
|
WiFi.begin(ssid, password);
|
|
|
|
unsigned long startAttemptTime = millis();
|
|
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 10000) { // Timeout 10 detik
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
|
|
if (WiFi.status() == WL_CONNECTED) {
|
|
Serial.println("\n✅ Terhubung ke WiFi! IP: " + WiFi.localIP().toString());
|
|
} else {
|
|
Serial.println("\n❌ Gagal Terhubung ke WiFi! Akan Dicoba Lagi Nanti.");
|
|
}
|
|
}
|
|
|
|
// 🔹 Fungsi Mengirim Data Sensor ke Laravel
|
|
void upload_temperature() {
|
|
float suhu, kelembaban;
|
|
int retryCount = 0;
|
|
bool success = false;
|
|
|
|
while (retryCount < 3) { // 🔹 Coba baca sensor maksimal 3 kali
|
|
suhu = dht.readTemperature() - 0.2;
|
|
kelembaban = dht.readHumidity() + 3.0;
|
|
|
|
if (!isnan(suhu) && !isnan(kelembaban)) {
|
|
success = true;
|
|
break;
|
|
}
|
|
|
|
Serial.println(F("⚠ Gagal membaca dari DHT22! Coba lagi..."));
|
|
delay(1000);
|
|
retryCount++;
|
|
}
|
|
|
|
if (!success) {
|
|
Serial.println(F("❌ Gagal membaca dari DHT22 setelah 3 percobaan!"));
|
|
return;
|
|
}
|
|
|
|
String jsonPayload = "{\"temperature\":" + String(suhu, 2) + ", \"humidity\":" + String(kelembaban, 2) + "}";
|
|
Serial.println("📤 Mengirim Data: " + jsonPayload);
|
|
|
|
WiFiClient client;
|
|
HTTPClient http;
|
|
http.setTimeout(5000); // 🔹 Timeout HTTP request agar lebih stabil
|
|
|
|
int httpResponseCode;
|
|
int maxRetries = 3; // 🔹 Coba maksimal 3 kali jika gagal
|
|
for (int i = 0; i < maxRetries; i++) {
|
|
http.begin(client, SERVER_NAME);
|
|
http.addHeader("Content-Type", "application/json");
|
|
|
|
httpResponseCode = http.POST(jsonPayload);
|
|
Serial.print("📡 HTTP Response Code: ");
|
|
Serial.println(httpResponseCode);
|
|
|
|
http.end(); // 🔹 Hindari masalah memori
|
|
|
|
if (httpResponseCode > 0) { // 🔹 Jika sukses, keluar dari loop
|
|
Serial.println("✅ Data berhasil dikirim!");
|
|
break;
|
|
}
|
|
|
|
Serial.println("❌ Gagal mengirim data! Coba lagi dalam 2 detik...");
|
|
delay(2000);
|
|
}
|
|
http.end();
|
|
}
|