树莓派与Arduino串口通讯获取DH11温度湿度

本文记录通过树莓派USB连接Arduino进行通讯的过程。
实现的功能:
Arduino上连接机智云GoKit开发套件,获取DH11温度与湿度返回给树莓派。

原材料:

树莓派b3+
Arduino Uno R3

Arduino代码编写

首先我们需要调用DHT获取温度湿度数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <DHT.h>

#define DHTPIN 3
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
// put your setup code here, to run once:

Serial.begin(9600);

dht.begin();

Serial.println("Hi Vcancy. Arduino is running...");

}

/**
Arduino loop
@param none
@return none
*/
char target[] = "GET TH";

void loop() {
// 每次等待2秒后再输出(这里必须等大于1秒,不然不准确)
delay(2000);
// 从串口读数据并判断
if (Serial.available() > 0) {
if ( Serial.find(target)) {
// 获取温度或者湿度需要250毫秒!
// 传感器获取到的温度和湿度可能是2秒内的

float h = dht.readHumidity();// 读取当前的湿度

float t = dht.readTemperature(); // 读取当前的温度,单位C

float f = dht.readTemperature(true);//读取当前的温度,单位F

// 如果读取失败则退出,再读取一次
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}

// 读取体感温度,单位F
float hif = dht.computeHeatIndex(f, h);
// 读取体感温度,单位C
float hic = dht.computeHeatIndex(t, h, false);

Serial.print("湿度: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("温度: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("体感温度: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}
}

}

串口调试:输入 “GET TH”,串口返回数据

image.png

树莓派

树莓派USB连接到Arduino

ls /dev

找到Arduino的串口地址:/dev/ttyUSB0

编写一个python程序,调用串口获取数据。

安装pyserial,串口库
pip install pyserial

编写一个python脚本

1
2
3
4
5
6
7
8
9
10
11
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

try:
while 1:
ser.write(b"GET TH")
response = str(ser.readline().decode())
if response.startswith('湿度:'):
print(response.strip('\n'))
except KeyboardInterrupt:
ser.close()

image.png