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

本文记录了在树莓派开发时,通过串口获得Arduino开发板上采集到的温湿度,并显示在树莓派上,使用python读取Arduino串口的数据,获得温湿度采集器采集到的温湿度,然后在树莓派上做数据处理;
需要的库文件DHT.h,如果运行报错,请先添加这个库文件,下载地址:https://github.com/adafruit/DHT-sensor-library
下载的文件中只要包含 .h 和 .cpp 文件即可,多余的可以删掉,用不到
树莓派与Arduino串口通讯获取DH11温湿度

Arduino代码:

运行时如果报/x86或者ASCII码无法解析错误。可以将代码中的中文全部换成英文,就不会错了,可能是因为无法识别中文

#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 改为了数字8,并且修改了一下输出,下面你们可以看到我做的更改,应该更符合同学们对数据处理的要求,这里你们在测试时仍然可以输入GET TH进行测试:
树莓派与Arduino串口通讯获取DH11温湿度

树莓派代码(python):

需要先安装python串口读取的库文件:pip install pyserial
(如果已经安装过了则忽略)
找到Arduino的串口地址:/dev/ttyACM0

import serial
ser = serial.Serial('/dev/ttyACM0', 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()

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

如果要单截取采集到的温湿度,对数据进行处理,而不需要打印所有信息,我们可以在python和Arduino做如下更改:

首先在Arduino中,我们不需要像串口打印那么多数据,只取我们需要的温湿度,像这样(效果同上面的GIF):

    Serial.print("hum: ");
    Serial.print(h);
    Serial.print("tem: ");
    Serial.println(t);
    // 打印出效果如下:hum: 33.0tem: 25.00

然后在python中,我们通过字符串截取,取到我们的温湿度,这里我们截取两位整数

    response = str(single.readline().decode())
    if response.startswith('hum:'):
        #截取整数部分
        hum = response[5:7] #33
        tem = response[-6:-3] # 25
        # 将处理后的数据放在templateData 中
        templateData = {
            'tem': tem,
            'hum': hum
        }
        print(response.strip('\n'))

到这里我们就做好了简单的数据处理,更多的操作可以自己根据需求去修改