雷竞技注册
项目

与Arduino和Raspberry Pi的房屋监测框架:偏执狂应用程序

2016年6月3日,经过Cezar Chirila

学习如何使用树莓派和Arduino开发一个系统来监控和控制您的家。

你有一个树莓派和Arduino你想开发一个系统来监控你的家。如果我没看错的话,在你读完这篇文章后,你就能做你想做的事了。

网上有很多文章,但大多数不是太基本,就是甚至跳过了一些步骤。我会指导你完成每一步,确保你不会遇到任何已知的问题。

介绍

首先,为什么要同时使用Arduino和树莓派呢?Pi有gpio,对于简单的布尔任务(开或关)和读取一个廉价的温度传感器非常好。这就足够了吗?不!对于更复杂的系统,你会想使用一个微控制器来做繁重的工作。它有一个ADC与多个通道(模拟到数字转换器),PWM(脉冲宽度调制)通道,和非常准确的定时。

例如,如果你想测量你房子的电能消耗,你需要一个电流互感器和一个基本电路,输出一个你可以使用ADC测量的电压。如果你想输出在1和0之间的东西,比如说让LED褪色,你会使用PWM输出。最后,你需要一个微控制器,如果你需要一些非常精确的定时如PID系统,多路复用一个LED阵列,或控制步进电机。在我们的例子中,我们将使用Arduino Uno作为微控制器。

BOM和示意图

对于这个项目,您将需要以下内容:

  • Arduino Uno(虽然你可以使用不同的Arduino产品如果你愿意。)
  • 树莓派(我用的是Pi Zero,但任何一个都可以)。
  • 树莓派电源
  • SD卡安装了Raspbian(Raspbian Lite也可以。)
  • Arduino的传感器和其他模块(这将基于您想要完成的。)
  • Arduino IDE,Raspbian,C / C ++,HTML和JavaScript的基本知识(别担心。如果您已经知道C / C ++,那就足够了。)

原理图并不是很复杂,取决于您想要实现的内容。在该示例中,我使用温度/湿度传感器和LED。

Arduino Code.

为了简单起见,我在这里只展示如何从DHT11传感器读取温度和湿度,以及如何远程闪烁LED。对于你的实际项目,你会想要一些更复杂的东西,因为这可以用一个树莓派来完成。如果你想从这个开始,这里有一个示意图:

让我们从基础开始。数据以9600的波特率在串口发送。在主函数中,我们读取了串行端口,我们检查我们收到的内容。如果我们收到字符串“THL”,则意味着我们需要在串行端口上从传感器发送数据。对于此功能正常工作,我们使用一段时间循环并在我们接收到“确定”以知道数据已到达服务器之前发送数据。如果我们收到字符串“LED”,我们只是闪烁LED。在这里,您可以添加所需的任何函数和字符串 - 只需要使用“THL”来发送数据。

你需要知道的是,我们以JavaScript对象表示法(JSON)的形式发送数据。JavaScript对象表示法是一种用于传输数据对象的开放源码格式。之所以使用它,是因为我们可以使用javascript轻松地在main.html文件中使用该数据。要使用它,我们需要一个名为ArduinoJson的库,您可以找到这个库在这里或下载。函数“send_data()”顾名思义:它以JSON形式通过串口发送数据。要添加数据,你只需要在这个函数中添加如下所示的一行:

根(“name_of_data”)= function_that_return_data ();

其中“function_that_return_data()”是这样的:

