From 1762c4cc46eddea282f978f1ac9a43e4c3579e2f Mon Sep 17 00:00:00 2001 From: IoTcat Date: Fri, 17 May 2019 14:49:07 +0800 Subject: [PATCH] add handler and pir --- node/README.md | 66 ++++++++++++- node/app.js | 33 ++++++- node/package.json | 2 +- node/wiot.js | 232 +++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 314 insertions(+), 19 deletions(-) diff --git a/node/README.md b/node/README.md index 40553c0..6940ab7 100644 --- a/node/README.md +++ b/node/README.md @@ -157,6 +157,11 @@ wiot.loop([MCU0, MCU1], () => { ### wiot.client事件绑定 `.on(event, handler)` +**client事件列表** +- `begin` 开始于单片机正常交互 +- `disConnected` 与单片机断开连接 +- `reConnected` 与单片机恢复连接 + ```js var MCU = new wiot.client({"MAC": "xx:xx:xx:xx:xx:xx"}); @@ -166,15 +171,27 @@ MCU.on('disConnected', function () { }); ``` -**事件列表** -- `begin` 开始于单片机正常交互 -- `disConnected` 与单片机断开连接 -- `reConnected` 与单片机恢复连接 +`.pinOn(pin, event, handler)` + +**pin事件列表** +- `on` pin口电位从低到高 +- `off` pin口电位从高到低 +- `change` pin口电位变化 + + +```js +var MCU = new wiot.client({"MAC": "xx:xx:xx:xx:xx:xx"}); + +MCU.pinOn(wiot.D2, 'on', function () { + // 当MCU的D2电位由低到高时会执行 + console.log('D2 from LOW to HIGH!!'); +}); +``` ## 常用模块 -### led +### LED + `wiot.led(MCU, pin)`: 声明一个led模块 + `wiot.led.getStatus()`: 获取led状态 + `wiot.led.set(status, time = 0, isSmooth = false)`: 设置led状态,起始状态,中间状态,最终状态,周期 @@ -207,3 +224,42 @@ myLED.clear(); ``` +### PIR 红外人体传感器 + ++ `wiot.pir(MCU, pin)`: 声明一个PIR模块 ++ `wiot.pir.getStatus()`: 获取PIR状态,返回值wiot.HIGH(有人),wiot.LOW(无人) + +#### 事件触发器 ++ `wiot.pir.on(event, handler)` + +**事件列表** +- `detected` 探测到人 +- `undetected` 人体移动出探测范围 +- `change` 状态改变,包括有人到无人和无人到有人 + +```js +MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"}); + +var myPIR = wiot.pir(MCU0, wiot.D2); //新建一个pir对象,使用MCU0上的D2口 + +/* 输出pir状态到控制台 */ +console.log(myPIR.getStatus()); + +/* 当探测到人,打印 "Detected People!" 到控制台 */ +myPIR.on("detected", ()=>{ + console.log("Detected People!"); +}); + +/* 人移动出探测范围,打印 "No People!!" 到控制台 */ +myPIR.on("undetected", ()=>{ + console.log("No People!!"); +}); + +/* 当状态改变,执行指令 */ +myPIR.on("change", ()=>{ + /* 你的指令 */ +}); + +``` + + diff --git a/node/app.js b/node/app.js index 4b50f55..2fd0623 100644 --- a/node/app.js +++ b/node/app.js @@ -1,5 +1,5 @@ var wiot = require('./wiot'); -MyMCU = new wiot.client({MAC: "3C:71:BF:3A:F7:66", pin: {D4: 1}, okDelayTime: 30,debug: 1}); +MyMCU = new wiot.client({MAC: "3C:71:BF:3A:F7:66", pin: {D4: 1}, okDelayTime: 30,hint: 1,debug: 1}); //q = new wiot.client({MAC: "3C:71:BF:3A:F6:83", pin: {D3: 1} }); /* var i = 0; @@ -16,10 +16,39 @@ wiot.loop([MyMCU], ()=>{ } });*/ + +/* + var myLED = wiot.led(MyMCU, wiot.D4); //新建一个led对象,使用MCU0上的D4口 +myLED.set([wiot.HIGH, wiot.LOW, 30, 0], [3000, 4000, 2000, 1000], true); + +/* +myLED.set(wiot.LOW); + + setTimeout(()=>{ if(!myLED.getStatus()){ myLED.set(wiot.HIGH); } -}, 15000) \ No newline at end of file +}, 15000);*/ + + +var pir = wiot.pir(MyMCU, wiot.D2); + + +pir.on("detected", ()=>{ + console.log("Found People!!!"); +}); + +pir.on("undetected", ()=>{ + console.log("No People"); +}); + +pir.on("change", ()=>{ + console.log("PIR State Changed!!!"); +}); + +pir.on("change", ()=>{ + console.log("PIR2222222222222222 State Changed!!!"); +}); \ No newline at end of file diff --git a/node/package.json b/node/package.json index 1b7341c..43f3322 100644 --- a/node/package.json +++ b/node/package.json @@ -1,6 +1,6 @@ { "name": "wiot", - "version": "0.0.19", + "version": "0.0.20", "description": "An awesome iot system for web developers~", "main": "wiot.js", "scripts": { diff --git a/node/wiot.js b/node/wiot.js index bc9429f..d714291 100644 --- a/node/wiot.js +++ b/node/wiot.js @@ -2,7 +2,7 @@ * @Author: IoTcat (https://iotcat.me) * @Date: 2019-05-04 18:59:49 * @Last Modified by: IoTcat - * @Last Modified time: 2019-05-17 11:37:13 + * @Last Modified time: 2019-05-17 14:23:42 */ var wiot_client = function (o_params) { var o = { @@ -25,6 +25,7 @@ var wiot_client = function (o_params) { HIGH: 255, LOW: 0, data: {}, + fData: {}, ip: "default", ip_range: "192.168.0", localIP: "127.0.0.1", @@ -63,7 +64,7 @@ var wiot_client = function (o_params) { D7: 0, D8: 0 }, - on: (event, handler) => { + on: (event, handler = ()=>{}) => { if(event == 'begin'){ o.begin = handler; } @@ -74,9 +75,184 @@ var wiot_client = function (o_params) { o.reConnected = handler; } }, + pinOn: (pin, event, handler = ()=>{}) => { + if(!isNaN(pin)) pin = 'D' + pin; + if(event == "on"){ + o.pinEvents[pin].onEvents.push(handler); + } + if(event == "off"){ + o.pinEvents[pin].offEvents.push(handler); + } + if(event == "change"){ + o.pinEvents[pin].changeEvents.push(handler); + } + }, begin: () => {}, disConnected: ()=>{}, - reConnected: ()=>{} + reConnected: ()=>{}, + pinEvents: { + D1: { + onEvents: [], + offEvents: [], + changeEvents: [], + on: ()=>{ + o.pinEvents.D1.onEvents.map((v)=>{ + v(); + }); + }, + off: ()=>{ + o.pinEvents.D1.offEvents.map((v)=>{ + v(); + }); + }, + change: ()=>{ + o.pinEvents.D1.changeEvents.map((v)=>{ + v(); + }); + } + }, + D2: { + onEvents: [], + offEvents: [], + changeEvents: [], + on: ()=>{ + o.pinEvents.D2.onEvents.map((v)=>{ + v(); + }); + }, + off: ()=>{ + o.pinEvents.D2.offEvents.map((v)=>{ + v(); + }); + }, + change: ()=>{ + o.pinEvents.D2.changeEvents.map((v)=>{ + v(); + }); + } + }, + D3: { + onEvents: [], + offEvents: [], + changeEvents: [], + on: ()=>{ + o.pinEvents.D3.onEvents.map((v)=>{ + v(); + }); + }, + off: ()=>{ + o.pinEvents.D3.offEvents.map((v)=>{ + v(); + }); + }, + change: ()=>{ + o.pinEvents.D3.changeEvents.map((v)=>{ + v(); + }); + } + }, + D4: { + onEvents: [], + offEvents: [], + changeEvents: [], + on: ()=>{ + o.pinEvents.D4.onEvents.map((v)=>{ + v(); + }); + }, + off: ()=>{ + o.pinEvents.D4.offEvents.map((v)=>{ + v(); + }); + }, + change: ()=>{ + o.pinEvents.D4.changeEvents.map((v)=>{ + v(); + }); + } + }, + D5: { + onEvents: [], + offEvents: [], + changeEvents: [], + on: ()=>{ + o.pinEvents.D5.onEvents.map((v)=>{ + v(); + }); + }, + off: ()=>{ + o.pinEvents.D5.offEvents.map((v)=>{ + v(); + }); + }, + change: ()=>{ + o.pinEvents.D5.changeEvents.map((v)=>{ + v(); + }); + } + }, + D6: { + onEvents: [], + offEvents: [], + changeEvents: [], + on: ()=>{ + o.pinEvents.D6.onEvents.map((v)=>{ + v(); + }); + }, + off: ()=>{ + o.pinEvents.D6.offEvents.map((v)=>{ + v(); + }); + }, + change: ()=>{ + o.pinEvents.D6.changeEvents.map((v)=>{ + v(); + }); + } + }, + D7: { + onEvents: [], + offEvents: [], + changeEvents: [], + on: ()=>{ + o.pinEvents.D7.onEvents.map((v)=>{ + v(); + }); + }, + off: ()=>{ + o.pinEvents.D7.offEvents.map((v)=>{ + v(); + }); + }, + change: ()=>{ + o.pinEvents.D7.changeEvents.map((v)=>{ + v(); + }); + } + }, + D8: { + onEvents: [], + offEvents: [], + changeEvents: [], + on: ()=>{ + o.pinEvents.D8.onEvents.map((v)=>{ + v(); + }); + }, + off: ()=>{ + o.pinEvents.D8.offEvents.map((v)=>{ + v(); + }); + }, + change: ()=>{ + o.pinEvents.D8.changeEvents.map((v)=>{ + v(); + }); + } + } + + } }; /* merge paras */ @@ -521,7 +697,19 @@ var wiot_client = function (o_params) { checkStatus(); if (o.LastConnectTime + o.errDelayTime > Date.parse(new Date())) { o.isConnected = true; + for(var i = 1; i <= 8; i ++){ + var s = 'D' + i; + if(o.fData[s] != o.data[s]){ + o.pinEvents[s].change(); + if(o.data[s] == 0){ + o.pinEvents[s].off(); + }else{ + o.pinEvents[s].on(); + } + } + } http_connected_callback(); + o.fData = o.data; return; } ping.promise.probe(o.ip, { @@ -649,11 +837,6 @@ var wiot_led = (obj, pin) => { return; }, setBreath: (status = [], time = []) => { - /*var t_t = time[time.length - 1]; - for(var t = time.length - 1; t > 0; t --){ - time[t] = time[t - 1]; - } - time[0] = t_t;*/ o.t_interval = setInterval(()=>{ var totalTime = 0; for(var i = 0; i < status.length; i ++){ @@ -676,13 +859,11 @@ var wiot_led = (obj, pin) => { time[t] = time[t - 1]; } time[0] = t_t; - o.t_interval = setInterval(()=>{ var totalTime = 0; for(var i = 0; i < status.length; i ++){ totalTime += time[i]; setTimeout((i)=>{ - console.log(i); o.MCU.write(o.pin, status[i]); }, totalTime, i); } @@ -700,6 +881,34 @@ var wiot_led = (obj, pin) => { return o; }; +/* pir */ +var wiot_pir = (obj, pin) => { + var o = { + MCU: obj, + pin: pin, + getStatus: () => { + return o.MCU.read(o.pin); + }, + on: (event, handler = ()=>{}) => { + if(event == "detected"){ + o.MCU.pinOn(o.pin, "on", handler); + } + if(event == "undetected"){ + o.MCU.pinOn(o.pin, "off", handler); + } + if(event == "change"){ + o.MCU.pinOn(o.pin, "change", handler); + } + } + }; + + return o; +}; + + + + + /* exports */ exports.HIGH = 255; exports.LOW = 0; @@ -719,4 +928,5 @@ exports.client = wiot_client; exports.loop = wiot_loop; exports.begin = wiot_begin; -exports.led = wiot_led; \ No newline at end of file +exports.led = wiot_led; +exports.pir = wiot_pir; \ No newline at end of file