七、使用物联网仪表盘打造间谍警察

在这一章中,我们将看看国内的几个项目。您可以将这些项目与我们在前面章节中看到的其他工具结合起来。这样做将帮助你提高你的知识,也让你发展自己的知识。本章将涵盖以下主题:

  • 检测噪音的间谍麦克风
  • 调节交流灯调光器的电流
  • 用射频识别卡控制访问
  • 探测烟雾
  • 利用树莓 Pi Zero 构建报警系统
  • 从远程仪表板监控气候

侦测噪音的间谍麦克风

在这一节中,我们将看一个项目,我们可以在房子里使用它来检测噪音或声音水平,这样我们就可以检测到一个人在房子前面说话的时候。该项目包括一个带有麦克风的模块,类似于下图:

Spy microphone that detects noise

软件代码

我们需要制作一个程序,可以读取模块发送到 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); 
} 

然后我们下载草图,在下面的截图中,我们得到了声音级别的结果:

Software code

在下图中,我们可以看到与 Arduino 电路板的最终电路连接:

Software code

调节交流灯调光器的电流

在本节中,我们将了解如何调节交流灯。这么多年来,我一直想解释和分享这样一个项目,我终于。这可以应用于调节你家里的灯,以减少家庭电力消耗:以下部分将更详细地解释该项目。

硬件要求

我们需要以下电子元件:

  • h 桥
  • 24 交流变压器
  • 两个电阻 22k (1 瓦)
  • 一个集成电路(4N25)
  • 一个电阻器 10k
  • 一个 5k 电位计
  • 一个电阻 330 欧姆
  • 一个电阻 180 欧姆
  • 一个集成电路 MOC3011
  • 一个双向可控硅 2N6073

在下面的电路图中,我们可以从 Arduino 板上看到调光器的连接:

Hardware requirements

软件代码

现在,您可以将代码复制到名为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); 
} 

下载草图后,我们可以看到最终结果。有了电位计,我们可以调节灯的亮度。在我们的房子里,我们可以随时打开灯:也许我们可以根据环境的环境光来控制它们。

在下面的图像中,如果我们调节电位计的输入信号,我们将看到灯的不同时刻:

Software code

在下图中,我们可以看到调节灯亮度的结果:

Software code

在这里,我们可以看到最大亮度下的灯变暗:

Software code

用射频识别卡控制访问

在本节中,我们将看到如何通过门控制访问。在最后一章中,我们看到了如何控制一所房子的锁和灯。这个项目可以补充最后一个,因为它将使您能够控制一扇门的打开,一个特定的卧室门,或其他房间的灯。

硬件要求

对于本项目,我们需要以下设备:

  • 阅读 TAGS 卡片
  • 射频识别 RC522 模块
  • 阿尔杜伊诺董事会

下图显示了用于读取和控制访问的射频识别标签:

Hardware requirements

下图显示了 Arduino 的射频识别卡接口:

Hardware requirements

软件需求

我们需要安装<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}};

Software code

如果我们将卡保留在标签和未注册的卡上,它可以提供正确的访问:

Software code

完整连接的最终结果如下图所示:

Software code

探测烟雾

在本节中,我们将测试一个能够检测烟雾的 MQ135 传感器。这也可以用于家庭中检测气体泄漏。在这种情况下,我们将使用它来检测烟雾。

在家庭自动化系统中,把所有的传感器放在家里检测东西,我们测量真实世界:在这种情况下,我们使用了可以检测气体和烟雾的 MQ135 传感器,如下图所示:

Detecting smoke

软件代码

在下面的代码中,我们解释了如何使用气体传感器编程和检测烟雾:

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); 
} 
} 

如果它没有检测到烟雾,它会产生以下值,如下图所示:

Software code

如果检测到烟雾,测量值在 305320 范围内,在文件中可以看到如下截图:

Software code

最终结果(具有完整的电路连接)如下图所示:

Software code

利用树莓 Pi Zero 构建报警系统

在本节中,我们将构建一个简单的报警系统,将一个 PIR 传感器连接到树莓 Pi Zero。这是一个重要的项目,因为它可以添加到家庭中,包括其他传感器,以便对其进行监控。

带树莓 Pi 零点的运动传感器

对于这个项目,我们需要树莓 Pi Zero,一个运动传感器 PIR,和一些电缆。这个项目的硬件配置实际上非常简单。首先,将运动传感器的 VCC 引脚连接到树莓 Pi 上的 3.3V 引脚。然后,将传感器的 GND 引脚连接到圆周率上的一个 GND 引脚。最后,将运动传感器的 OUT 引脚连接到树莓 Pi 上的 GPIO17 引脚。您可以参考前面的章节,了解树莓 Pi Zero 板上的引脚映射。

下图显示了带有连接的最终电路:

Motion sensor with Raspberry 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!'); 
}); 

这是显示连接的最后一个电路:

Software code

中央界面

首先,我们使用以下代码为应用创建一个中央界面:

// 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 中添加一个传感器,并从云仪表板中监控测量结果。让我们看看它是如何工作的。

下图显示了最终连接:

Monitoring the climate from a remote dashboard

探索传感器测试

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 并创建一个帐户:

Configuring the remote dashboard (Dweet.io)

现在,我们创建一个新的仪表板来控制传感器:

Configuring the remote dashboard (Dweet.io)

使用以下参数添加新数据源:

Configuring the remote dashboard (Dweet.io)

在仪表板内创建一个新窗格,并为温度创建一个仪表部件:

Configuring the remote dashboard (Dweet.io)

然后,我们将立即看到界面中的温度:

Configuring the remote dashboard (Dweet.io)

湿度也是如此:

Configuring the remote dashboard (Dweet.io)

我们应该看到最后的结果:

Configuring the remote dashboard (Dweet.io)

总结

在本章中,我们学习了如何构建和集成基于树莓 Pi Zero 和 Arduino 板的模块化安全系统。当然有很多方法可以改进这个项目。例如,您可以简单地向项目中添加更多模块,例如触发相同警报的更多运动传感器。您可以监控系统,即使您不在家中的无线网络中。

在下一章中,我们将学习如何从安卓应用控制您的系统,以及如何从您的智能手机集成一个真实的系统,这太棒了!