树莓派和Arduino联姻:人人都可以DIY的智能家居监控系统

开源硬件领域有两大法宝,树莓派和Arduino,如果你手上正好有这两样东西,那么恭喜你,接下来你可以极为简单的构建一个家庭监控系统。本篇文章将指导您完成每一步骤,确保你不会遇到问题。

介绍

首先,肯定有工程师会有疑问,为什么要将树莓派和Arduino一起使用?树莓派具有适用于简单布尔任务(开或关)和读取一些低端温度传感器的GPIO,这样就够了吗?没有!对于更复杂的系统,我们需要使用微控制器来完成繁重的工作,比如Arduino,它具有带多个通道的ADC(模数转换器),PWM(脉冲宽度调制)通道和非常精确的时序。

例如,如果您想测量房屋的电能消耗,您需要一个电流互感器和一个基本电路,它将输出你可以使用ADC测量的电压。如果你想输出介于1和0之间的东西,比如可以产生像呼吸灯一样效果的LED,就可以使用PWM输出。最后,如果您需要具有非常精确定时的设备(如PID系统,多路复用LED阵列或控制步进电机),则需要一个微控制器。在本文的例子中,我们将使用Arduino Uno作为微控制器。

BOM和硬件原框图

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

Arduino Uno(如果你愿意,可以使用不同的Arduino产品)

树莓派(同样,树莓派的任何产品都可以)

树莓派电源(针对最新的树莓派3b+,最好配上一个额外的电源)

安装了Raspbian系统的SD卡(Raspbian Lite也可以)

传感器和Arduino的其它模块(取决于你想要实现什么功能)

Arduino IDE,Raspbian,C / C ++,HTML和javascript的基础知识(其实只需了解C / C ++,那就足够了。)

硬件原理框图并不复杂,取决于您想要实现的功能。在这个例子中,我使用了温度/湿度传感器和LED。

Arduino代码

为简单起见,这里仅展示如何从DHT11传感器读取温度和湿度以及如何远程闪烁LED。

数据通过串口以9600的波特率发送。在主函数中,我们读取串口并检查收到的内容。如果我们收到字符串“thl”,则意味着我们需要通过串口从传感器发送数据。为了使此功能正常工作,我们使用while循环并反复发送数据,直到我们收到“ok”以知道数据已到达服务器。如果我们收到字符串“led”,我们只是闪烁LED。在这里你可以添加你想要的任何函数和字符串——只需记住使用“thl”发送数据。

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

root["name_of_data"] = function_that_return_data();

“function_that_return_data()”如下所示:

int function_that_return_data(){

int data;

//insert code that reads data from a sensor and attributes the value to variable 'data'

return (data);

}

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

#include "ArduinoJson.h"

#include "dht.h"

dht DHT; //give name to your DHT sensor

#define DHT11_PIN A0 //Pin for DHT11 data

#define LED_PIN A1 //PIN for LED

void setup()

{

Serial.begin(9600);

}

void loop()

{

String str;

str = Serial.readString(); //Read serial

str.toLowerCase(); //Convert to lowercase

if (str == "thl")

do

{

str = Serial.readString(); //Read the serial again

send_data(); //Call send data function

} while (str != "ok"); //Continue to send data until we receive an "ok"

if (str == "led") {

digitalWrite(LED_PIN, HIGH); // turn the LED on (HIGH is the voltage level)

delay(1000); // wait for a second

digitalWrite(LED_PIN, LOW); // turn the LED off by making the voltage LOW

}

}

void send_data()

