Alexandre Alapetite захотел собрать свой веб-регистратор температуры на базе Arduino, но не захотел разбираться с привередливостью своего Ethernet-шилда и решил заменить его своим Raspberry Pi.
Каждые пять минут, Arduino отправляет данные с термопары через последовательный порт (USB), на Raspberry Pi в виде JSON-пакета. На Raspberry Pi используется node.js, который передаёт данные в интернет.
Node.js — серверная реализация языка JavaScript основанная на движке V8 от Google (используется в Chrome). Предназначена для создания масштабируемых распределенных сетевых приложений, таких как веб-сервер.
скетч Arduino
#include <math.h> unsigned long UpdateDelay = 1000UL * 60 * 5; //Update frequency const byte Temperature1Pin = 0; //Thermistor 1 (Outdoor) const byte Temperature2Pin = 1; //Thermistor 2 (Indoor) const int Resistance1 = 9900; //Ohms (measured from R10K of voltage divider 1) const int Resistance2 = 9980; //Ohms (measured from R10K of voltage divider 2) const byte NbSamples = 8; //Averaging void setup() { delay(1000); Serial.begin(9600); //Start serial port pinMode(Temperature1Pin, INPUT); pinMode(Temperature2Pin, INPUT); digitalWrite(Temperature1Pin, LOW); digitalWrite(Temperature2Pin, LOW); analogRead(Temperature1Pin); analogRead(Temperature2Pin); } void loop() { float rawADC1 = 0.0; float rawADC2 = 0.0; for (byte i = NbSamples; i > 0; i--) {//Averaging over several readings rawADC1 += analogRead(Temperature1Pin); rawADC2 += analogRead(Temperature2Pin); delay(100); } rawADC1 /= NbSamples; rawADC2 /= NbSamples; //Sending a JSON string over Serial/USB like: {"ab":"123","bc":"234","cde":"3546"} Serial.println("{\"adc\":\"" + String((long)round(100.0 * rawADC1)) + "\", \"celsius\":\"" + String((long)round(100.0 * thermistor(rawADC1, Resistance1))) + "\", \"adc2\":\"" + String((long)round(100.0 * rawADC2)) + "\", \"celsius2\":\"" + String((long)round(100.0 * thermistor(rawADC2, Resistance2))) + "\"}"); delay(UpdateDelay); } float thermistor(float rawADC, float rSeries) {//http://arduino.cc/playground/ComponentLib/Thermistor2 //This method is not very advanced long resistance = (1024 * rSeries / rawADC) - rSeries; float temp = log(resistance); temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp)); return temp - 273.15; //Kelvin to Celsius }
arduinoTemperature.js — скрипт, используемый чтобы обрабатывать JSON-сообщения отправленные Arduino (он также передает новую информацию на специальный веб-сервер с помощью POST-запроса).
"use strict"; var arduinoSerialPort = '/dev/ttyACM0'; //Serial port over USB connection between the Raspberry Pi and the Arduino var os = require('os'); var serverSignature = 'Node.js / Debian ' + os.type() + ' ' + os.release() + ' ' + os.arch() + ' / Raspberry Pi B + Arduino Uno R3'; var postOptions = { host: 'posttestserver.com', //Change to your own server path: '/post.php', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Connection': 'close', 'User-Agent': serverSignature } }; var http = require('http'); function postData(s) {//Standard HTTP POST request var myOptions = postOptions; postOptions.headers['Content-Length'] = s.length; var requestPost = http.request(myOptions, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) { console.log(chunk); }); }); requestPost.on('error', function(e) { console.warn(e); }); requestPost.write(s); requestPost.end(); } var serialport = require('serialport'); var serialPort = new serialport.SerialPort(arduinoSerialPort, {//Listening on the serial port for data coming from Arduino over USB parser: serialport.parsers.readline('\n') }); var lastTemperatureIndoor = NaN; var lastTemperatureOutoor = NaN; var dateLastInfo = new Date(0); var querystring = require('querystring'); serialPort.on('data', function (data) {//When a new line of text is received from Arduino over USB try { var j = JSON.parse(data); lastTemperatureOutoor = j.celsius / 100.0; lastTemperatureIndoor = j.celsius2 / 100.0; dateLastInfo = new Date(); //Forward the Arduino information to another Web server postData(querystring.stringify(j)); } catch (ex) { console.warn(ex); } }); function colourScale(t) {//Generate an HTML colour in function of the temperature if (t <= -25.5) return '0,0,255'; if (t <= 0) return Math.round(255 + (t * 10)) + ',' + Math.round(255 + (t * 10)) + ',255'; if (t <= 12.75) return Math.round(255 - (t * 20)) + ',255,' + Math.round(255 - (t * 20)); if (t <= 25.5) return Math.round((t - 12.75) * 20) + ',255,0'; if (t <= 38.25) return '255,' + Math.round(255 - (t - 25.5) * 20) + ',0'; return '255,0,0'; } function htmlTemperature() { return '<!DOCTYPE html>\n\ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">\n\ <head>\n\ <meta charset="UTF-8" />\n\ <meta http-equiv="refresh" content="300" />\n\ <title>Temperature - Arduino - Raspberry Pi</title>\n\ <meta name="keywords" content="Temperature, Arduino, Raspberry Pi" />\n\ <meta name="viewport" content="initial-scale=1.0,width=device-width" />\n\ <meta name="robots" content="noindex" />\n\ <style type="text/css">\n\ html, body {background:black; color:white; font-family:sans-serif; text-align:center}\n\ .out {font-size:48pt}\n\ .in {font-size:36pt}\n\ .r, .sb {bottom:0; color:#AAA; position:absolute}\n\ .r {left:0.5em; margin-right:5em; text-align:left}\n\ .sb {right:0.5em}\n\ a {color:#AAA; text-decoration:none}\n\ a:hover {border-bottom:1px dashed}\n\ </style>\n\ </head>\n\ <body>\n\ <h1>Temperature somewhere</h1>\n\ <p>Outdoor<br /><strong class="out" style="color:rgb(' + colourScale(lastTemperatureOutoor) + ')">' + (Math.round(lastTemperatureOutoor * 10) / 10.0) + '°C</strong></p>\n\ <p>Indoor<br /><strong class="in" style="color:rgb(' + colourScale(lastTemperatureIndoor) + ')">' + (Math.round(lastTemperatureIndoor * 10) / 10.0) + '°C</strong></p>\n\ <p>' + dateLastInfo.toISOString() + '</p>\n\ <p class="r"><a href="http://alexandre.alapetite.fr/doc-alex/raspberrypi-nodejs-arduino/" title="Based on">Arduino + Raspberry Pi</a></p>\n\ </body>\n\ </html>\n\ '; } module.exports.htmlTemperature = htmlTemperature;
Ссылки
Raspberry Pi with Node.js and Arduino
http://nodejs.org
По теме
Использование Raspberry Pi в стиле Arduino
Raspberry Pi — начало работы
Raspberry Pi увидел свет!
Превращаем ADSL-модем в Ethernet-шилд для Arduino/CraftDuino
0 комментариев на «“Использование Raspberry Pi в роли Ethernet-шилда для Arduino”»
ну елки палки блин!
гвозди микроскопом! Юзать ардуину тупо как АЦП.
Уж лучяше бы взял цифровые датчики и подключил к GPIO
Совершенно бестолковое решение. Использовать связку Расберри + Ардуино только для регистрации температуры — расточительное безобразие. Здесь определенно половина железа — лишняя. Попахивает большим либо дилетантством, либо избытком денег.
Да, странно, что он использовал arduino+PI вместо просто PI. Наверное простота программирования PI еще не достигла Ардуины, не смотря на наличие аналогичных тулзов.
P.S. Для сетевых датчиков оптимальное (по цене и возможностям) — ARM Cortex-M3 с встроенным Ethernet’ом. Arduino+Ethernet в любом раскладе заметно дороже (здесь обсуждали уже), не говоря уж о возможностях MCU.