Proyek IoT: Membangun Sistem Pencatatan Data Sederhana Menggunakan ESP32 dan Google Spreadsheet

Dalam artikel ini, kita akan membahas cara membuat sistem pencatatan data (data logging) sederhana yang mengirimkan data sensor dari mikrokontroler ESP8266 atau ESP32 ke Google Spreadsheet.

Konsep Dasar:

Mikrokontroler (ESP32) akan terhubung ke jaringan WiFi, membaca data (dalam contoh ini kita akan menggunakan data acak/random), memformat data tersebut ke dalam format JSON, dan mengirimkannya ke URL khusus (WebApp) yang kita buat menggunakan Google Apps Script melalui metode HTTP POST. Apps Script kemudian akan menerima data ini dan menuliskannya ke baris baru di Google Spreadsheet yang telah kita tentukan.

Kebutuhan:

  1. Hardware:
    • Mikrokontroler ESP32 (atau ESP8266 dengan penyesuaian).
    • Kabel USB untuk memprogram dan memberi daya ESP32.
    • Komputer/Laptop.
  2. Software:
    • Arduino IDE terinstal dengan dukungan board ESP32. (Jika belum, install melalui Board Manager).
    • Library Arduino: WiFi, ArduinoJsonEspHttpClient.
    • Akun Google.
    • WiFi yang memiliki koneksi Internet.

Langkah 1: Persiapan Google Spreadsheet

  1. Login ke Akun Google Anda.
  2. Buat Google Spreadsheet baru atau gunakan yang sudah ada.
  3. Catat ID Spreadsheet - ID ini terdapat pada URL spreadsheet, antara "d/" dan "/edit". Contoh: https://docs.google.com/spreadsheets/d/1ji4cOXncR7B0vY7zmgS6pWs_QWInUoJJlCmhbyCNtpI/edit, maka ID-nya adalah 1ji4cOXncR7B0vY7zmgS6pWs_QWInUoJJlCmhbyCNtpI.

Langkah 2: Membuat Program di Google Apps Script

  1. Buka Google Spreadsheet yang telah dibuat.
  2. Buka Menu Ekstensi, lalu pilih Apps Script.
  3. Salin dan Tempel Kode berikut ke editor:
  4. C++
    var SpreadSheetID = "YOUR_SPREADSHEET_ID"; //  Mendefinisikan variabel untuk menyimpan ID dari spreadsheet Google yang akan digunakan
    
    var sheet = SpreadsheetApp.openById(SpreadSheetID).getActiveSheet(); //  Membuka spreadsheet dengan ID yang telah ditentukan dan mengakses sheet aktif
    
    function initializeSheet() { //  Mendefinisikan fungsi untuk menginisialisasi spreadsheet
        if (sheet.getLastRow() === 0) { //  Memeriksa apakah spreadsheet kosong (tidak memiliki baris data)
            sheet.appendRow(["Timestamp", //  Jika spreadsheet kosong, menambahkan baris header dengan nama kolom
                "Sensor 1",
                "Sensor 2",
                "Sensor 3",
                "Sensor 4",
                "Sensor 5",
                "Sensor 6",
                "Sensor 7",
                "Sensor 8"]);
        }
    }
    
    function doPost(e) { //  Mendefinisikan fungsi yang akan dijalankan ketika ada request POST ke web app
        try { //  Memulai blok try-catch untuk menangani error yang mungkin terjadi
            initializeSheet(); //  Memanggil fungsi initializeSheet untuk memastikan spreadsheet sudah memiliki header
            var data = JSON.parse(e.postData.contents); //  Mengubah data JSON yang diterima menjadi objek JavaScript
            var values = [ //  Membuat array untuk menyimpan nilai yang akan ditambahkan ke spreadsheet
                new Date(), //  Menambahkan timestamp saat ini
                data.sensor1, //  Mengambil nilai sensor1 dari data yang diterima
                data.sensor2, //  Mengambil nilai sensor2 dari data yang diterima
                data.sensor3, //  Mengambil nilai sensor3 dari data yang diterima
                data.sensor4, //  Mengambil nilai sensor4 dari data yang diterima
                data.sensor5, //  Mengambil nilai sensor5 dari data yang diterima
                data.sensor6, //  Mengambil nilai sensor6 dari data yang diterima
                data.sensor7, //  Mengambil nilai sensor7 dari data yang diterima
                data.sensor8 //  Mengambil nilai sensor8 dari data yang diterima
            ];
            sheet.appendRow(values); //  Menambahkan baris baru dengan nilai sensor ke spreadsheet
    
            return ContentService.createTextOutput(JSON.stringify({ //  Mengembalikan respons JSON sukses
                status: "success",
                message: "Data logged successfully"
            })).setMimeType(ContentService.MimeType.JSON); //  Mengatur MIME type respons sebagai JSON
        } catch (error) { //  Menangkap error yang mungkin terjadi
            return ContentService.createTextOutput(JSON.stringify({ //  Mengembalikan respons JSON error
                status: "error",
                message: error.toString() //  Mengkonversi error menjadi string untuk ditampilkan
            })).setMimeType(ContentService.MimeType.JSON); //  Mengatur MIME type respons sebagai JSON
        }
    }
      
  5. Ganti YOUR_SPREADSHEET_ID dengan ID spreadsheet yang telah dicatat sebelumnya.
  6. Simpan project dengan nama yang diinginkan, misalnya "ESP Data Logger".

