本帖最后由 Sven.Zhang 于 2024-4-6 22:26 编辑
一、硬件基本构成
1、DHT11温湿度传感器(传感器技术参数的对比):
在这里我们使用DHT11传感器用于测量环境温度和湿度,因为DHT11和DHT22的区别在于DHT22在温度和湿度的测量范围,精准度上相较DHT11都提升了不少(不过采样率方面DHT11比DHT22高)。
DHT11产品的引脚定义如下:
接线方面DHT11传感器的1口VCC接3-5V的电压源,2口可以接到ESP32任意的输入口,3口空置,4口接地。DHT11和DHT12使用了自己定义的单线传输协议,在这里我们不用造轮子可以直接使用第三方库DHT sensor libray for ESPx。
使用DHT11产品的第三方模块库:
2、0.96寸OLED显示屏
这个项目使用0.96寸,128*64像素,SSD1306主控的OLED显示屏。
OLED显示屏端口:
ESP32开发板的端口定义:
OLED显示屏有四个端口,GND口接地,VDD口接3V-5V电压源,SCK口接ESP32开发板的IO22(SCL),SDA口接ESP32开发板的IO21(SDA)。通讯协议这里我们使用I2C协议与SSD1306主控交互。在这里我们使用第三方库Adafruit SSD1306。
https://link.zhihu.com/?target=https%3A//github.com/adafruit/Adafruit_SSD1306
OLED显示屏第三方库文件:
3、软件代码
- #include <SPI.h>
- #include <Wire.h>
- #include <DHTesp.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
-
- #define SCREEN_WIDTH 128 // 定义显示屏宽度为128像素
- #define SCREEN_HEIGHT 64 // 定义显示屏高度为64像素
- #define OLED_RESET -1 // -1表示共享和ESP32的复位信号
- #define SCREEN_ADDRESS 0x3C // OLED显示屏I2C总线的地址,查数据手册可知,一般为0x3C或者0x3D
- /* 初始化DHT11传感器对象*/
- DHTesp dht;
- /* 定义DHT11传感器的数据线*/
- #define dhtPin 18
- /* 初始化OLED显示屏对象,传入我们之前定义好的值*/
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
-
- void setup() {
- /* 打开串口通讯,用于输出调试信息,如果连接OLED显示屏SSD1306主控失败的话会在Arduino
- 的端口显示器显示错误信息*/
- Serial.begin(115200);
- dht.setup(dhtPin, DHTesp::DHT11);
- if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
- Serial.println(F("SSD1306 allocation failed"));
- for(;;); // 表示连接主控失败
- }
- display.clearDisplay();// 清空显示缓存
- }
-
- void loop() {
- /* 获取DHT11传感器测量的温湿度值并保存在一个TempAndHumidity结构体里*/
- TempAndHumidity lastValues = dht.getTempAndHumidity();
- /* 在显示屏输出温度值和湿度值*/
- display.clearDisplay();
- display.setTextColor(WHITE);
- display.setCursor(20,0);
- display.setTextSize(2);
- display.println(String(lastValues.temperature,0)+" C");
- display.setCursor(20,15);
- display.println(String(lastValues.humidity,0)+" %");
- /*判读温度在18到25度之间,湿度在百分之40到70之间为适宜温度,以笑脸作为提示*/
- display.setCursor(20,40);
- if((lastValues.temperature >= 18 && lastValues.temperature <=25) && (lastValues.humidity >= 40 && lastValues.humidity <=70))
- {
- display.println("(^_^)");
- }
- else /*判读温度或者湿度不适宜,以哭脸作为提示*/
- {
- display.println("(T_T)");
- }
- display.display();
- delay(2000);
-
- }
复制代码
4、运行效果与总结
运行效果可参见如下图。如果ESP32接上移动电源的话就能成为一个便携式温湿度计,可以放在不同的位置进行测量。可以看到ESP32借助完善的第三方库可以很方便快捷地实现一个温湿度计的功能。
最后的一个优势是,ESP32芯片集成蓝牙和WIFI功能,在之后帖子中我将介绍如何使用手机的蓝牙功能获得温湿度传感器的数据以及如何使用ESP32的WIFI功能搭建一个网站显示温湿度传感器的数据。 |