在这一章中,我们将看看国内的几个项目。您可以将这些项目与我们在前面章节中看到的其他工具结合起来。这样做将帮助你提高你的知识,也让你发展自己的知识。本章将涵盖以下主题:
- 检测噪音的间谍麦克风
- 调节交流灯调光器的电流
- 用射频识别卡控制访问
- 探测烟雾
- 利用树莓 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 范围内,在文件中可以看到如下截图:
最终结果(具有完整的电路连接)如下图所示:
在本节中,我们将构建一个简单的报警系统,将一个 PIR 传感器连接到树莓 Pi Zero。这是一个重要的项目,因为它可以添加到家庭中,包括其他传感器,以便对其进行监控。
对于这个项目,我们需要树莓 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');
}
我们需要转到 http://freeboard.io 并创建一个帐户:
现在,我们创建一个新的仪表板来控制传感器:
使用以下参数添加新数据源:
在仪表板内创建一个新窗格,并为温度创建一个仪表部件:
然后,我们将立即看到界面中的温度:
湿度也是如此:
我们应该看到最后的结果:
在本章中,我们学习了如何构建和集成基于树莓 Pi Zero 和 Arduino 板的模块化安全系统。当然有很多方法可以改进这个项目。例如,您可以简单地向项目中添加更多模块,例如触发相同警报的更多运动传感器。您可以监控系统,即使您不在家中的无线网络中。
在下一章中,我们将学习如何从安卓应用控制您的系统,以及如何从您的智能手机集成一个真实的系统,这太棒了!