#define BLYNK_TEMPLATE_ID "TMPL6SjS-w3Fy"
#define BLYNK_TEMPLATE_NAME "Sensor Kelembapan"
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = "xxxxxxxxxxxxxxxxx";  // Token Blynk
char ssid[] = "H4nk";                               // Nama WiFi
char pass[] = "xxxxxxxxxxxx";                         // Password WiFi

const int sensorPin = A0; // Pin sensor kelembapan tanah
BlynkTimer timer;         // Timer untuk pengecekan koneksi

bool lastWiFiStatus = false;   // Status koneksi WiFi terakhir
bool lastBlynkStatus = false;  // Status koneksi Blynk terakhir

void setup() {
  Serial.begin(115200);
  connectToWiFiAndBlynk(); // Fungsi koneksi awal
  
  pinMode(sensorPin, INPUT);

  // Atur timer untuk menjalankan fungsi pembacaan sensor secara berkala
  timer.setInterval(1000L, sendSensorData); // Setiap 1 detik
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    connectToWiFiAndBlynk(); // Rekoneksi jika WiFi terputus
  } else if (!Blynk.connected()) {
    connectToWiFiAndBlynk(); // Rekoneksi jika Blynk terputus
  }
  
  Blynk.run();
  timer.run(); // Jalankan timer untuk fungsi pembacaan sensor

  checkConnectionStatus(); // Cek dan tampilkan status koneksi
}

// Fungsi untuk menghubungkan ke WiFi dan Blynk
void connectToWiFiAndBlynk() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Menghubungkan ke WiFi...");
    WiFi.begin(ssid, pass);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("\nWiFi Terhubung");
  }

  if (!Blynk.connected()) {
    Serial.println("Menghubungkan ke Blynk...");
    Blynk.config(auth);
    Blynk.connect(); // Menyambungkan ke server Blynk
    if (Blynk.connected()) {
      Blynk.syncAll(); // Sinkronisasi data Blynk jika koneksi berhasil
      Serial.println("Blynk Terhubung dan Data Tersinkronisasi");
    }
  }
}

// Fungsi untuk membaca data sensor dan mengirim ke Blynk
void sendSensorData() {
  if (Blynk.connected()) { // Hanya kirim data jika terhubung ke Blynk
    int kelembapan = analogRead(sensorPin);
    int persentaseKelembapan = map(kelembapan, 1023, 0, 0, 100); // Kalibrasi sesuai sensor
    Blynk.virtualWrite(V1, kelembapan); // Kirim data ke Virtual Pin V1
    Serial.print("Kelembapan: ");
    Serial.print(kelembapan);
    Serial.print(" %");
        Serial.print(" |  Persentase Kelembapan : ");
    Serial.print(persentaseKelembapan);
    Serial.println(" %");

  } else {
    Serial.println("Tidak terhubung ke Blynk, data tidak terkirim.");
  }
}

// Fungsi untuk memeriksa dan menampilkan status koneksi WiFi dan Blynk
void checkConnectionStatus() {
  bool currentWiFiStatus = (WiFi.status() == WL_CONNECTED);
  bool currentBlynkStatus = Blynk.connected();

  // Cek perubahan status koneksi WiFi
  if (currentWiFiStatus != lastWiFiStatus) {
    if (currentWiFiStatus) {
      Serial.println("Status WiFi: Terhubung");
    } else {
      Serial.println("Status WiFi: Terputus");
    }
    lastWiFiStatus = currentWiFiStatus;
  }

  // Cek perubahan status koneksi Blynk
  if (currentBlynkStatus != lastBlynkStatus) {
    if (currentBlynkStatus) {
      Serial.println("Status Blynk: Terhubung");
    } else {
      Serial.println("Status Blynk: Terputus");
    }
    lastBlynkStatus = currentBlynkStatus;
  }
}
$abcdeabcde151015202530fghijfghij
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
Soil Moisture PercentageBreakout
chip1:GND
chip1:VCC
chip1:A0
esp1:GND
esp1:TX
esp1:GPIO2
esp1:CH_PD
esp1:GPIO0
esp1:RESET
esp1:RX
esp1:VCC
r1:1
r1:2
r2:1
r2:2
led1:A
led1:C
r3:1
r3:2