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:
- Hardware:
- Mikrokontroler ESP32 (atau ESP8266 dengan penyesuaian).
- Kabel USB untuk memprogram dan memberi daya ESP32.
- Komputer/Laptop.
- Software:
- Arduino IDE terinstal dengan dukungan board ESP32. (Jika belum, install melalui Board Manager).
- Library Arduino:
WiFi,ArduinoJson.EspHttpClient. - Akun Google.
- WiFi yang memiliki koneksi Internet.
Langkah 1: Persiapan Google Spreadsheet
- Login ke Akun Google Anda.
- Buat Google Spreadsheet baru atau gunakan yang sudah ada.
- 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 adalah1ji4cOXncR7B0vY7zmgS6pWs_QWInUoJJlCmhbyCNtpI.
Langkah 2: Membuat Program di Google Apps Script
- Buka Google Spreadsheet yang telah dibuat.
- Buka Menu Ekstensi, lalu pilih Apps Script.
- Salin dan Tempel Kode berikut ke editor:
- Ganti
YOUR_SPREADSHEET_IDdengan ID spreadsheet yang telah dicatat sebelumnya. - Simpan project dengan nama yang diinginkan, misalnya "ESP Data Logger".
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
}
}
Langkah 3: Deploy Kode sebagai Web App
- Klik tombol Deploy (atau "Terapkan" jika dalam bahasa Indonesia).
- Pilih "New deployment" (atau "Deployment baru").
- Pilih jenis: "Web app" (atau "Aplikasi Web").
- Isi deskripsi (opsional).
- Untuk akses, pilih:
- Execute as: "Me" (atau "Saya")
- Who has access: "Anyone" (atau "Siapa saja")
- Klik "Deploy" (atau "Terapkan").
- 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").
- Salin Web App URL yang muncul. URL ini akan digunakan dalam kode mikrokontroler.
- Deploy ulang minimal dua kali untuk memastikan URL dapat diakses oleh mikrokontroler.
Langkah 4: Implementasi pada Mikrokontroler
- Buka Arduino IDE
- Instal Library yang diperlukan:
- ArduinoJson
- Library HTTP Client untuk ESP (dalam contoh kode menggunakan "EspHttpClient")
- Salin dan Tempel Kode berikut:
- Konfigurasi Kode:
- Ganti
NAMA_WIFI_ANDAdengan nama WiFi yang akan digunakan. - Ganti
PASSWORD_WIFI_ANDAdengan password WiFi. - Ganti
SCRIPT_ID_ANDAdengan 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>).
- Ganti
- Verifikasi dan Upload kode ke mikrokontroler.
#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
}
Langkah 5: Pengujian Sistem
- Buka Serial Monitor Arduino IDE untuk melihat output dan debug.
- Periksa Google Spreadsheet untuk memastikan data diterima dan dicatat dengan benar.
- Tunggu beberapa menit dan verifikasi
bahwa data baru ditambahkan setiap menit.
Penjelasan Kode
Penjelasan Kode Apps Script
- Inisialisasi Spreadsheet:
- Fungsi
initializeSheet():
Fungsi ini memeriksa apakah spreadsheet kosong. Jika kosong, sistem akan menambahkan baris header.javascriptfunction initializeSheet() { if (sheet.getLastRow() === 0) { sheet.appendRow(["Timestamp", "Sensor 1", "Sensor 2", ...]); } } - 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
var sheet = SpreadsheetApp.openById("YOUR_SPREADSHEET_ID").getActiveSheet();
Penjelasan Kode Arduino/ESP
- Inisialisasi WiFi dan Serial:
Kode ini menginisialisasi koneksi WiFi dan komunikasi serial untuk debugging.C++
WiFi.begin(ssid, password); Serial.begin(9600); - Pembuatan Data JSON:
Membuat dokumen JSON dengan data sensor (dalam contoh ini menggunakan nilai acak).C++
StaticJsonDocument<200> jsonDoc; jsonDoc["sensor1"] = random(10, 100); - Mengirim Data ke Google
Spreadsheet:
Mengirimkan data JSON melalui HTTP POST ke URL Apps Script.C++
String link = "https://script.google.com/macros/s/" + scriptID + "/exec?" + dataGet; String response = httpClient.post(link.c_str(), dataPost.c_str()); - Penanganan Respons:
Menampilkan respons dari server untuk keperluan debugging.C++
Serial.println("Respons dari server: " + response);
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
Posting Komentar