很久以前的课设时实现了自己的一个想法,无线控制屋里的灯,再也不用每次都要站起来去手动关灯了。为了能通用些,写了成了一个小的框架,每个控制功能作为一个“驱动/模块“,然后在这个基础上把温湿度传感,红外/空调遥控之类的都做了出来。之后借来的Intel Gailieo还回去了,开始磨磨蹭蹭地把系统放到了树梅派上,然后改进了一下Arduino端的结构,也尝试写了一个比较通用的框架。
使用Node.js作为服务器提供Web端控制,通过不同的通讯模块(现在有NRF24L01,网络和WIFI)处理请求和传感器发回的信息等,将用户请求发送到下位机(比如Arduino),服务器处理各种传感器和控制器的具体任务。
Arduino上尝试实现了一个库,提供一个框架,方便实现硬件逻辑,可以将一个操作绑定到一个函数上,实现不同操作的处理。
服务器端对应的灯的“驱动”目前看起来是这样的:
var light = {}; var plat = undefined; light.decorate = function (thing, desc){ thing.turnOff = function(){ var op = { 'op':'turnOff', } thing.send(op); } thing.turnOn = function(){ var op = { 'op':'turnOn', } thing.send(op); } thing.powerOff = thing.turnOff; thing.powerOn = thing.turnOn; thing.receives.add(function(data){ thing.status = data.status; }) thing.interfaces['Power On'] = { type:'switch', name:'Power On', desc:'开灯', action:{ 1:'turnOn', 0:'turnOff' }, value:'power' }; } light.init = function (base){ plat = base; } module.exports = light;
Arduino上用自己的这个框架的话代码也比较干净利索,目前看起来是这样:
#define RF24_ADDR 0xFFFF000001 //#define SOME_DEBUG //#define SOME_ERROR #include <ArduinoJson.h> #include <EEPROM.h> #include <SPI.h> #include "printf.h" #include "Some.h" Thing<link_RF24> me(0, "{\"name\":\"智能灯\",\"groups\":{\"power\":{\"hasBattery\":false},\"smart\":{\"alwaysOn\":true,\"heartBeat\":false},\"light\":{}}}"); void turnOn(void) { Serial.println("turnOn"); digitalWrite(6, LOW); me.send("{\"power\":1}"); } void turnOff(void) { Serial.println("turnOff"); digitalWrite(6, HIGH); me.send("{\"power\":0}"); } void setup() { // Serial.begin(115200); // printf_begin(); pinMode(6, OUTPUT); digitalWrite(6, LOW); //Turn the light on as soon as possible. me.setup(); me.poke(); me.on("turnOn", turnOn); me.on("turnOff", turnOff); turnOn(); } void loop(void) { delay(50); me.refresh(); }
不少地方需要跟进,比如使用Arduino设备的自动发现,给每个设备分配更加独立可识别的ID,加密和安全性等,服务器中对事件的处理等等。
目前服务器跑在树梅派上,使用Arduino改造了自己的屋顶灯,做了几个传感器,跑得很欢。
持续更新中…
Github: