添加温度计和湿度计到【RaspberryPi】

这次我们增加了温度计和湿度计,用来监测房间的温度和湿度,以前我们尝试了液晶显示屏的省电设计。

我以前曾經在溫度計中進行過組裝。
【Python】使用Arduino從溫度傳感器讀取室內溫度並顯示在屏幕上(第一部分)
【Python】使用Arduino從溫度傳感器讀取室內溫度並顯示在屏幕上(第二部分)

然而,独立的湿度计很难理解。
由于资料也很少,对我来说有些门槛较高,
所以这次我会稍微降低难度。

由於有一款難度較低且受歡迎的溫濕度感測器,我打算使用它來進行測試。
由於已經有了一個溫度計套件,所以我將放棄上次的溫度計,並重新進行設計。

素材

    • 温湿度センサ モジュール DHT11

 

    10kΩ 抵抗1本

素材只有这些。我们将把它们添加到上次使用的Arduino电路中。
由于复杂的设计已经集成在模块中,所以工作会很轻松。

创建循环

我参考了以下页面用于测量温度和湿度的DHT11-从基础开始的IoT入门- Arduino。
https://iot.keicode.com/arduino/temperature-dht11.php

Screenshot_20200208[1].png

请注意,图中的DHT11(蓝色部分)是背面朝上的。从左到右分别是 [GND] [NC] [DATA] [VDD]。

输出电源使用了与参考页面相同的8针数字连接器。
橙色和黄色的线是5V,地线是黑色。
电路图我已经做得很简单了,但实际电路有些拥挤。

IMG_20200208_1729.jpg

计划之后还要加上气压计,不知道会怎样。

Arduino 编程代码

#include <DHT.h>

// Initializing DHT11 sensor
const int PIN_DHT = 8;
DHT dht(PIN_DHT, DHT11);

void setup() {

  //start serial connection
  Serial.begin(9600);

  //configure pin A3 as an input and enable the internal resistor
  pinMode(A3, INPUT);

  // start DHT11 sensor
  dht.begin();

}

void loop() {

  // Whether to display in Fahrenheit
  bool isFahrenheit = false;

  // Get humidity and temperature
  float percentHumidity = dht.readHumidity();
  float temperature = dht.readTemperature(isFahrenheit);

  // Do nothing if not available
  if (isnan(percentHumidity) || isnan(temperature)) {
    return;
  }

  // Get heat index
  float heatIndex = dht.computeHeatIndex(
    temperature,
    percentHumidity,
    isFahrenheit
  );

  //read the photocell value into a variable
  int photocell = analogRead(A3);

  //print out the sensor value in csv format
  String s = "";
  s += String(temperature, 1) + ",";
  s += String(percentHumidity, 1) + ",";
  s += String(heatIndex, 1) + ",";
  s += String(photocell);
  Serial.println(s);

  //delay 2000 ms
  delay(2000);

}

追加的代码大部分是对 DHT11 库的操作。
由于想要以摄氏度显示温度,所以设定了 bool isFahrenheit = false; 。

另外,由於處理變得複雜,所以我們選擇了每2秒進行一次循環。只是為了以防萬一。

通过数字8引脚从数字信号读取,将包括上一次光照传感器的数值,以CSV格式输出。

添加DHT库

DHT库可以从Arduino IDE的库管理器中添加。
您可以从菜单中选择“工具→库管理器”。

Screenshot_20200208[2].png
Screenshot_20200208[3].png

创建数据库、用户和表格

从这次开始,将传感器信息写入数据库。

由于串行连接无法同时完成多个操作,因此我们通过运行将数据写入数据库的程序,并通过其他程序参考数据库来共享信息。(尽管可能有其他方法,但我们寻求一种无需额外花费的方式)

$ mysql -u root -praspberry 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.1.38-MariaDB-0+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE sensor;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> CREATE USER 'sensorpi'@'localhost' IDENTIFIED BY 'raspberry';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON sensor.* TO 'sensorpi'@'localhost';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> SELECT user, password, plugin FROM user;
+------------+-------------------------------------------+--------+
| user       | password                                  | plugin |
+------------+-------------------------------------------+--------+
| root       | ***************************************** |        |
| phpmyadmin | ***************************************** |        |
| fxpi       | ***************************************** |        |
| sensorpi   | ***************************************** |        |
+------------+-------------------------------------------+--------+
4 rows in set (0.01 sec)

MariaDB [mysql]> QUIT;
Bye
pi@raspberrypi:~ $ mysql -u sensorpi -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 34
Server version: 10.1.38-MariaDB-0+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> USE sensor;
Database changed
MariaDB [sensor]> CREATE TABLE tbl_serval (time DATETIME,
    -> max_temperature FLOAT, avg_temperature FLOAT, min_temperature FLOAT,
    -> max_humidity FLOAT, avg_humidity FLOAT, min_humidity FLOAT,
    -> max_heatIndex FLOAT, avg_heatIndex FLOAT, min_heatIndex FLOAT,
    -> max_pressure INT, avg_pressure INT, min_pressure INT,
    -> max_photocell INT, avg_photocell INT, min_photocell INT);
Query OK, 0 rows affected (0.05 sec)
項目設定値データベースsensorユーザーsensorpiテーブルtbl_serval

tbl_serval的结构大致如下。
NULL允许所有列,但将来会进行修正。

serval 是 SERial VALue 的缩写。

列名型NULL説明timeDATETIME許容記録時刻max_temperatureFLOAT許容温度(最大)avg_temperatureFLOAT許容温度(平均)min_temperatureFLOAT許容温度(最小)max_humidityFLOAT許容湿度(最大)avg_humidityFLOAT許容湿度(平均)min_humidityFLOAT許容湿度(最小)max_heatIndexFLOAT許容体感温度(最大)avg_heatIndexFLOAT許容体感温度(平均)min_heatIndexFLOAT許容体感温度(最小)max_pressureINT許容気圧(最大)avg_pressureINT許容気圧(平均)min_pressureINT許容気圧(最小)max_photocellINT許容照度(最大)avg_photocellINT許容照度(平均)min_photocellINT許容照度(最小)

Python 编程代码

因为做了许多修改,所以只给出概要。
如果您对更改部分感兴趣的话,请随意查看 GitHub(mySensor) 和 GitHub(DesktopClock)。

    • 2秒ごとにセンサー情報(CSV 形式)を受信して分割

 

    • 1分間で集計して最大・平均・最小値を算出

 

    • データベースに書き込む

 

    • 置き時計プログラム(DesktopClock)側をシリアル接続から DB 接続に変更

 

    1分ごとに DB から最新の値を取得して画面に表示する
Screenshot_20200208[4].png

小玩笑

在照度低于50的情况下,我们设定了关闭背光的机制。
但在最近的改变之后,即使房间变暗了背光也不会立即熄灭,而是要过一段时间才能自动关闭,反应变得非常迟缓。
当重新启动Python程序后,问题会得到解决,但不久后问题又会再次发生。

经过种种调查结果表明,接收缓冲区似乎是问题的原因。

# 受信バッファをフラッシュする
self.ser.flushInput()

如果不这样做,串行连接和同步将无法进行,并且随着时间的推移,延迟的范围会不断增大。

虽然感觉有些模糊,但由于延迟问题已解决,所以应该是这样的意思。

广告
将在 10 秒后关闭
bannerAds