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.

Cara Memecah Kode Arduino Menjadi Beberapa File

Jika kamu pernah mengembangkan proyek Arduino atau ESP, kamu mungkin sering menghadapi kode yang semakin panjang dan sulit dibaca. Salah satu cara terbaik untuk mengelola proyek dengan lebih baik adalah menggunakan modular programming, yaitu memisahkan kode ke beberapa file.

Dalam artikel ini, kita akan membahas bagaimana cara membuat kode terstruktur untuk menyalakan LED menggunakan Arduino, dengan pendekatan modular coding.

Mengapa Modular Programming?

Membuat kode lebih rapi – Dengan memisahkan kode menjadi beberapa file, setiap bagian dari program menjadi lebih jelas dan mudah dimengerti.
Memudahkan penggunaan ulang – Kamu dapat menggunakan kembali modul tanpa harus menulis ulang seluruh kode.
Mempermudah debugging – Jika terjadi kesalahan, kamu bisa lebih mudah menemukannya tanpa harus mencari di file yang panjang.

Struktur Proyek Arduino dengan Modular Coding

Sebelum mulai coding, kita buat struktur folder seperti ini:

/modular_led
│── modular_led.ino   → Kode utama
│── led.h             → Header LED
│── led.cpp           → Implementasi LED

Di sini, kita akan membuat tiga file utama:

  1. led.h → Deklarasi fungsi dan kelas untuk kontrol LED.
  2. led.cpp → Implementasi fungsi LED.
  3. main.ino → Kode utama yang mengontrol bagaimana LED bekerja.

Membuat Modul LED

1. File led.h (Header untuk LED)

File led.h berisi deklarasi kelas dan fungsi yang kita gunakan:

#ifndef LED_H
#define LED_H

#include <Arduino.h>

class LED {
public:
    LED(int pin);  // Konstruktor
    void begin();  // Inisialisasi LED
    void turnOn(); // Menyalakan LED
    void turnOff(); // Mematikan LED

private:
    int ledPin; // Menyimpan pin LED
};

#endif

Menggunakan kelas LED untuk mengelola fungsi LED dengan lebih efisien.
Menentukan metode begin() untuk inisialisasi, turnOn() untuk menyalakan, dan turnOff() untuk mematikan LED.

2. File led.cpp (Implementasi LED)

Berisi kode implementasi untuk setiap fungsi yang ada di led.h:

#include "led.h"

LED::LED(int pin) {
    ledPin = pin;
}

void LED::begin() {
    pinMode(ledPin, OUTPUT);
}

void LED::turnOn() {
    digitalWrite(ledPin, HIGH);
}

void LED::turnOff() {
    digitalWrite(ledPin, LOW);
}

Fungsi begin() mengatur pin sebagai output, sehingga LED bisa dikontrol.
Metode turnOn() dan turnOff() mengontrol status LED secara langsung.

3. File modular_led.ino (Kode Utama)

Terakhir, kita tuliskan kode utama yang akan menjalankan program:

#include "led.h"

LED led(13);  // Gunakan pin 13 untuk LED

void setup() {
    led.begin();
}

void loop() {
    led.turnOn();
    delay(1000);
    led.turnOff();
    delay(1000);
}

Memanggil kelas LED dengan LED led(13); untuk mengontrol LED di pin 13.
Menyalakan dan mematikan LED setiap 1 detik dengan delay(1000);.

Cara Menjalankan Kode

  1. Pastikan semua file (led.h, led.cpp, maodular_led.ino) berada dalam folder yang sama.
  2. Buka modular_led.ino di Arduino IDE atau PlatformIO.
  3. Upload ke board Arduino, dan lihat LED berkedip setiap 1 detik.

Kesimpulan

✔ Modular programming membantu membuat kode lebih terstruktur, mudah dibaca, dan mudah digunakan kembali.
✔ Dengan memisahkan fungsi LED ke dalam kelas dan file terpisah, program menjadi lebih rapi dan efisien.
✔ Teknik ini bisa digunakan untuk proyek yang lebih kompleks, seperti sensor, komunikasi serial, atau sistem berbasis IoT.

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!