Search This Blog

Thursday, 7 August 2025

Dokumentasi Proyek ESP32: Display Tandon Air Otomatis

 Dokumentasi Proyek ESP32: Display Tandon Air Otomatis

1. Deskripsi Proyek:
Display ini berfungsi sebagai monitor level air tandon secara real-time menggunakan ESP32. Data ditampilkan melalui LCD 20x4 yang terhubung ke ESP Display, dan dikirim dari ESP Master melalui HTTP. Sistem ini juga mendukung konfigurasi WiFi langsung dari browser.

2. Komponen yang Digunakan:

  • ESP32 (2 unit): 1 untuk Master (dengan sensor), 1 untuk Display

  • Sensor ultrasonic (di sisi Master)

  • LCD 20x4 I2C

  • Breadboard & kabel jumper

  • Sumber daya (USB atau adaptor)

3. Fitur Utama:

  • Menampilkan level air dalam bentuk:

    • Bar horizontal (baris 0)

    • Persentase level (baris 1)

    • Volume air dalam liter (baris 2)

  • Baris ke-3 menampilkan informasi bergantian:

    • "Teknologi by Putu" ↔ "Tandon Air Otomatis" ↔ "WiFi CONNECTED"

  • Terhubung ke ESP Master melalui HTTP

  • Menyediakan halaman konfigurasi WiFi via Web Server

4. Alur Kerja:

  1. ESP Display menginisialisasi LCD dan WiFi

  2. Jika sudah dikonfigurasi, ESP Display terhubung ke jaringan

  3. ESP Display mengambil data dari IP Master melalui HTTP GET /data

  4. Data dipecah menjadi persentase dan liter, lalu ditampilkan

  5. Baris ke-3 menampilkan info bergantian setiap interval tertentu

5. Format Data dari Master:

  • Format: persen,liter

  • Contoh: 75,1500

6. Pengaturan WiFi:

  • Akses ke halaman konfigurasi: Hubungkan ke AP "Tandon_Display" → buka IP bawaan (misal: 192.168.4.1)

  • Isi SSID, Password, IP Master, IP Lokal, dan Gateway

  • Klik Simpan & Restart

7. Tampilan LCD (20x4):

[██████████        ]     <-- Bar Level (baris 0)
Level  : 75%             <-- Persen Air (baris 1)
Volume : 1500 L          <-- Liter (baris 2)
Teknologi by Putu       <-- Info bergantian (baris 3)

8. Catatan Tambahan:

  • Gunakan power supply yang stabil untuk kedua ESP

  • Efek berkedip dihilangkan agar koneksi tidak terganggu

  • LCD tetap dalam orientasi horizontal, namun tampilan menyerupai sistem vertikal melalui susunan bar dan teks

9. Pengembangan Selanjutnya (opsional):

  • Integrasi Telegram notifikasi

  • Logging data ke SD card atau cloud

  • Kontrol relay/pompa otomatis dari ESP Master

  • Tampilan grafik melalui halaman web lokal

10. Penulis & Pengembang:
Gusti Putu Wirawan

-- Selesai --



BERIKUT KODING NYA UMTUK ESP ke 2


#include <WiFi.h>

#include <WebServer.h>

#include <Preferences.h>

#include <LiquidCrystal_I2C.h>

#include <HTTPClient.h>


// ---------------- Konfigurasi Awal ----------------

#define AP_SSID "Tandon_Display"

#define AP_PASS "12345678"


Preferences prefs;

WebServer server(80);


// LCD 20x4

LiquidCrystal_I2C lcd(0x27, 20, 4);


// Variabel WiFi & IP Master

String ssid, pass, ipMaster, ipLocal, gwLocal;

IPAddress localIP, gateway, subnet(255,255,255,0);


// Data yang ditampilkan

String persenAir = "--";

String literAir = "--";


// Pergantian teks baris ke-3

int modeTeks = 0;


// ---------------- Fungsi WiFi ----------------

void setupWiFi() {

  WiFi.mode(WIFI_AP_STA);

  WiFi.softAP(AP_SSID, AP_PASS);

  Serial.print("AP Display IP: ");

  Serial.println(WiFi.softAPIP());


  ssid = prefs.getString("ssid", "");

  pass = prefs.getString("pass", "");

  ipMaster = prefs.getString("master", "192.168.1.200");

  ipLocal = prefs.getString("ip", "192.168.1.201");

  gwLocal = prefs.getString("gw", "192.168.1.1");


  if(ssid != ""){

    localIP.fromString(ipLocal);

    gateway.fromString(gwLocal);

    WiFi.config(localIP, gateway, subnet);

    WiFi.begin(ssid.c_str(), pass.c_str());

    Serial.println("Connecting...");

    unsigned long start = millis();

    while(WiFi.status()!=WL_CONNECTED && millis()-start<10000){

      delay(500); Serial.print(".");

    }

    Serial.println(WiFi.status()==WL_CONNECTED ? "\nConnected!" : "\nFailed.");

  }

}


