A rduino merupakan board mikrokontroller yang banyak digunakan untuk membuat project-project elektronika yang menggunakan sensor-sensor dan atau aktuator. Sedangkan software untuk memprogram Arduino itu sendiri adalah Arduino IDE (Integrated Development Environment).
Di dalam Arduino IDE terdapat fitur serial monitor yang berguna untuk mengirim dan menerima data serial melalui USB port. Arduino bisa mengirimkan data ke komputer atau sebaliknya komputer juga bisa mengirimkan data ke Arduino.
Dalam tutorial ini, saya akan mengkomunikasikan Arduino sebagai server dan web browser sebagai client yang merequest data dari Arduino untuk divisualisasikan ke dalam grafik atau chart di halaman web. Metode komunikasi yang saya gunakan adalah Websocket menggunakan Socket.IO dan chart untuk visualisasi datanya menggunakan Chart.js. Semuanya dalam platform node.js.
Jadi, untuk mempraktikkan tutorial ini komputer kita harus sudah terinstall Arduino IDE dan Node.js. Proses instalasi kedua software tersebut sangatlah mudah tinggal Next Next aja kok hehe...
Dan sudah banyak orang baik di dunia maya yang menjelaskan cara instalasinya jadi enggak perlu saya jelasin di sini. Baiklah, langsung saja kita mulai praktik. Saya bagi menjadi 3 pokok bahasan, yaitu koding di Arduino IDE, Instalasi Package dan Koding di node.js.
1. Koding di Arduino IDE
Untuk menyederhanakan pembahasan, saya hanya akan mengirimkan data angka random dari Arduino ke komputer melalui perintah Serial.println(). Data angka random inilah yang nantinya akan saya visualisasikan ke dalam chart.
Berikut langkah-langkahnya:
-
Hubungkan Arduino Uno (boleh juga Mega, Nano atau arduino yang lainnya) ke komputer melalui port USB dan pastikan terbaca di device manager.
-
Buka Arduino IDE dan copy paste sketch program di bawah ini:
//this variable will hold a random number generated by the random() function long randomNumber; //Set up - this is where you get things "set-up". It will only run once void setup() { Serial.begin(9600); //Let's make it more random randomSeed(42); }//close setup void loop() { //generate a random number randomNumber = random(1,20); //display the random number on the serial monitor Serial.println(randomNumber); delay(5000); }
Save program kemudian upload.
-
Buka Serial Monitor, maka setiap 5 detik Arduino mengirimkan data angka random
2. Instalasi Package dari NPM
Pastikan node.js sudah terinstall di komputer. Di sini saya menggunakan sistem operasi Windows 10.
Buka command prompt kemudian ketik node -v
kemudian enter.
Jika node.js sudah terinstal maka akan tampil versi dari node.js yang terinstal seperti berikut:
Setelah node.js sudah dipastikan terinstal, selanjutnya saya akan menginstal package-package yang diperlukan di project ini yaitu: express, serialport dan socket.io.
Langkah-langkah instalasinya adalah sebagai berikut:
-
Buat project folder baru di direktori yang diinginkan, di tutorial ini saya akan buat folder baru "arduino_nodejs" di dalam direktori E:\triyonos\
-
Buka command prompt dan arahkan ke direktori E:\triyonos\arduino_nodejs yang baru saja dibuat
-
Inisialisasi project node.js melalui perintah
npm init
kemudian isikan informasi project sesuai kebutuhan seperti contoh berikut: -
Install express melalui perintah
npm install express --save
-
Install serialport melalui perintah
npm install serialport --save
-
Install socket.io melalui perintah
npm install socket.io --save
Setelah langkah-langkah instalasi di atas selesai dilakukan, maka di dalam folder arduino_nodejs akan terbentuk folder node_modules. Folder ini berisikan folder-folder package hasil instalasi ketiga package di atas.
Selain itu jika kita buka kembali file package.json maka kita akan melihat di object dependencies terdapat 3 object package yang sudah kita install beserta versinya.
{
"name": "arduino_nodejs",
"version": "1.0.0",
"description": "serial print arduino to chart node.js",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "erik",
"license": "ISC",
"dependencies": {
"express": "^4.17.2",
"serialport": "^9.2.8",
"socket.io": "^4.4.0"
}
}
3. Koding node.js
Buat folder baru "public" dan file baru "index.js" di dalam direktori E:\triyonos\arduino_nodejs\
Edit file index.js kemudian copy paste kode di bawah ini:
const express = require('express');
const app = express();
const server = app.listen(3000, '0.0.0.0', function() { //Start the server, listening on port 4000.
console.log("Listening to requests on port 3000 ...");
})
const io = require("socket.io")(server, {
allowEIO3: true // false by default
});
app.use(express.static('public')); //Send index.html page on GET /
const SerialPort = require('serialport');
const Readline = SerialPort.parsers.Readline;
const port = new SerialPort('COM8'); //Connect serial port to port COM8. Because my Arduino Board is connected on port COM8. See yours on Arduino IDE -> Tools -> Port
const parser = port.pipe(new Readline({delimiter: '\r\n'})); //Read the line only when new line comes.
parser.on('data', (temp) => { //Read data
console.log(temp);
var today = new Date();
var curmonth = parseInt(today.getMonth())+1;
io.sockets.emit('temp', {date: today.getDate()+"-"+curmonth+"-"+today.getFullYear(), time: (today.getHours())+":"+(today.getMinutes()), temp:temp}); //emit the datd i.e. {date, time, temp} to all the connected clients.
});
io.on('connection', (socket) => {
console.log("Someone connected."); //show a log as a new client connects.
})
Buat file baru "index.html" di dalam direktori E:\triyonos\arduino_nodejs\public
Edit file index.html kemudian copy paste kode di bawah ini:
<!DOCTYPE html>
<html>
<head>
<title>Serial Plot</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>Random Value Graph</h1>
<h4>Date: <span id="date"></span></h4>
<div class="chart-container" style="position: relative; width:75vw; margin: auto;">
<canvas id="myChart"></canvas>
</div>
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:3000'); //connect to server
var ctx = document.getElementById('myChart').getContext('2d');
var chart = new Chart(ctx, {
// The type of chart we want to create
type: 'line',
// The data for our dataset
data: {
labels: [],
datasets: [{
label: "Random Value",
borderColor: "#FF5733",
data: [],
fill: false,
pointStyle: 'circle',
backgroundColor: '#3498DB',
pointRadius: 5,
pointHoverRadius: 7,
lineTension: 0,
}]
},
// Configuration options go here
options: {}
});
socket.on('temp', function(data) { //As a temp data is received
console.log(data.temp);
document.getElementById('date').innerHTML = data.date; //update the date
if(chart.data.labels.length != 20) { //If we have less than 15 data points in the graph
chart.data.labels.push(data.time); //Add time in x-asix
chart.data.datasets.forEach((dataset) => {
dataset.data.push(data.temp); //Add temp in y-axis
});
}
else { //If there are already 15 data points in the graph.
chart.data.labels.shift(); //Remove first time data
chart.data.labels.push(data.time); //Insert latest time data
chart.data.datasets.forEach((dataset) => {
dataset.data.shift(); //Remove first temp data
dataset.data.push(data.temp); //Insert latest temp data
});
}
chart.update(); //Update the graph.
});
</script>
</body>
<style>
h1 {
text-align: center;
font-family: 'Lato', sans-serif;
}
h4 {
text-align: center;
font-family: 'Lato', sans-serif;
}
p {
text-align: center;
font-family: 'Lato', sans-serif;
}
</style>
</html>
Running Program
Setelah 3 bahasan di atas selesai, kini saatnya kita running programnya. Buka kembali command prompt dan arahkan ke direktori E:\triyonos\arduino_nodejs.
Ketikkan perintah node index
kemudian tekan enter.
Jika tidak ada error, maka command prompt akan menampilkan angka random dari Serial.println() Arduino Uno tiap 5 detik sebagai berikut:
Di saat yang lain saya akses URL localhost:3000 dari web browser dan tampilannya seperti berikut:
Tiap 5 detik sekali chart.js melakukan push data Serial.println() Arduino melalui Websocket Socket.io.