Menampilkan Halaman HTML dari File Terpisah di ESP8266/ESP32

Dalam proyek ESP8266 Web Server, sering kali kita perlu menampilkan halaman web dengan HTML, CSS, dan JavaScript agar tampilannya lebih menarik dan interaktif. Alih-alih menulis kode HTML langsung di dalam kode Arduino, kita bisa menyimpan file terpisah menggunakan SPIFFS (SPI Flash File System) atau LittleFS. Dengan cara ini, struktur proyek menjadi lebih rapi dan modular.

Pada blog ini, kita akan membahas:

Mengapa menyimpan HTML di file terpisah lebih baik?
Cara menyimpan dan menampilkan file HTML dari ESP
Kode contoh untuk membaca file HTML dari SPIFFS/LittleFS

Mengapa Menyimpan HTML di File Terpisah?

Memudahkan pengeditan – Kamu bisa mengubah tampilan tanpa perlu memodifikasi kode firmware.
Menghemat memori program – HTML disimpan di SPIFFS/LittleFS, bukan di flash yang digunakan oleh program utama.
Lebih rapi dan modular – Bisa memisahkan file CSS, JavaScript, dan HTML seperti dalam aplikasi web normal.

Struktur File Proyek

Sebelum mulai coding, kita buat struktur folder seperti ini:

/ESP8266_WebServer
│── data/                → Folder untuk menyimpan file web
│   ├── index.html       → Halaman utama
│   ├── style.css        → Styling halaman
│   ├── script.js        → JavaScript untuk interaksi
│── ESP8266_WebServer.ino → Kode utama untuk ESP8266

Folder data/ akan digunakan oleh SPIFFS atau LittleFS untuk menyimpan file HTML.

Kode ESP8266/ESP32 untuk Membaca HTML dari SPIFFS/LittleFS

#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>

const char* ssid = "SSID";
const char* password = "PASSWORD";
AsyncWebServer server(80);

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) delay(500);

    SPIFFS.begin();
    
    // Menyajikan file HTML, CSS, dan JS dari SPIFFS
    server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
        request->send(SPIFFS, "/index.html", "text/html");
    });
    server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request) {
        request->send(SPIFFS, "/style.css", "text/css");
    });
    server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request) {
        request->send(SPIFFS, "/script.js", "application/javascript");
    });

    server.begin();
}

void loop() {}

Upload File ke SPIFFS

  1. Buka Arduino IDE
  2. Instal plugin “ESP8266/ESP32 SPIFFS uploader”
  3. Buka “Tools > ESP8266 Sketch Data Upload”
  4. File HTML, CSS, dan JS akan diunggah ke SPIFFS!

Kesimpulan

✔ Menggunakan SPIFFS atau LittleFS memungkinkan penyimpanan file HTML secara terpisah di ESP.
✔ Metode ini mempermudah pengeditan dan menghemat memori program utama.
✔ Dapat dikembangkan lebih lanjut dengan AJAX atau WebSocket untuk membuat tampilan lebih dinamis.

Pengalaman Membaca PZEM-017 dengan ESP WeMos D1 Mini

Sebagai seseorang yang sedang belajar mendalami teknologi IoT dan integrasi sensor, saya menghadapi berbagai tantangan saat mencoba membaca data dari PZEM-017 menggunakan ESP8266 WeMos D1 Mini. Meskipun awalnya tampak seperti proses sederhana, ternyata ada berbagai hambatan teknis yang perlu diatasi. Berikut adalah perjalanan saya dalam menyelesaikan masalah yang muncul hingga akhirnya sistem berjalan dengan stabil.

1. Kendala Awal: Label PCB dalam Bahasa Mandarin

Saat pertama kali menerima modul PZEM-017, saya dihadapkan pada tantangan yang tidak terduga—label pada PCB menggunakan Bahasa Mandarin.

Hal ini tentu menyulitkan dalam menentukan koneksi yang benar. Saya kemudian mencari referensi dari berbagai sumber, membandingkan dengan modul serupa, dan melakukan verifikasi menggunakan multimeter untuk memastikan koneksi TX, RX, VCC, dan GND sudah sesuai.

Bagi yang mengalami kendala serupa, saya menyarankan untuk mencari diagram koneksi atau datasheet resmi agar mendapatkan kejelasan mengenai pengkabelan.

2. LED TX & RX Tidak Menyala: Masalah pada Kabel Jumper

Setelah memahami koneksi, saya segera melakukan penyambungan dan menyalakan sistem. Namun, LED TX dan RX tidak menyala sama sekali.

Awalnya saya menduga adanya kesalahan konfigurasi atau kerusakan pada modul RS485 to TTL, tetapi setelah melakukan pengecekan menyeluruh, ternyata penyebabnya adalah kabel jumper dengan kualitas kurang baik. Padahal, kabel yang sama telah digunakan untuk eksperimen lain tanpa kendala.

