返回 登录
2

使用树莓派打造家庭监控系统

原文:Monitor Your Home With the Raspberry Pi B+
作者:M. Schwartz
译者:安翔
审校:苏宓

简介

市场上有许多设备提供从中央界面监控家庭环境的功能。在本文中,我们将自己 DIY 一套这样的监控设备。要做到这一点,我们将使用 B +型号的树莓派开发板和官方的树莓派相机模块。此外,我们还将使用温湿度传感器进行一些测量工作。

在文章末尾,你将能够构建一个界面,访问摄像机和传感器录像。我们还将展示如何从世界任何地方接入这个界面。让我们开始动手吧!

软硬件需求

开始项目之前,你需要的第一个东西就是树莓派 B +开发板。它具有很强大的功能(如4个USB端口),当然你也可以使用较旧版本的树莓派。

您将需要使用官方的 Raspberry Pi 相机模块来拍摄照片。还将使用 DHT11(或DHT​​22)传感器来测量家中的温度和湿度。

由于我们将远程访问 Rapsberry Pi,因此你将需要一个USB接口的无线网卡。

你还需要安装 Adafruit cobbler 工具包,面包板和一些跳线。你需要这些东西来实现Raspberry Pi、相机和传感器之间的连接。

以下是此项目所需组件的列表:

  • Raspberry Pi B +开发板(配套 microSD卡,microUSB 电缆和 HDMI 电缆)
  • Raspberry Pi 相机模块
  • 具有4.7k欧姆电阻的 DHT11 传感器
  • USB 无线网卡
  • Adafruit Cobbler工具包
  • 跳线
  • 面包板

检查你的 Raspberry Pi 上是否安装了 Linux 发行版。这是为了确保你有一个完整功能的Pi。该项目中,我使用的是 Raspbian 操作系统。

如果你还没有完成操作系统的安装,可以参考此文:http://www.raspberrypi.org/help/quick-start-guide/

将 Raspberry P i连接到本地 WiFi 网络,并为 BCM2835 芯片安装驱动程序,以读取DHT11 传感器的数据。

你可以按照以下说明下载并安装这些驱动程序:
http://www.raspberry-projects.com/pi/programming-in-c/c-libraries/bcm2835-by-mike-mccauley

整个项目都是基于Node.js. 它将作为一个服务器,从中我们可以访问我们的Raspberry Pi 的所有功能。

首先你需要在 Pi 上安装 Node.js。需要注意的是,你不能使用apt-get 工具安装 Node 包模块,因为你可能会安装一个旧的版本。要安装最新版本的Node.js,请遵循以下指导:
http://revryl.com/2014/01/04/nodejs-raspberry-pi/

你还需要安装 BCM2835 芯片的驱动程序。可以通过访问此页面下载并安装这些驱动程序:
http://www.airspayce.com/mikem/bcm2835/

之后,在 GitHub 上下载此项目的文件:
https://github.com/openhomeautomation/rpi-web-control

我们需要安装一些软件包,然后通过 rapsberrypi.local 访问本地 WiFi 网络上的Raspberry Pi。我们这样做之后就不需要通过其 IP 地址访问 Pi。

此后,你可以通过 SSH 登录 Raspberry Pi,或直接访问 Pi,然后键入以下命令:

sudo apt install avahi-daemon netatalk

硬件配置

如果你按照上述步骤进行操作,应该可以很轻松完成树莓派的配置。现在我们来添加其他的组件。

首先,我们将连接相机。按照 Raspberry Pi 网站上的说明进行安装。

以下是我使用的相机的图片。旁边是我的 Raspberry Pi:

请注意,我为我的 Raspberry Pi 使用了一个塑料盒。塑料盒在这个项目中并不是必需的。

接下来,我们将通过 Cobbler 套件将 DHT11 传感器连接到 Raspberry Pi 上。组装完成套件后,将其连接到 Raspberry Pi GPIO 接口。通过 PCB 适配器将电缆的另一面连接到面包板。

对于 DHT11 传感器,其引脚分布如下 :

将 VCC 引脚连接到 Raspberry Pi 3.3V 引脚,GND 连接 GND,将 DATA 连接到 GPIO 连接器上的4号引脚。最后,在 VCC 和 DATA 引脚之间连接 4.7K 欧姆电阻。下图显示了传感器的最终连接效果:

测试传感器和摄像头

我们现在要依次测试传感器和摄像头。

因为我们要构建一个基于 Node.JS 的应用程序,所以我们将使用 Node 连接 DHT11 传感器。为此,我们将使用已经存在的专用 Node 模块。
你将在项目代码中找到名为 sensors_test 的文件夹下的所有内容。以下是本部分的完整代码:

var sensorLib = require('node-dht-sensor');

var dht_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 () {
            dht_sensor.read();
        }, 2000);
    }
};

if (dht_sensor.initialize()) {
    dht_sensor.read();
} else {
    console.warn('Failed to initialize sensor');
}

以上代码中,首先导入 DHT 传感器所需的模块。然后,每2000ms,我们从传感器读取数据,并使用console.log() 将数据显示在终端。该部分的代码在项目的 GitHub 仓库地址如下:
https://github.com/openhomeautomation/rpi-web-control

现在开始测试代码。从 GitHub 下载代码后,转到 sensors_test 文件夹,然后键入如下命令:

sudo npm install node-dht-sensor

以上命令的运行需要一段时间,请耐心等待。执行完成后,键入以下命令:

sudo node sensors_test.js

执行命令后应该能够看到在终端中打印的温度和湿度的值:

Temperature: 21.00C, humidity: 35.00%

摄像头的测试方法也非常简单。只需转到终端键入以下命令即可:

raspistill -o cam.jpg

然后,转到执行此命令的文件夹,你应该可以看到一张名为 cam.jpg 的照片。