Langkah 3: Deploy Kode sebagai Web App

  1. Klik tombol Deploy (atau "Terapkan" jika dalam bahasa Indonesia).
  2. Pilih "New deployment" (atau "Deployment baru").
  3. Pilih jenis: "Web app" (atau "Aplikasi Web").
  4. Isi deskripsi (opsional).
  5. Untuk akses, pilih:
    • Execute as: "Me" (atau "Saya")
    • Who has access: "Anyone" (atau "Siapa saja")
  6. Klik "Deploy" (atau "Terapkan").
  7. Berikan Izin Akses:
    • Klik "Authorize access" (atau "Izinkan Akses").
    • Pilih akun Google Anda.
    • Jika muncul peringatan, klik "Advanced" (atau "Lanjutan"), lalu "Go to project (untitled)" (atau "Ke proyek tanpa judul").
    • Klik "Allow" (atau "Izinkan").
  8. Salin Web App URL yang muncul. URL ini akan digunakan dalam kode mikrokontroler.
  9. Deploy ulang minimal dua kali untuk memastikan URL dapat diakses oleh mikrokontroler.

Langkah 4: Implementasi pada Mikrokontroler

  1. Buka Arduino IDE
  2. Instal Library yang diperlukan:
    • ArduinoJson
    • Library HTTP Client untuk ESP (dalam contoh kode menggunakan "EspHttpClient")
  3. Salin dan Tempel Kode berikut:
  4. C++
    #include <Arduino.h>     //  Mengimpor library dasar Arduino untuk fungsi-fungsi dasar
    #include <WiFi.h>        //  Mengimpor library WiFi untuk koneksi jaringan
    #include <ArduinoJson.h> //  Mengimpor library ArduinoJson untuk membuat dan mengolah data JSON
    #include "EspHttpClient.h"        //  Mengimpor library kustom EspHttpClient untuk melakukan request HTTP
    
    const char *ssid = "NAMA_WIFI_ANDA";         //  Mendefinisikan nama jaringan WiFi yang akan dihubungkan
    const char *password = "PASSWORD_WIFI_ANDA"; //  Mendefinisikan password WiFi yang akan dihubungkan
    const char *scriptID = "SCRIPT_ID_ANDA";     //  Mendefinisikan ID Google Script yang akan dipanggil
    
    EspHttpClient httpClient; //  Membuat objek httpClient dari class EspHttpClient untuk melakukan request HTTP
    
    void setup()
    {                       //  Mendefinisikan fungsi setup yang akan dijalankan sekali saat ESP pertama kali dinyalakan
        Serial.begin(9600); //  Memulai komunikasi serial dengan kecepatan 9600 baud
    
        // Hubungkan ke WiFi
        WiFi.begin(ssid, password);            //  Memulai koneksi WiFi dengan SSID dan password yang telah didefinisikan
        Serial.print("Menghubungkan ke WiFi"); //  Menampilkan pesan ke Serial Monitor bahwa ESP sedang mencoba terhubung ke WiFi
    
        while (WiFi.status() != WL_CONNECTED)
        {                      //  Melakukan loop selama ESP belum terhubung ke WiFi
            delay(500);        //  Menunggu selama 500 milidetik
            Serial.print("."); //  Menampilkan titik sebagai indikator proses koneksi WiFi
        }
    
        Serial.println(""); //  Mencetak baris baru setelah berhasil terhubung ke WiFi
    }
    
    void loop()
    {                        //  Mendefinisikan fungsi loop yang akan dijalankan berulang-ulang
        String dataGet = ""; //  Membuat string kosong untuk parameter GET (tidak digunakan dalam kode ini)
        StaticJsonDocument <200>
        jsonDoc;                                           //  Membuat dokumen JSON dengan alokasi memori 200 bytes
        jsonDoc["sensor1"] = random(10, 100);              //  Mengisi data sensor1 dengan nilai acak antara 10 sampai 99
        jsonDoc["sensor2"] = random(10, 100);              //  Mengisi data sensor2 dengan nilai acak antara 10 sampai 99
        jsonDoc["sensor3"] = random(10, 100);              //  Mengisi data sensor3 dengan nilai acak antara 10 sampai 99
        jsonDoc["sensor4"] = random(10, 100);              //  Mengisi data sensor4 dengan nilai acak antara 10 sampai 99
        jsonDoc["sensor5"] = random(10, 100);              //  Mengisi data sensor5 dengan nilai acak antara 10 sampai 99
        jsonDoc["sensor6"] = random(10, 100);              //  Mengisi data sensor6 dengan nilai acak antara 10 sampai 99
        jsonDoc["sensor7"] = random(10, 100);              //  Mengisi data sensor7 dengan nilai acak antara 10 sampai 99
        jsonDoc["sensor8"] = random(10, 100);              //  Mengisi data sensor8 dengan nilai acak antara 10 sampai 99
        String dataPost;                                   //  Membuat string untuk menyimpan data JSON yang akan dikirim melalui POST
        serializeJson(jsonDoc, dataPost);                  //  Mengubah objek JSON menjadi string dan menyimpannya ke dataPost
        Serial.println("Mengirim data Get: " + dataPost);  //  Menampilkan data yang akan dikirim melalui GET (meskipun tidak digunakan)
        Serial.println("Mengirim data Post: " + dataPost); //  Menampilkan data yang akan dikirim melalui POST
    
        Serial.println("Melakukan permintaan HTTPS redirect GET dan POST...");                        //  Menampilkan pesan bahwa ESP akan melakukan request HTTPS
        String link = (String) "https://script.google.com/macros/s/" + scriptID + "/exec?" + dataGet; //  Membuat URL lengkap untuk Google Script
        String response = httpClient.post(link.c_str(), dataPost.c_str());                            //  Melakukan POST request ke URL dan menyimpan respons
        Serial.println(response);                                                                     //  Menampilkan respons dari server
    
        delay(60000); //  Menunggu selama 60000 milidetik (1 menit) sebelum melakukan request berikutnya
    }
      
  5. Konfigurasi Kode:
    • Ganti NAMA_WIFI_ANDA dengan nama WiFi yang akan digunakan.
    • Ganti PASSWORD_WIFI_ANDA dengan password WiFi.
    • Ganti SCRIPT_ID_ANDA dengan ID script dari Web App URL yang didapatkan (bagian terakhir dari URL setelah /macros/s/).
    • Jika menggunakan ESP8266, sesuaikan include untuk WiFi (#include <ESP8266WiFi.h>).
  6. Verifikasi dan Upload kode ke mikrokontroler.

Langkah 5: Pengujian Sistem

  1. Buka Serial Monitor Arduino IDE untuk melihat output dan debug.
  2. Periksa Google Spreadsheet untuk memastikan data diterima dan dicatat dengan benar.
  3. Tunggu beberapa menit dan verifikasi bahwa data baru ditambahkan setiap menit.

Penjelasan Kode

Penjelasan Kode Apps Script

  1. Inisialisasi Spreadsheet:
  2. javascript
    var sheet = SpreadsheetApp.openById("YOUR_SPREADSHEET_ID").getActiveSheet();
      
    Kode ini membuka spreadsheet berdasarkan ID dan mengakses lembar kerja aktif.
  3. Fungsi initializeSheet():
    javascript
    function initializeSheet() {
      if (sheet.getLastRow() === 0) {
        sheet.appendRow(["Timestamp", "Sensor 1", "Sensor 2", ...]);
      }
    }
      
    Fungsi ini memeriksa apakah spreadsheet kosong. Jika kosong, sistem akan menambahkan baris header.
  4. Fungsi doPost(e):
    • Menerima data POST dari mikrokontroler
    • Mengurai data JSON dari body permintaan
    • Memasukkan data ke dalam spreadsheet bersama dengan timestamp
    • Mengembalikan respons JSON untuk konfirmasi

Penjelasan Kode Arduino/ESP

  1. Inisialisasi WiFi dan Serial:
    C++
    WiFi.begin(ssid, password);
    Serial.begin(9600);
      
    Kode ini menginisialisasi koneksi WiFi dan komunikasi serial untuk debugging.
  2. Pembuatan Data JSON:
    C++
    StaticJsonDocument<200> jsonDoc;
    jsonDoc["sensor1"] = random(10, 100);
      
    Membuat dokumen JSON dengan data sensor (dalam contoh ini menggunakan nilai acak).
  3. Mengirim Data ke Google Spreadsheet:
    C++
    String link = "https://script.google.com/macros/s/" + scriptID + "/exec?" + dataGet;
      String response = httpClient.post(link.c_str(), dataPost.c_str());
      
    Mengirimkan data JSON melalui HTTP POST ke URL Apps Script.
  4. Penanganan Respons:
    C++
    Serial.println("Respons dari server: " + response);
      
    Menampilkan respons dari server untuk keperluan debugging.

Kesimpulan

Sistem pencatatan data ini merupakan solusi sederhana namun efektif untuk mengirimkan data sensor dari perangkat IoT ke Google Spreadsheet. Metode ini dapat digunakan untuk berbagai aplikasi seperti pemantauan lingkungan, pencatatan energi, atau proyek IoT lainnya yang memerlukan pencatatan data jangka panjang.

Anda dapat menyesuaikan kode dan sistem sesuai dengan kebutuhan proyek Anda, seperti menambahkan sensor yang berbeda, mengubah interval pengiriman data, atau meningkatkan fitur keamanan.

Komentar

Postingan populer dari blog ini

Ekspos Server Lokal ke Internet dengan Cloudflare Tunneling