Solusi yang saya temukan cukup sederhana—mengganti kabel jumper dengan kualitas lebih baik dan memastikan koneksi benar-benar kuat. Setelah perbaikan tersebut, LED TX dan RX akhirnya dapat berfungsi dengan normal.

3. Data Terbaca di Serial Monitor, tetapi Tidak Stabil

Setelah berhasil membaca data tegangan, arus, daya, dan energi melalui Serial Monitor, saya mendapati bahwa pembacaan kadang terbaca dengan baik, namun kadang terjadi error tanpa alasan jelas.

Awalnya saya mengira masalah ini berkaitan dengan kode atau pengaturan baud rate, namun setelah berbagai percobaan, saya mencoba mengganti power supply dari 3V ke 5V—dan hasilnya pembacaan menjadi stabil tanpa error.

Kesimpulan dari permasalahan ini adalah bahwa tegangan suplai harus cukup agar komunikasi antara perangkat dapat berjalan dengan baik.

4. LED TX Menyala Terus tetapi Redup: Masalah Grounding

Setelah sistem berjalan dalam beberapa waktu, muncul tantangan baru—LED TX tidak lagi berkedip sesuai sinyal, melainkan menyala terus dalam kondisi redup.

Ketika saya memeriksa Serial Monitor, ternyata terjadi error lagi. Setelah melakukan analisis, saya menemukan penyebab utama masalah ini: ground dari ESP8266 dan RS485 converter tidak terhubung dengan baik.

Setelah menghubungkan ground ESP ke ground RS485, sistem kembali berfungsi secara normal, dan pembacaan data tidak mengalami gangguan lagi.

5. Pengujian Stabilitas: Berjalan Tanpa Masalah Setelah Ditinggalkan Semalaman

Setelah menyelesaikan seluruh troubleshooting, saya memutuskan untuk membiarkan sistem menyala semalaman guna memastikan kestabilannya. Keesokan harinya, saya memeriksa kembali dan sistem berjalan dengan sempurna tanpa kendala.

Dari pengalaman ini, saya dapat menyimpulkan beberapa hal penting:
Pastikan koneksi perangkat sesuai dengan diagram yang benar, terutama jika terdapat label asing pada PCB.
Gunakan kabel jumper dengan kualitas baik, karena koneksi yang buruk bisa menghambat komunikasi data.
Power supply yang cukup sangat krusial, terutama untuk perangkat komunikasi seperti RS485.
Pastikan ground terhubung dengan baik untuk menghindari gangguan sinyal dan komunikasi.

Pengalaman ini menunjukkan bahwa trial & error adalah bagian penting dalam eksplorasi teknologi, dan setiap tantangan dapat diselesaikan dengan pendekatan yang sistematis. Semoga pengalaman ini dapat membantu bagi siapa pun yang menghadapi kendala serupa!

Menghubungkan Node-RED dengan Blynk

Seharian penuh saya mengikuti dokumentasi cara menghubungkan Node-RED dengan Blynk, tetapi tidak membuahkan hasil. Disitu dijelaskan beberapa garis besar tahapnya, yaitu menyiapkan template di Blynk, Install Node-RED, Konfigurasi MQTT Broker, Buat Node-RED flow, Jalankan.

Dari sekian langkah diatas, saya terganjal di Konfigurasi MQTT Broker. Diutak-atik tetep statusnya connecting alias tidak berhail connect dengan Blynk. Padahal semua langkah sudah saya ikuti. Kemudian saya berhenti menggunakan cara ini dan mulai berfikir untuk menggunakan cara lain.

Cara yang lain yaitu pakai add-on, plugin, atau di Node-RED disebutnya pallet. Saya coba install ternyata ada kendala juga. Jadi, Node-RED saya ini diinstall di containernya docker. Dan menurut beberapa info, error ini disebabkan oleh problem DNS. Saya coba masuk ke container dan coba ping ke domain google memang tidak bisa tetapi kalau ping alamat IP di internet bisa.

Saya cari cara untuk setting DNS di docker container dan menemukan cara setting pakai docker compose. Dengan kata lain, saya perlu membuat ulang containernya dengan cara docker compose down kemudian nyalakan lagi dengan docker compose up. Cara ini beresiko hilangnya data, dan benar saja, data influxdb hilang, dan memang container influxdb ini dulu seingat saya masih ada masalah dengan persisten data nya. Singkat cerita akhirnya berhasil setting DNS dengan cara ini sekaligus perbaiki persisten data untuk influxdb juga di docker compose.

Saya pakai node-red-contrib-blynk-iot dan alhamdulillah berhasil connect atau tersambung dengan Blynk cloud. Selanjutnya tinggal setting di sisi Blynk untuk menerima data dan menampilkannya di dalam dashboard web dan mobile.