添加温度计和湿度计到【RaspberryPi】
这次我们增加了温度计和湿度计,用来监测房间的温度和湿度,以前我们尝试了液晶显示屏的省电设计。
我以前曾經在溫度計中進行過組裝。
【Python】使用Arduino從溫度傳感器讀取室內溫度並顯示在屏幕上(第一部分)
【Python】使用Arduino從溫度傳感器讀取室內溫度並顯示在屏幕上(第二部分)
然而,独立的湿度计很难理解。
由于资料也很少,对我来说有些门槛较高,
所以这次我会稍微降低难度。
由於有一款難度較低且受歡迎的溫濕度感測器,我打算使用它來進行測試。
由於已經有了一個溫度計套件,所以我將放棄上次的溫度計,並重新進行設計。
素材
-
- 温湿度センサ モジュール DHT11
- 10kΩ 抵抗1本
素材只有这些。我们将把它们添加到上次使用的Arduino电路中。
由于复杂的设计已经集成在模块中,所以工作会很轻松。
创建循环
我参考了以下页面用于测量温度和湿度的DHT11-从基础开始的IoT入门- Arduino。
https://iot.keicode.com/arduino/temperature-dht11.php
请注意,图中的DHT11(蓝色部分)是背面朝上的。从左到右分别是 [GND] [NC] [DATA] [VDD]。
输出电源使用了与参考页面相同的8针数字连接器。
橙色和黄色的线是5V,地线是黑色。
电路图我已经做得很简单了,但实际电路有些拥挤。
计划之后还要加上气压计,不知道会怎样。
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的库管理器中添加。
您可以从菜单中选择“工具→库管理器”。
创建数据库、用户和表格
从这次开始,将传感器信息写入数据库。
由于串行连接无法同时完成多个操作,因此我们通过运行将数据写入数据库的程序,并通过其他程序参考数据库来共享信息。(尽管可能有其他方法,但我们寻求一种无需额外花费的方式)
$ 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)
tbl_serval的结构大致如下。
NULL允许所有列,但将来会进行修正。
serval 是 SERial VALue 的缩写。
Python 编程代码
因为做了许多修改,所以只给出概要。
如果您对更改部分感兴趣的话,请随意查看 GitHub(mySensor) 和 GitHub(DesktopClock)。
-
- 2秒ごとにセンサー情報(CSV 形式)を受信して分割
-
- 1分間で集計して最大・平均・最小値を算出
-
- データベースに書き込む
-
- 置き時計プログラム(DesktopClock)側をシリアル接続から DB 接続に変更
- 1分ごとに DB から最新の値を取得して画面に表示する
小玩笑
在照度低于50的情况下,我们设定了关闭背光的机制。
但在最近的改变之后,即使房间变暗了背光也不会立即熄灭,而是要过一段时间才能自动关闭,反应变得非常迟缓。
当重新启动Python程序后,问题会得到解决,但不久后问题又会再次发生。
经过种种调查结果表明,接收缓冲区似乎是问题的原因。
# 受信バッファをフラッシュする
self.ser.flushInput()
如果不这样做,串行连接和同步将无法进行,并且随着时间的推移,延迟的范围会不断增大。
虽然感觉有些模糊,但由于延迟问题已解决,所以应该是这样的意思。