七、使用物联网仪表盘打造间谍警察
在这一章中,我们将看看国内的几个项目。您可以将这些项目与我们在前面章节中看到的其他工具结合起来。这样做将帮助你提高你的知识,也让你发展自己的知识。本章将涵盖以下主题:
- 检测噪音的间谍麦克风
- 调节交流灯调光器的电流
- 用射频识别卡控制访问
- 探测烟雾
- 利用树莓 Pi Zero 构建报警系统
- 从远程仪表板监控气候
侦测噪音的间谍麦克风
在这一节中,我们将看一个项目,我们可以在房子里使用它来检测噪音或声音水平,这样我们就可以检测到一个人在房子前面说话的时候。该项目包括一个带有麦克风的模块,类似于下图:
软件代码
我们需要制作一个程序,可以读取模块发送到 Arduino 板的模拟信号:
const int ledPin = 12; // the number of the LED pin
const int thresholdvalue = 400; //The threshold to turn the led on
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0); //use A0 to read the electrical signal
Serial.print("Noise detected=");
Serial.println(sensorValue);
delay(100);
if(sensorValue > thresholdvalue)
digitalWrite(ledPin,HIGH);//if the value read from A0 is larger than 400,then light the LED
delay(200);
digitalWrite(ledPin,LOW);
}
然后我们下载草图,在下面的截图中,我们得到了声音级别的结果:
在下图中,我们可以看到与 Arduino 电路板的最终电路连接:
调节交流灯调光器的电流
在本节中,我们将了解如何调节交流灯。这么多年来,我一直想解释和分享这样一个项目,我终于。这可以应用于调节你家里的灯,以减少家庭电力消耗:以下部分将更详细地解释该项目。
硬件要求
我们需要以下电子元件:
- h 桥
- 24 交流变压器
- 两个电阻 22k (1 瓦)
- 一个集成电路(4N25)
- 一个电阻器 10k
- 一个 5k 电位计
- 一个电阻 330 欧姆
- 一个电阻 180 欧姆
- 一个集成电路 MOC3011
- 一个双向可控硅 2N6073
在下面的电路图中,我们可以从 Arduino 板上看到调光器的连接:
软件代码
现在,您可以将代码复制到名为Dimner.ino
的文件中,或者直接从这个项目的文件夹中获取完整的代码:
int load = 10;
int intensity = 128;
void setup()
{
pinMode(loaf, OUTPUT);
attachInterrupt(0, cross_zero_int, RISING);
}
void loop()
{
intensity = map(analogRead(0),0,1023,10,128);
}
void cross_zero_int()
{
int dimtime = (65 * intensity);
delayMicroseconds(dimtime);
digitalWrite(load, HIGH);
delayMicroseconds(8);
digitalWrite(load, LOW);
}
下载草图后,我们可以看到最终结果。有了电位计,我们可以调节灯的亮度。在我们的房子里,我们可以随时打开灯:也许我们可以根据环境的环境光来控制它们。
在下面的图像中,如果我们调节电位计的输入信号,我们将看到灯的不同时刻:
在下图中,我们可以看到调节灯亮度的结果:
在这里,我们可以看到最大亮度下的灯变暗:
用射频识别卡控制访问
在本节中,我们将看到如何通过门控制访问。在最后一章中,我们看到了如何控制一所房子的锁和灯。这个项目可以补充最后一个,因为它将使您能够控制一扇门的打开,一个特定的卧室门,或其他房间的灯。
硬件要求
对于本项目,我们需要以下设备:
- 阅读 TAGS 卡片
- 射频识别 RC522 模块
- 阿尔杜伊诺董事会
下图显示了用于读取和控制访问的射频识别标签:
下图显示了 Arduino 的射频识别卡接口:
软件需求
我们需要安装<MFRC522.h>
库,这个文件可以和读取标签卡的模块进行通信和配置。这个库可以从https://github.com/miguelbalboa/rfid下载。
软件代码
现在,您可以将代码复制到名为RFID.ino
的文件中,或者直接从这个项目的文件夹中获取完整的代码:
#include <MFRC522.h>
#include <SPI.h>
#define SAD 10
#define RST 5
MFRC522 nfc(SAD, RST);
#define ledPinOpen 2
#define ledPinClose 3
void setup() {
pinMode(ledPinOpen,OUTPUT);
pinMode(ledPinClose,OUTPUT);
SPI.begin();
Serial.begin(115200);
Serial.println("Looking for RC522");
nfc.begin();
byte version = nfc.getFirmwareVersion();
if (! version) {
Serial.print("We don't find RC522");
while(1);
}
Serial.print("Found RC522");
Serial.print("Firmware version 0x");
Serial.print(version, HEX);
Serial.println(".");
}
#define AUTHORIZED_COUNT 2 //number of cards Authorized
byte Authorized[AUTHORIZED_COUNT][6] = {{0xC6, 0x95, 0x39, 0x31, 0x5B},{0x2E, 0x7, 0x9A, 0xE5, 0x56}};
void printSerial(byte *serial);
boolean isSame(byte *key, byte *serial);
boolean isAuthorized(byte *serial);
void loop() {
byte status;
byte data[MAX_LEN];
byte serial[5];
boolean Open = false;
digitalWrite(ledPinOpen, Open);
digitalWrite(ledPinClose, !Open);
status = nfc.requestTag(MF1_REQIDL, data);
if (status == MI_OK) {
status = nfc.antiCollision(data);
memcpy(serial, data, 5);
if(isAuthorized(serial))
{
Serial.println("Access Granted");
Open = true;
}
else
{
printSerial(serial);
Serial.println("NO Access");
Open = false;
}
nfc.haltTag();
digitalWrite(ledPinOpen, Open);
digitalWrite(ledPinClose, !Open);
delay(2000);
}
delay(500);
}
boolean isSame(byte *key, byte *serial)
{
for (int i = 0; i < 4; i++) {
if (key[i] != serial[i])
{
return false;
}
}
return true;
}
boolean isAuthorized(byte *serial)
{
for(int i = 0; i<AUTHORIZED_COUNT; i++)
{
if(isSame(serial, Authorized[i]))
return true;
}
return false;
}
void printSerial(byte *serial)
{
Serial.print("Serial:");
for (int i = 0; i < 5; i++) {
Serial.print(serial[i], HEX);
Serial.print(" ");
}
}
这是我们在连接到 Arduino 的 RFID 模块前传递 Tag 卡时的最终结果,如果下面的代码,它将显示消息(访问已授权)。
在这部分代码中,我们配置了授权卡的数量:
#define AUTHORIZED_COUNT 2
byte Authorized[AUTHORIZED_COUNT][6] = {{0xC6, 0x95, 0x39, 0x31, 0x5B},
{0x2E, 0x7, 0x9A, 0xE5, 0x56}};
如果我们将卡保留在标签和未注册的卡上,它可以提供正确的访问:
完整连接的最终结果如下图所示:
探测烟雾
在本节中,我们将测试一个能够检测烟雾的 MQ135 传感器。这也可以用于家庭中检测气体泄漏。在这种情况下,我们将使用它来检测烟雾。
在家庭自动化系统中,把所有的传感器放在家里检测东西,我们测量真实世界:在这种情况下,我们使用了可以检测气体和烟雾的 MQ135 传感器,如下图所示:
软件代码
在下面的代码中,我们解释了如何使用气体传感器编程和检测烟雾:
const int sensorPin= 0;
const int buzzerPin= 12;
int smoke_level;
void setup() {
Serial.begin(115200);
pinMode(sensorPin, INPUT);
pinMode(buzzerPin, OUTPUT);
}
void loop() {
smoke_level= analogRead(sensorPin);
Serial.println(smoke_level);
if(smoke_level > 200){
digitalWrite(buzzerPin, HIGH);
}
else{
digitalWrite(buzzerPin, LOW);
}
}
如果它没有检测到烟雾,它会产生以下值,如下图所示:
如果检测到烟雾,测量值在 305 和 320 范围内,在文件中可以看到如下截图:
最终结果(具有完整的电路连接)如下图所示:
利用树莓 Pi Zero 构建报警系统
在本节中,我们将构建一个简单的报警系统,将一个 PIR 传感器连接到树莓 Pi Zero。这是一个重要的项目,因为它可以添加到家庭中,包括其他传感器,以便对其进行监控。
带树莓 Pi 零点的运动传感器
对于这个项目,我们需要树莓 Pi Zero,一个运动传感器 PIR,和一些电缆。这个项目的硬件配置实际上非常简单。首先,将运动传感器的 VCC 引脚连接到树莓 Pi 上的 3.3V 引脚。然后,将传感器的 GND 引脚连接到圆周率上的一个 GND 引脚。最后,将运动传感器的 OUT 引脚连接到树莓 Pi 上的 GPIO17 引脚。您可以参考前面的章节,了解树莓 Pi Zero 板上的引脚映射。
下图显示了带有连接的最终电路:
软件代码
现在,您可以将代码复制到名为Project1
的文件夹中,或者直接从该项目的文件夹中获取完整的代码:
// Modules
var express = require('express');
// Express app
var app = express();
// aREST
var piREST = require('pi-arest')(app);
piREST.set_id('34f5eQ');
piREST.set_name('motion_sensor');
piREST.set_mode('bcm');
// Start server
app.listen(3000, function () {
console.log('Raspberry Pi Zero motion sensor started!');
});
报警模块
你家里通常会有一个模块,当检测到运动时,它会发出闪光和声音。当然,你可以很好地把它连接到一个真正的警报器上,而不是蜂鸣器,以便在检测到任何运动时发出响亮的声音。
要组装该模块,首先将发光二极管与试验板上的 330 欧姆电阻串联,发光二极管的最长引脚与电阻接触。同时将蜂鸣器放在试验板上。然后,将电阻的另一侧连接到圆周率上的 GPIO14 ,将发光二极管的另一部分连接到圆周率上的一个 GND 引脚。对于蜂鸣器,将蜂鸣器上标记有 + 的引脚连接到 GPIO15 上,将蜂鸣器上的另一个引脚连接到 Pi 上的一个 GND 引脚上。
软件代码
下面是编码细节:
// Modules
var express = require('express');
// Express app
var app = express();
// aREST
var piREST = require('pi-arest')(app);
piREST.set_id('35f5fc');
piREST.set_name('alarm');
piREST.set_mode('bcm');
// Start server
app.listen(3000, function () {
console.log('Raspberry Pi Zero alarm started!');
});
这是显示连接的最后一个电路:
中央界面
首先,我们使用以下代码为应用创建一个中央界面:
// Modules
var express = require('express');
var app = express();
var request = require('request');
// Use public directory
app.use(express.static('public'));
// Pi addresses
var motionSensorPi = "192.168.1.104:3000";
var alarmPi = "192.168.1.103:3000"
// Pins
var buzzerPin = 15;
var ledPin = 14;
var motionSensorPin = 17;
// Routes
app.get('/', function (req, res) {
res.sendfile(__dirname + '/public/interface.html');
});
app.get('/alarm', function (req, res) {
res.json({alarm: alarm});
});
app.get('/off', function (req, res) {
// Set alarm off
alarm = false;
// Set LED & buzzer off
request("http://" + alarmPi + "/digital/" + ledPin + '/0');
request("http://" + alarmPi + "/digital/" + buzzerPin + '/0');
// Answer
res.json({message: "Alarm off"});
});
// Start server
var server = app.listen(3000, function() {
console.log('Listening on port %d', server.address().port);
});
// Motion sensor measurement loop
setInterval(function() {
// Get data from motion sensor
request("http://" + motionSensorPi + "/digital/" + motionSensorPin,
function (error, response, body) {
if (!error && body.return_value == 1) {
// Activate alarm
alarm = true;
// Set LED on
request("http://" + alarmPi + "/digital/" + ledPin + '/1');
// Set buzzer on
request("http://" + alarmPi + "/digital/" + buzzerPin + '/1');
}
});
}, 2000);
图形界面
现在让我们看看界面文件,从 HTML 开始。我们首先导入项目所需的所有库和文件:
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="js/script.js"></script>
<link rel="stylesheet" href="css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<script type="text/javascript">
/* Copyright (C) 2007 Richard Atterer, richard©atterer.net
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License, version 2\. See the file
COPYING for details. */
var imageNr = 0; // Serial number of current image
var finished = new Array(); // References to img objects which have finished downloading
var paused = false;
</script>
<div id="container">
<h3>Security System</h3>
<div class='row voffset50'>
<div class='col-md-4'></div>
<div class='col-md-4 text-center'>
Alarm is OFF
</div>
<div class='col-md-4'></div>
</div>
<div class='row'>
<div class='col-md-4'></div>
<div class='col-md-4'>
<button id='off' class='btn btn-block btn-danger'>Deactivate Alarm</button>
</div>
<div class='col-md-4'></div>
</div>
</div>
</body>
</html>
从远程仪表盘监控气候
如今,大多数智能家居都连接到互联网,这允许用户监控他们的家庭。在本节中,我们将学习如何远程监控您的气候。首先,我们将简单地在我们的树莓 Pi Zero 中添加一个传感器,并从云仪表板中监控测量结果。让我们看看它是如何工作的。
下图显示了最终连接:
探索传感器测试
var sensorLib = require('node-dht-sensor');
var sensor = {
initialize: function () {
return sensorLib.initialize(11, 4);
},
read: function () {
var readout = sensorLib.read();
console.log('Temperature: ' + readout.temperature.toFixed(2) + 'C, ' +
'humidity: ' + readout.humidity.toFixed(2) + '%');
setTimeout(function () {
sensor.read();
}, 2000);
}
};
if (sensor.initialize()) {
sensor.read();
} else {
console.warn('Failed to initialize sensor');
}
配置远程仪表板(Dweet.io)
我们需要转到 http://freeboard.io 并创建一个帐户:
现在,我们创建一个新的仪表板来控制传感器:
使用以下参数添加新数据源:
在仪表板内创建一个新窗格,并为温度创建一个仪表部件:
然后,我们将立即看到界面中的温度:
湿度也是如此:
我们应该看到最后的结果:
总结
在本章中,我们学习了如何构建和集成基于树莓 Pi Zero 和 Arduino 板的模块化安全系统。当然有很多方法可以改进这个项目。例如,您可以简单地向项目中添加更多模块,例如触发相同警报的更多运动传感器。您可以监控系统,即使您不在家中的无线网络中。
在下一章中,我们将学习如何从安卓应用控制您的系统,以及如何从您的智能手机集成一个真实的系统,这太棒了!
版权属于:月萌API www.moonapi.com,转载请注明出处