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

2019年01月27日 作者:白小白_3003415

开源硬件领域有两大法宝,树莓派和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<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);
}

1 2 3

相关文章