Int function_that_return_data(){Int数据;//插入代码,从传感器读取数据,并将值属性为变量'data'返回(data);}

这就是Arduino部分的全部内容。下面您可以看到我为这个DHT11传感器和LED的特殊情况编写的确切代码。

//房子监控框架与arduino和raspberry pi // cezar chirila //allaboutcircuars.com //epileopsynerd.wordpress.com #include“arduinojson.h”#include“dht.h”dht dht;//为DHT传感器#define DHT11_PIN A0 // PIN用于DHT11数据#Define LED_PIN A1 // PIN用于LED void Setup(){Serial.Begin(9600);void循环(){string str;str = serial.readstring();//读取串行str.TolowerCase();//转换为小写(str ==“thl”)do {str = serial.readstring();//再次读取序列号send_data();//呼叫发送数据函数}(str!=“确定”);//继续发送数据,直到我们收到“确定”(str ==“LED”){DigiteWrite(LED_PIN,HIGH);//转动LED(高电平电压电平)延迟(1000); // wait for a second digitalWrite(LED_PIN, LOW); // turn the LED off by making the voltage LOW } } void send_data() { StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["temp"] = get_temperature(); root["humidity"] = get_humidity(); root.printTo(Serial); Serial.println(); } int get_temperature() // function that return the temperature as an integer { int temperature; DHT.read11(DHT11_PIN); temperature = DHT.temperature; return (temperature); } int get_humidity() //function that return the temperature as an integer { int humidity; DHT.read11(DHT11_PIN); humidity = DHT.humidity; return (humidity); }

在树莓派上设置Web服务器

我们将使用树莓派作为网络服务器使用NGINX。我将指导您完成安装它的每个步骤,以及所需的其他组件,比如PHP。

让我们来解释一些基本知识。首先,你需要在Pi上安装Raspbian并连接网络。现在,您可以将键盘和显示器连接到主板并打开终端,或者像我所做的那样通过SSH进行操作。无论使用哪种方法,请记住所有命令都需要以root身份运行;否则,您将得到一个权限错误。这是通过在前面写“sudo”来完成的。说了这么多,我们开始吧。

首先,让我们更新存储库和包。如果您不熟悉Linux,那么它所做的就是更新安装包(应用程序)的位置,然后更新它们。

Sudo apt-get update Sudo apt-get upgrade

我们想安装nginx,php和git(可选,但使您的生活更轻松)。当被问到时,键入'y'并按Enter键。

安装nginx php5-fpm git

现在,我们需要改变默认的NGINX目录,让它与PHP一起工作。

/etc/nginx sudo nano sites-enabled/default

您需要使该文件看起来像这样:

服务器{监听80;##监听ipv4;这一行是默认的,隐含着listen [::]:80 default_server ipv6only=on;##监听ipv6 root /var/www;指数index . html index . php。#让网站从http://localhost/ server_name _;位置/ {index.html index.php;#首先尝试以文件的形式提供请求,然后以目录的形式提供请求,然后返回到CMS。try_files uri uri美元/ index . html;} location /doc/ {alias /usr/share/doc/; autoindex on; allow 127.0.0.1; allow ::1; deny all; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi.conf; } }

现在重启NGINX。

重启nginx服务

要测试一切是否正常工作,请制作一个PHP测试页面。

CD /var/www sudo nano test.php

然后把这个放到test.php文件中:

<?php phpinfo();?>

现在导航到Raspberry-Pi-Ip-Address/test.php (Ex: 192.168.0.2/test.php)。

如果你看到一个页面的PHP信息如下所示,那么它工作,你应该继续下一步。

如果它不起作用,那么再读一遍这部分,看看你是否做错了什么。

最后一步是输入这段代码,允许用户www-data (NGINX使用的用户)访问串口。

sudo usermod -a -g dialout www-data

在此之后,请更重启并休息一下。你应得的。

网站文件

坚持住,我们马上就好了。你只需要下载文件到你的树莓派和编辑他们的需要。

你可以手动下载文件并把它们放到/var/www或者你可以执行这个命令并自动从github下载它们:

cd /var/www sudo git clone https://github.com/alexonaci/Paranoid/tree/AAC

现在我们有文件,让我们检查一下。只要你知道,我们正在使用Bootstrap来模拟我们的网站,以便它是移动兼容的,看起来不错。

  • /img文件夹:包含索引页面的缩略图和背景图像
  • ArduinoCode.ino:包含Arduino草图的文件
  • PhpSerial.php:一个PHP库允许我们使用PHP通过串行与Uno通信
  • Style.css:页面的CSS
  • Main.html:包含javascript、按钮和可视化数据的最重要的页面
  • Relay.php:启动与Arduino通信的文件

你只需要担心main.html页面;其余的就保持原样吧。当然,如果你愿意,你可以根据自己的喜好定制它们——毕竟这是你的项目。

我将在这里解释如何添加项。要添加一个新按钮,只需添加这一行:

Thumbnail_Image是你想要作为缩略图使用的图像的路径(记得把它放在/img文件夹中)。Name_action是您希望为按钮选择的名称。您可以检查您可以使用的按钮类型在这里

导航到您可以看到行“$(”#LED-BUTTON“)的文件的底部。点击(眨眼);”并在它下面添加:

$ (" # Name_action ") .click (Function_Name);

在它上面,添加与它相关的函数:

函数函数_name(){$ .get(url +“参数”)}

“参数”是字符串,它将被发送到您的Arduino串口,当您按下按钮。它需要与草图中的一个函数相关联。我们在Arduino代码那一章讲过。

要在屏幕上添加一个新项目,该项目将显示Arduino发送的值,如传感器数据,添加以下类型的项目:

Display_data:

其中“Display_data”是将出现在数据之前的名称,例如“temperature:”,而DataID是标识符。

请记住,当我说我们将收到JSON的数据?这是它方便的地方。搜索“GetLuminosityTemperatureHumityHumityHumity()”功能,只需添加到它的末尾:

$ (" # DataID ") . html (parsedJSON.name_of_data);

其中“name_of_data”是您为Arduino Code部分中的数据选择的字符串。

有一个函数将每10秒调用一次此功能,即它。

setInterval (getLuminosityTemperatureHumidity, 10000);

如果您愿意,您可以更改时间。

剩下需要我向您解释的就是relay.php脚本是如何工作的。每当调用像“getLuminosityTemperatureHumidity()”这样的函数时,它都会打开。为了工作,它使用PhpSerial库。以“$serial->”开头的前8行是为了建立到Arduino的串行连接。

注意力!每次执行此脚本时,Arduino将重置。如果你不希望发生这种情况,只需连接一个10uF电容的负引脚到GND和正引脚重置。

现在我们已经走了,让我们继续。“睡眠(2);”需要线路,因为当我们打开串行连接时,Arduino对前几个瞬间没有响应。之后,我们将通过Get方法“$ _get [”命令“]”“发送到Arduino的参数,以及该命令是”THL“,我们从微控制器中读取传入数据。收到数据后,我们发送“确定”并返回数据。就是这样。

以下是遵循以下步骤后,您的项目应该如何查看:

调试

如果遇到问题,比如无法接收数据,那么最容易开始调试的地方就在浏览器中。你需要使用Chrome来完成以下操作:只需按F12,进入网络选项卡,点击它,按F5刷新,然后点击"relay.php?command=thl"。如果一切正常,数据应该如下图所示:

享受你的房屋监控系统。如果你有任何问题,请把它们放在评论区,我会尽我所能帮助你。

学分

这是2016年3月26日由Academy+Plus举办的#HomeHackers黑客马拉松的一个产品,由Bira Gabriel, Chindris Mihai, Daniel Lupaescu, Onaci Alexandru和我,Cezar Chirila合作。

Paranoid-AAC.zip

自己试试这个项目吧!BOM。

10评论
  • V.
    Vabeachmike 2016年6月10日

    如果你已经有了Pi,为什么还要用Arduino ? ?

    喜欢的。 回复
    • P.
      菲利尔森 2016年6月12日
      显然,您没有阅读第一个段落,题为“介绍”!
      喜欢的。 回复
      • V.
        Vabeachmike 2016年6月12日
        你是正确的! !哈哈,但现在我有了,我仍然不明白,因为树莓派*确实*有PWM输出,你可以添加一个高精度的ADC板到它非常便宜。
        喜欢的。 回复