用树莓派做一个简易的防盗报警器

(点击上方公号,可快速关注)

英文: Christian Haschek

译文: 伯乐在线 – 无名侠女谭

网址: http://blog.jobbole.com/88041/

点击“阅读原文”可查看本文网页版


树莓派让我最爱的地方就是 GPIO 引脚。它们允许你打破软件和访问外部硬件的限制。我一直都从事软件行业,但同时也希望通过软件来控制某些硬件。


所以我的第一个软硬件结合项目就是想实现一个原始的防盗报警器,门被打开时,会发送通知给我。


你将需要以下这些东西:


  • 树莓派

  • 簧片继电器(磁铁开关)

  • 一些旧的 IDE 电缆

  • 1 个 10kΩ 的电阻


如果你已经有一个树莓派了,这个项目将只会花费你 10 欧元。


第一步:电路




这一步很简单,第一次尝试就成功了。


第二步:簧片开关


簧片开关是该项目中最重要的部分,因为只有当磁铁靠近其头部的时候,它才会切换电源。所以如果门关闭,簧片将失去与电源的连接,然后树莓派就会通知有一个从 1 到 0 的状态变化。


为了测试,我只用胶带在门上固定了簧片开关,在它下面固定了磁铁,如下图中所示。开关的两条线自然是连接到电路,参考第一步中的电路。




第三步:软件


现在我们只需要几行代码就可以完成这个项目啦!我用的nodeJs来编写代码,因为我喜欢它的工作模式,并且作为一个Web开发者,使用JavaScript我觉得非常熟悉和自在。另外,包管理器(npm)对于node使用非常有帮助。


在这个例子中,当门的状态改变时,我让树莓派通过邮件来通知我,但是你还可以使用其他各种方式,比如播放声音、推送到Twitter(或许这不是最好的办法)。


你需要从npm安装两个包。使用如下命令来完成:


  • (如果你没有安装 nodejs ,用的是 raspian) apt-get install nodejs npm

  • npm install emailjs

  • npm install rpi-gpio


这就是代码:你需要改变以下这些地方:


  • 如果你使用的pin编号与我的电路中不同,则修改这个doorpin的值(文中作者使用的是7)

  • 修改你的邮箱认证信息(user、password、host 如果你用的不是gamil)

  • 在readInput方法中修改”from:”和”to:”的邮件地址


var gpio = require('rpi-gpio');

var email = require("emailjs/email");

var doorpin = 7;

//the GPIO port you connected to the cicruit

var server = email.server.connect({

user: "your.username",

password:"YourPassword",

host: "smtp.gmail.com",

ssl: true});

var laststate = 1;

gpio.setup(doorpin, gpio.DIR_IN,readInput);

function readInput()

{

gpio.read(doorpin, function(err, value){

if(laststate!=value)

{

console.log(translateStatus(value));

server.send({

//sending email

text: translateStatus(value),

from: "Door <youremail@gmail.com>",

to: "somebody <youremail@gmail.com>",

subject: translateStatus(value)

}, function(err, message) { console.log(err || message); });

}

laststate = value;

});

setTimeout(readInput,1000);

//recheck door every second

}

function translateStatus(s){

if(s==0) return 'The door is now open! '+getTime();

else return 'The door is now closed! '+getTime();

}

function getTime(){

var h = new Date().getHours();

var m = new Date().getMinutes();

var s = new Date().getSeconds();

if(h <10) h = '0'+h;

if(m <10) m = '0'+m;

if(s <10) s = '0'+s;

return h+':'+m+':'+s;

}


你需要把代码保存为一个文件,例如 dooralert.js,然后通过如下命令运行:


nodejs dooralert.js


如果一切运行正常,你打开门再关门,就会收到一封如下的邮件:




后续


接下来,我想继续实现的就是,通过 USB 把树莓派连接到网络摄像头,每次门打开时就拍一张照片。这个想法理应不会太困难,但是我需要搞清楚在哪儿安置摄像头。

【今日推荐↓】


微信号:iGeekFan

(长按上图,可自动识别二维码)


「极客范」聚焦极客主题,分享各种新、奇、酷的东西。


微信号:iProgrammer

(长按上图,弹出“识别二维码”后可快速关注)


「程序员的那些事」是最受欢迎的程序员、IT 技术和 IT 行业相关的微信公众号之一,分享最新编程技术、经典技术分享、IT 行业动态、热门编程课程、高薪技术职位、程序员的日常,更有难得一见的 IT 相亲活动。


发表回复