很久以前的课设时实现了自己的一个想法,无线控制屋里的灯,再也不用每次都要站起来去手动关灯了。为了能通用些,写了成了一个小的框架,每个控制功能作为一个“驱动/模块“,然后在这个基础上把温湿度传感,红外/空调遥控之类的都做了出来。之后借来的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:
不知道现在这个项目你做成什么样子啦,好想看一看哈哈!
感觉联系不上你0.0 可回邮件联系啦!