本帖最后由 盼盼2333 于 2016-8-21 13:32 编辑
项目概述
当有小偷准备入室偷窃的时候,总会伴随着一些特殊的环境变量,比如从窗外翻入会打开窗帘,或者使用手电照明,使室内变亮。 搬东西时会发出声响,使用气割机暴力破坏保险箱或暴力破坏大门会伴随着温度的变化。 当家里出现火灾或者燃气爆炸等异常情况时候,同样也会伴随相应的变化。 如果我们能够扑捉到这些变化,那么就可以猜测家庭环境是否出现问题,再通过摄像头进行全方位的确认,及时赶回家中或者进行相应的措施便可以保证室内财产安全。 主要功能包括: 1、监测环境声音、温度、光照,并触发报警 2、全方位摄像头查看屋内环境 3、LCD进行信息留言
硬件设计
使用的模块: 1、LCD,接在任意I2C接口上 2、温度传感器,接在模拟口0 3、光敏传感器,接在模拟口1 4、声音传感器,接在模拟口2 5、舵机,接在数字口5 6、继电器,接在数字口2 7、摄像头,接在USB口
继电器可接路由器的电源,当继电器接通时候,家里的pc上QQ会自动重连,手机收到pc端登录信息。
软件调试
页面的展示分三个部分,分别是环境变量(温度,光强,声压)的显示,摄像头的视频流,舵机的控制以及报警功能的关闭。 使用html的iframe分页功能将其结合到同一个界面。
在main.js中对请求进行路由,并开启摄像头视频流输出和环境预警的检测。
当光照、温度和声音大于无人环境的值时,开启继电器触发报警通知用户。
仅当用户确认点击后才关闭报警系统。
并且可以通过left和right进行舵机方向的变化,进行全方位的查看。
实际效果
用户界面
同时通过lcd的颜色变化提示一定程度上可以吓走小偷。
项目总结
由于舵机需要固定,所以只能在固定点对室内进行监控,无法进行多个房屋的情景进行监控,后期可添加移动功能加以改进。 由于报警系统的通知依赖聊天软件的上线提醒,受路由器启动时间和软件自动重新登录延时的影响,一定程度上会影响即时安全的质量。 由于每次触发都需要用户主动确认,后期可添加opencv 进行初步验证,过滤户外的环境变量及部分非人为影响。
心得体会
感谢 论坛提供本次试用机会,Edison是我接触到的第一款intel嵌入式产品,不仅可以使用入门级的arduino语言进行开发,还可以使用nodejs将web与硬件完美的结合起来。伴随着项目的进行,从零开始学会了nodejs的简单应用,并对Edison有了进一步的认识。
附部分代码:
- var express = require('express');
- var url = require('url');
- var fs = require('fs');
- var mraa = require('mraa');
- var servoModule = require("jsupm_servo");
- var upm_grove = require("jsupm_grove");
- var app = express();
- var angel = 75;
- app.get('/', function (req, res) {
- var pageFile = fs.readFileSync('/node_app_slot/index.html');
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end(pageFile);
- })
- app.get('/lcd.html', function (req, res) {
- var pageFile = fs.readFileSync('/node_app_slot/lcd.html');
- var texts = url.parse(req.url,true).query.lcd;
- if(texts == undefined){
- texts = ' ';
- }
- pageFile = String(pageFile).replace(/lcd:/,'lcd:'+texts);
- showLcd(texts);
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end(pageFile);
- })
- app.get('/environment.html', function (req, res) {
- var pageFile = fs.readFileSync('/node_app_slot/environment.html');
- var temps = getTemperature() ;
- var luxs = getLux() ;
- var voice = getVoice();
- pageFile = String(pageFile).replace(/temp:/,'temp:'+temps);
- pageFile = String(pageFile).replace(/lux:/,'lux:'+luxs);
- pageFile = String(pageFile).replace(/voice:/,'voice:'+voice);
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end(pageFile);
- })
- app.get('/control.html', function (req, res) {
- var pageFile = fs.readFileSync('/node_app_slot/control.html');
- var dir=url.parse(req.url,true).query.dir;
- if(dir == 'left'){
- angel = angel - 2;
- }else if(dir = 'right'){
- angel = angel + 2;
- }
- if(angel >= 150){
- angel = 150;
- }else if(angel <= 0 ){
- angel = 0;
- }
- startServo(0, 20 , angel);
- pageFile = String(pageFile).replace(/dir:/,'dir:'+angel);
- var relay = url.parse(req.url,true).query.relay;
- if(relay == "off"){
- setRelay(0);
- }
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end(pageFile);
- })
- var server = app.listen(8081, function () {
- startVideo();
- isWarning();
- })
- function startVideo(){
- var exec = require('child_process').exec;
- var cmdStr = 'mjpg_streamer -i "input_uvc.so" -o "output_http.so -w /www"';
- exec(cmdStr, function(err,stdout,stderr){
- if(err) {
- console.log('error:'+stderr);
- } else {
- var data = JSON.parse(stdout);
- console.log(data);
- }
- });
- }
- function setRelay(value){
- var pin = new mraa.Gpio(2);
- pin.dir(mraa.DIR_OUT);
- pin.write(value);
- }
- function getTemperature(){
- var analogPin = new mraa.Aio(0); //setup access analog input Analog pin #0 (A0)
- var analogValue = analogPin.read();
- var B = 3975;
- var resistance=(1023-analogValue)*10000/analogValue; //get the resistance of the sensor;
- var temperature=1/(Math.log(resistance/10000)/B+1/298.15)-273.15;
- return temperature.toFixed(2);
- }
- function getLux() {
- var analogPin = new mraa.Aio(1);
- analogValue = analogPin.read();
- var lux;
- var calib = [{reading:0, lux:0},
- {reading:100, lux:0.2}, // guess - not from published table
- {reading:200, lux:1},
- {reading:300, lux:3},
- {reading:400, lux:6},
- {reading:500, lux:10},
- {reading:600, lux:15},
- {reading:700, lux:35},
- {reading:800, lux:80},
- {reading:900, lux:100}];
- var i = 0;
- while (i < calib.length && calib[i].reading < analogValue) {
- i ++;
- }
- if (i > 0) {
- i = i - 1;
- }
- // simple linear interpolation
- lux = (calib[i].lux *(calib[i + 1].reading - analogValue) + calib[i + 1].lux * (analogValue - calib[i].reading))/(calib[i + 1].reading - calib[i].reading);
- return lux.toFixed(2);
- }
- function getVoice(){
- var analogPin = new mraa.Aio(2);
- var analogValue = analogPin.read();
- return analogValue;
- }
- function isWarning(){
- setTimeout(isWarning,100);
- var temp = getTemperature() ;
- var lux = getLux() ;
- var voice = getVoice();
- if(lux >= 10 || temp >40 || voice >500){
- setRelay(1);
- }
- }
- function showLcd(lcdvalue) {
- var i2c = require('./i2c');
- var display = new i2c.LCD(0);
- display.setCursor(0,0);
- display.write(lcdvalue);
- display.setColor(0, 60, 255);
- setTimeout(function(){
- display.setColor(255, 0, 0);
- setTimeout(function(){
- display.setColor(0, 60, 255);
- setTimeout(function(){
- display.setColor(255, 0, 0);
- setTimeout(function(){
- display.setColor(0, 60, 255);
- },500);
- },500);
- },500);
- },500);
- display.setColor(0, 60, 255);
- }
- function startServo(timeOffset, timeInterval,angelValue){
- var servo = new servoModule.ES08A(5);
- if(angelValue <= 0){
- analogValue = 0;
- }else if(angelValue >= 150){
- angelValue = 150;
- }
- setTimeout(function(){
- setInterval(function(){
- servo.setAngle(angelValue);
- }, timeInterval);
- }, timeOffset);
- }
复制代码
附项目文件
1
|
|
|
|