{

StaticJsonBuffer 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的Web服务器,下面是完成此步骤的过程以及所需的其他组件(如PHP)。

这里先来解释一些基础知识。首先,您需要在树莓派上安装Raspbian系统,可以将键盘和显示器连接到树莓派并且上电,或者熟练的朋友也可以通过SSH进行操作。无论使用哪种方法,请记住所有命令都需要以root身份运行,否则你将收到权限错误,这可以通过在前面写“sudo”来完成。Let's go!!!

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

sudo apt-get update

sudo apt-get upgrade

安装NGINX,PHP和git。询问时,输入“y”并按Enter键。

sudo apt-get install nginx php5-fpm git

而后需要更改默认的NGINX目录并使其与PHP一起使用。

cd /etc/nginx

sudo nano sites-enabled/default

下面是修改完成后的代码。

server {

listen 80; ## listen for ipv4; this line is default and implied

listen [::]:80 default_server ipv6only=on; ## listen for ipv6

root /var/www;

index index.html index.php;

# Make site accessible from http://localhost/

server_name _;

location / {

index index.html index.php;

# First attempt to serve request as file, then as

# directory, then fall back to the 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。

sudo service nginx restart

要测试是不是一切正常,可以创建一个PHP测试页面。

cd /var/www

sudo nano test.php

并将其放入test.php文件中:

phpinfo();

?>

现在定位到Raspberry-Pi-Ip-Address / test.php(例如: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

有了这些文件,我们先来看看是些什么内容。

/ img 文件夹:包含缩略图和索引页面的背景图像

ArduinoCode.ino:包含Arduino草图的文件

PhpSerial.php: PHP库,允许我们使用PHP通过串口与Uno进行通信

Style.css: 页面的CSS

Main.html: 包含javascript,按钮和可视数据的最重要的页面

Relay.php: 启动与Arduino通信的文件

下面将解释如何添加项目。要添加新按钮,只需添加以下行:

On/Off

Thumbnail_Image是要用作缩略图的图像的路径(请记住将其放在/ img文件夹中)。Name_action是您要为按钮选择的名称。您可以在此处查看可以使用的按钮类型。

定位到文件的底部,您可以在其中看到“$(”#led-button“)行。单击(blinkLED);” 并在下面添加:

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

在它上面,添加与它相关的功能:

function Function_Name (){

$.get(url + "Parameter")

}

“参数”是按下按钮时将通过串口发送到Arduino的字符串。它需要与sketch内的函数相关联,这个在文章上面部分的“Arduino Code”中讨论过。

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

Display_data:

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

还记得当我说我们将收到JSON数据时吗?这是它派上用场的地方。搜索“getLuminosityTemperatureHumidity()”函数,并在其末尾添加:

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

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

有一个函数会每隔10秒调用一次这个函数,就是这样。

setInterval(getLuminosityTemperatureHumidity,10000);

如果你愿意,可以更改时间。另外,我也解释一下relay.php脚本是如何工作的?每次像“getLuminosityTemperatureHumidity()”这样的函数调用时它都会打开。为了工作,它使用PhpSerial库。以“$ serial->”开头的前8行是建立与Arduino的串行连接。

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

“sleep(2);” 需要一行,因为Arduino在我们打开串行连接的最初几刻没有响应。之后,我们将通过GET方法接收的参数“$ _GET [”command“]”发送到Arduino,如果该命令是“thl”,我们从微控制器读取输入数据。收到数据后,我们发送“确定”并返回数据,如此而已。

下面是你项目应遵循的操作方式:

调试

如果你遇到问题,例如没有接收数据,最简单的开始调试的地方就在你的浏览器中。

使用Chrome来获取这些说明:只需按F12,转到网络选项卡,单击,按F5刷新并单击“relay.php?command = thl”。如果一切正常,数据应如下面的屏幕截图所示:

最后,希望你们喜欢这个项目。

END

欢迎加入微信群

加入与非社群,找到同道,一起切磋技艺、化解难题。当然还有不定期的红包雨等着你哦!

添加小编微信后,回复对应关键词+公司+岗位,方可被拉入社群,否则一律禁止入群,每人只可申请一个技术群。

关键词:嵌入式、模拟、人工智能、RF、传感器、汽车电子、物联网、IC设计、EDA、PCB、开源硬件、树莓派。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190129B051TI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券