Sky is The Limit — Laporan Cuaca
10 tahun yang lalu akan sangat susah untuk membuat Things yang berbau internet seperti di artikel ini dan hanya terbatas pada orang-orang dengan skill tertentu tapi sekarang dengan banyaknya resource dan layanan online yang murah bahkan free, sesuatu yang sulit untuk diwujudkan sebelumnya menjadi sangat mudah untuk dilakukan.

Prinsip Kerja
Jadi prinsip kerja dari alat ini sebenarnya sangat sederhana yaitu host dalam hal ini yaitu Laptop sebagai server akan mengambil data dari openwearthemap.org dan data-data tersebut akan dikirimkan ke Arduino melalui port serial dan protokol yang dipakai untuk mengirimkan data dari host ke Arduino yaitu protokol Firmata.
Protokol ini termasuk dalam kategori protokol binary. Protokol ini mendukung pengontrolan dalam level pin board jadi anda bisa langsung mengontrol tiap pin-pin yang ada pada board secara digital ataupun analog atau anda bisa juga memakai mode serial. Untuk lebih lengkapnya lihat dokumentasi implementasi Firmata di Arduino atau lihat link berikut jika anda menginginkan lebih detil tentang penjelasan protokol Firmata.
Ambil Data Cuaca
Data-data cuaca diambil dari layanan openweathermap.org

Untuk versi gratis cukuplah untuk keperluan kelengkapan rancang bangun aplikasi IoT sederhana ini. API yang akan kita gunakan adalah
http://api.openweathermap.org/data/2.5/weather?q={city name},{country code}
Di platform Node.js untuk mengambil data ini sangatlah mudah apalagi dengan bantuan modul request.
request.get(defCity, (err, resp, body) => {
if (!err) {
let ralcuaca = JSON.parse(body)
let tempC = ralcuaca.main.temp — 273.15
let city = ralcuaca.name
let weather = ralcuaca.weather[0].main
let cloudPercent = ralcuaca.clouds.all let d = `${city},Suhu ${tempC}C,${weather},${cloudPercent}%`
setTimeout(() => {
board.sendString(d)
}, 1000)
} else {
board.sendString(‘ERR’)
}
})
Modul request akan mengambil data dari URL defCity kemudian akan di filter beberapa data penting yang dihasilkan dan data-data tersebut akan dikirimkan ke board Arduino. Sebagai contoh URL defCity untuk kota Batu
let defCity = `http://api.openweathermap.org/data/2.5/weather?q=batu,id&appid=${APP_KEY}`
APP_KEY merupakan API Key dari openweathermap.org jadi anda harus registrasi dahulu untuk memakai layanan mereka. APP_KEY ini bisa di simpan di variabel environment ataupun hardcode di file (meskipun tidak disarankan kalau misalnya anda upload source code ke Github). Untuk lebih lengkapnya lihat dokumentasi dari API weather ini.
Firmata JavaScript
Board.requestPort((error, port) => {
if (error) {
console.log(error)
} else {
let board = new Board(port.comName)
//request.get(defCity, () => {}) board.on(‘string’, (data) => {
console.log(data)
}) board.on(‘error’, (err) => {
console.log(err)
})
}
})
Untuk koneksi melalui serial port, Firmata JavaScript menyediakan fungsi requestPort() yang secara otomatis akan mendeteksi port Arduino di USB sehingga anda tidak perlu menuliskan /dev/ttyACM0 lagi
Peringatan: Kode diatas hanya untuk satu device Arduino yang terkoneksi ke komputer
Data-data yang dikirimkan ke Arduino adalah nama kota city, temperatur tempC, kondisi cuaca weather dan persentase awan cloudPercent.
board.sendString(`${city},Suhu ${tempC}C,${weather} ${cloudPercent}%`)
Data yang dikirimkan berupa string yang dipisahkan dengan koma. Kenapa begitu? Penjelasan ada dibawah ini
Sketch Arduino
Kita ambil contoh kode Firmata pada Arduino sebagai template File -> Examples -> Firmata -> EchoString dan mengubah fungsi stringCallback() seperti berikut
#include <Firmata.h>
#include <LCD4884.h>char *pch;
int i;void stringCallback(char *dat)
{
i = 0;
pch = strtok(dat, ",");
while(pch != NULL) {
lcd.LCD_write_string(0, i, pch, MENU_NORMAL);
i = i +2;
pch = strtok(NULL, ",");
delay(1000);
}
}void setup () {
Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);
Firmata.attach(STRING_DATA, stringCallback);
Firmata.begin(57600);
lcd.LCD_init();
lcd.LCD_clear();
}void loop () {
while (Firmata.available()) {
Firmata.processInput();
}
}
Data yang dikirimkan dari host ke board Arduino akan diterima oleh stringCallback(). Data akan ditampilkan di LCD perbaris dengan pemisah data adalah koma. Untuk memisahkan data string tersebut maka anda harus memecahnya. Caranya yaitu kita akan memakai fungsi bawaan C yaitu strtok() dan kemudian tiap string yang dipecah tersebut akan di tampilkan ke LCD4884. Untuk menampilkan data ke LCD anda cukup memakai fungsi berikut
lcd.LCD_write_string(x, y, data, MENU_NORMAL);
variabel x dan y menentukan posisi start untuk tampilan. Lihat disini lebih lanjut tentang LCD 4884.
Enhanced
Contoh diatas dapat anda kembangkan lebih lanjut misalnya dengan menambahkam Shield Bluetooth atau WiFi pada Arduino untuk update data melalui Android dan mengganti LCD dengan size yang lebih besar dan dengan dukungan grafik yang lebih baik.
Referensi
Weather API — http://openweathermap.org/current
Firmata Arduino — https://github.com/firmata/arduino
Firmata JavaScript — https://github.com/jgautier/firmata
strtok() — http://www.cplusplus.com/reference/cstring/strtok/
LCD4884 — http://goo.gl/hTBJ1o