ここを参考に。
http://tomowatanabe.hatenablog.com/entry/2013/03/23/233554
Arduino側のコードはそのまま使う。
serial.ino
#define TEMP A5 #define LED 13 int value; // アナログ入力値(0〜203) int tempC = 0; // 摂氏値( ℃ ) char trans[20]; // 数字(文字列)の送信用配列 char recv[10]; // 数字(文字列)の受信用配列 void setup() { pinMode(TEMP, INPUT); pinMode(LED, OUTPUT); // シリアル通信速度 Serial.begin(9600); } void loop() { // シリアルからのデータ受信 memset(recv, 0, 10); char *p = &recv[0]; recvStr(p); if (strcmp("ON", p) == 0) { digitalWrite(LED, HIGH); } else if (strcmp("OFF", p) == 0) { digitalWrite(LED, LOW); } // 気温を送信 value = analogRead(TEMP); tempC = ((5 * value) / 1024.0) * 100; // シリアルからのデータ送信 memset(trans, 0, 20); char *json = &trans[0]; // 送信用のJSONデータの作成 sprintf(json, "{\"temp\":%d, \"led\":%d}", tempC, digitalRead(LED)); Serial.println(json); delay(5000); } // データ受信 void recvStr(char *buf) { int i = 0; char c; while (Serial.available()) { c = Serial.read(); buf[i] = c; i++; } }
node.jsではnode-serialportを使う。
var serialport = require('serialport'); // Serial Port //var portName = '/dev/tty.usbmodemfd13431'; // Mac環境 var portName = '/dev/tty.usbserial-A6008hxG'; // Mac環境 var sp = new serialport.SerialPort(portName, { baudRate: 9600, dataBits: 8, parity: 'none', stopBits: 1, flowControl: false, parser: serialport.parsers.readline("\n") // ※修正:パースの単位を改行で行う }); // data from Serial port sp.on('data', function(input) { var buffer = new Buffer(input, 'utf8'); var jsonData; try { jsonData = JSON.parse(buffer); console.log('temp: ' + jsonData.temp); console.log('led: ' + jsonData.led); } catch(e) { // データ受信がおかしい場合無視する return; } // つながっているクライアント全員に送信 //io.sockets.json.emit('message', { value: jsonData }); }); setInterval(function(){toggleLED()},5000); var sw = 0;//initialize function toggleLED(){ switch(sw){ case 0: sp.write("ON"); sw = 1; console.log("wrote ON, and sw flag is"+sw); break; case 1: sp.write("OFF"); sw = 0; console.log("wrote OFF, and sw flag is"+sw); break; } }