通过 WiFi 监控你的家

我们现在要编写一个基于 Node.js 的应用程序来远程跟踪传感器和摄像头的数据。代码大致由三部分组成:

(1)Javascript 中的服务器代码
(2)包含接口的 HTML 页面
(3)连接以上两者的客户端 Javascript 文件

我们先看看服务器端的 Javascript 代码。它首先包括所需的 Node 模块:

(1)node-dht-sensor 模块来处理DHT传感器
(2)快速处理 HTTP 通信,如Web服务器

代码如下:

var sensorLib = require('node-dht-sensor');
var express = require('express');
var app = express();

我们还包括视图和公共目录。views 目录是我们将存储接口的地方,而公共目录是我们将把 JavaScript 代码和记录的图片放在一起的地方:

app.set('views', __dirname + '/views')
app.set('view engine', 'jade')
app.use(express.static(__dirname + '/public'))

我们将为接口创建路径,以便访问我们的项目:

app.get('/interface', function(req, res){
    res.render('interface');
});

我们将包括 aREST API 的 Raspberry Pi 版本(http://arest.io/),以便我们通过 HTTP 控制 Raspberry Pi:

var piREST = require('pi-arest')(app);

此外,我们还给树莓派设置一个 ID 和名字:

piREST.set_id('1');
piREST.set_name('my_RPi');

最后,我们调用app.listen() 数来启动我们的应用程序:

var server = app.listen(3000, function() {
    console.log('Listening on port %d', server.address().port);
});

界面本身是用 Jade(http://jade-lang.com/)编写的。这将给我们一个 HTML 格式的结果。该文件存储在应用程序的视图目录中。我们添加一些标题,一些容器用于传感器测量,以及一个字段用来存储摄像头记录的图片:

doctype
html
  head
    title Raspberry Pi Interface
    script(src="/js/jquery-2.0.3.min.js")
    script(src="/js/interface.js")
    link(rel='stylesheet', href='/css/style.css')
  body
    header
      div.mainContainer
        h1 Raspberry Pi Interface
        h2 Sensor Readings
        p Temperature: 
          span#temperature 0
          span  C
        p Humidity: 
          span#humidity 0
          span  %

        h2 Camera
        img#camera(src='')

正如你在代码中看到的那样,我们将在 Jade 模板中包含一个 Javascript 文件和一个jQuery。脚本文件将每2000ms调用 Raspberry Pi 的 aREST API 来刷新 DHT11 传感器的测量结果:

setInterval(function() {

  // Update temperature
  $.get("/temperature", function(data) {
    $("#temperature").html(data.temperature);
  });

  // Update humidity
  $.get("/humidity", function(data) {
    $("#humidity").html(data.humidity);
  });

}, 2000);

摄像头每10秒钟拍摄一次照片:

setInterval(function() {

  // Take picture
  $.get("/camera/snapshot");

}, 10000);

界面内的图片每秒刷新一次:

setInterval(function() {

  // Reload picture
  d = new Date();
  $("#camera").attr("src","pictures/image.jpg?" + d.getTime());

}, 1000);

接下来测试界面,转到 pi_node 文件夹并键入如下命令:

sudo npm install node-dht-sensor express pi-arest

稍等一会,继续输入命令:

sudo node pi_node.js

最后,使用任意你最喜爱的浏览器并输入以下地址:

http://raspberrypi.local:3000/interface

如果是在树莓派上,仅仅需要输入以下地址即可:

http://localhost:3000/interface

不出意外,你应该可以看到项目的界面显示如下:

耐心等待传感器测量数据和图片出现在显示屏上。请记住,传感器测量会延迟2秒,图像则延迟10秒。

另外请注意,相机模块的 Node.js 模块 并不完美。在我的系统中,照片的拍摄和最终显示之间有一段延迟。

不过总体来说是成功的,你现在可以远程访问 Raspberry Pi 的传感器数据和摄像头了!

从任何地方访问你的树莓派

现在,我们看到了如何在家庭环境中使用电脑或手机访问这个界面。
这已经很不错了,但如果能够从世界任何地方访问该项目,检查摄像模块拍摄的图片,将会更酷。这其实很简单,接下来我将会告诉你如何实现。

我们将使用一个简单的工具 Ngrok 来实现。这个工具会在你的 Raspberry Pi 和远程服务器之间建立一个通道,因此你可以随时随地访问界面。第一步是下载 Ngrok:
https://ngrok.com/

将文件放在一个文件夹中,并通过 Raspberry Pi 上的终端访问此文件夹。然后键入以下命令:

./ngrok 3000

这将打开 Raspberry Pi 和 Ngrok 服务器之间的连接,确认消息如下所示:

你现在可以尝试一下,并在浏览器中输入网址。你应该可以看到与上一节中相同的界面,这意味着你可以从世界任何地方控制你的系统!

最后一句话:小心这一点。现在任何人都可以使用正确的 URL 访问此界面,现在它只是连接到一个实际上没有连接到任何东西的继电器,但是如果你的整个报警系统已经连接到了 Raspberry Pi,这样任意访问肯定是有风险的!在这种情况下,你最好在服务器上设置一个健壮的登录/密码系统,以便只有你自己可以访问它。

总结

我们构建了一个基于 Node.js 的应用程序来自动访问来自传感器的测量数据。我们还使用一个 Node.js 模块访问 Raspberry Pi 的摄像头模块。最后,我们将所有内容显示在一个漂亮的网页界面上,并且我们还展示了如何使用 Ngrok 从世界任何地方访问我们的项目。

你可以通过在项目中包含更多的传感器来进一步扩展该项目。例如,您可以添加光照强度传感器和运动传感器,在 Node.js 应用程序中显示这些传感器的状态非常容易。

评论