// ---------------- Web Config ----------------

void handleRoot(){

  String html = "<h2>Display Tandon</h2>";

  html += "Level: "+persenAir+"%<br>Volume: "+literAir+" L<br><br>";

  html += "<a href='/wifi'>Konfigurasi WiFi</a>";

  server.send(200,"text/html",html);

}


void handleWiFiConfig(){

  if(server.method() == HTTP_POST){

    prefs.putString("ssid", server.arg("ssid"));

    prefs.putString("pass", server.arg("pass"));

    prefs.putString("master", server.arg("master"));

    prefs.putString("ip", server.arg("ip"));

    prefs.putString("gw", server.arg("gw"));

    server.send(200,"text/html","<h3>Disimpan! Restart...</h3>");

    delay(2000); ESP.restart();

    return;

  }


  String html = "<h2>Konfigurasi WiFi Display</h2><form method='POST'>";

  html += "SSID: <input name='ssid' value='"+ssid+"'><br>";

  html += "Password: <input name='pass' value='"+pass+"'><br>";

  html += "IP Master: <input name='master' value='"+ipMaster+"'><br>";

  html += "IP Lokal: <input name='ip' value='"+ipLocal+"'><br>";

  html += "Gateway: <input name='gw' value='"+gwLocal+"'><br>";

  html += "<input type='submit' value='Simpan & Restart'></form><br><a href='/'>Kembali</a>";

  server.send(200,"text/html",html);

}


// ---------------- LCD ----------------

void tampilLCD(){

  lcd.clear();


  // Bar horizontal di baris 0

  lcd.setCursor(0, 0);

  lcd.print("[");

  int bar = 0;

  if (persenAir != "--") {

    bar = map(persenAir.toInt(), 0, 100, 0, 18);

  }

  for (int i = 0; i < 18; i++) {

    lcd.print(i < bar ? char(255) : ' ');

  }

  lcd.print("]");


  // Persen air di baris 1

  lcd.setCursor(0, 1);

  lcd.print("Level  : ");

  lcd.print(persenAir); lcd.print("%   ");


  // Volume di baris 2

  lcd.setCursor(0, 2);

  lcd.print("Volume : ");

  lcd.print(literAir); lcd.print(" L    ");


  // Baris ke-3: Teks bergantian

  lcd.setCursor(0, 3);

  switch (modeTeks) {

    case 0:

      lcd.print("WiFi CONNECTED     ");

      break;

    case 1:

      lcd.print("Teknologi by Putu  ");

      break;

    case 2:

      lcd.print("Tandon Air Otomatis");

      break;

  }


  // Ganti mode teks

  modeTeks = (modeTeks + 1) % 3;

}


// ---------------- Ambil Data dari Master ----------------

void ambilData(){

  if(WiFi.status() == WL_CONNECTED){

    HTTPClient http;

    http.setTimeout(3000); // 3 detik

    String url = "http://" + ipMaster + "/data";

    http.begin(url);

    int code = http.GET();

    if(code == 200){

      String res = http.getString(); // Format: persen,liter

      int koma = res.indexOf(',');

      if(koma > 0){

        persenAir = res.substring(0, koma);

        literAir = res.substring(koma+1);

      }

    } else {

      persenAir = "--";

      literAir = "--";

    }

    http.end();

  } else {

    persenAir = "--";

    literAir = "--";

  }

}


// ---------------- Setup dan Loop ----------------

void setup(){

  Serial.begin(115200);

  lcd.init(); lcd.backlight();


  prefs.begin("disp", false);

  setupWiFi();


  server.on("/", handleRoot);

  server.on("/wifi", handleWiFiConfig);

  server.begin();

}


void loop(){

  ambilData();

  tampilLCD();

  server.handleClient();

  delay(5000);  // Ambil data & ganti teks setiap 5 detik

}


No comments:

Post a Comment

Tandon Air Otomatis (ESP32 Master & Display) + Kode Lengkap

  Panduan Lengkap Tandon Air Otomatis (ESP32 Master & Display) + Kode Lengkap Diperbarui: 09 August 2025 Artikel ini memandu Anda memban...