【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块
OV2640/5640摄像头模组
{花雕动手做}项目之二十九:ESP32-S3 CAM使用DHT11模块测量温湿度
实验开源代码
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块
- OV2640/5640摄像头模组
- {花雕动手做}项目之二十九:ESP32-S3 CAM使用DHT11模块测量温湿度
- */
-
- #include "DHTesp.h" // 点击这里获取库: http://librarymanager/All#DHTesp
- #include <Ticker.h> // 引入Ticker库,用于定时任务
-
- #ifndef ESP32
- #pragma message(THIS EXAMPLE IS FOR ESP32 ONLY!)
- #error Select ESP32 board.
- #endif
-
- /**************************************************************/
- /* 示例如何使用多任务从ESP32读取DHT传感器。 */
- /* 该示例依赖于Ticker库每20秒唤醒一次任务。 */
- /**************************************************************/
-
- DHTesp dht; // 创建DHTesp对象
-
- void tempTask(void *pvParameters); // 声明温度任务函数
- bool getTemperature(); // 声明获取温度函数
- void triggerGetTemp(); // 声明触发获取温度函数
-
- /** 任务句柄,用于读取温度任务 */
- TaskHandle_t tempTaskHandle = NULL;
- /** 用于读取温度的Ticker */
- Ticker tempTicker;
- /** 舒适度状态 */
- ComfortState cf;
- /** 任务是否应该运行的标志 */
- bool tasksEnabled = false;
- /** DHT11数据引脚的引脚号 */
- int dhtPin = 1;
-
- /**
- * initTemp
- * 设置DHT库
- * 设置任务和定时器以重复测量
- * @return bool
- * true 如果任务和定时器已启动
- * false 如果任务或定时器无法启动
- */
- bool initTemp() {
- byte resultValue = 0;
- // 初始化温度传感器
- dht.setup(dhtPin, DHTesp::DHT11);
- Serial.println("DHT initiated");
-
- // 启动任务以获取温度
- xTaskCreatePinnedToCore(
- tempTask, /* 实现任务的函数 */
- "tempTask ", /* 任务名称 */
- 4000, /* 堆栈大小(字) */
- NULL, /* 任务输入参数 */
- 5, /* 任务优先级 */
- &tempTaskHandle, /* 任务句柄 */
- 1); /* 任务应运行的核心 */
-
- if (tempTaskHandle == NULL) {
- Serial.println("Failed to start task for temperature update");
- return false;
- } else {
- // 每20秒更新环境数据
- tempTicker.attach(20, triggerGetTemp);
- }
- return true;
- }
-
- /**
- * triggerGetTemp
- * 设置标志dhtUpdated为true以便在loop()中处理
- * 由Ticker getTempTimer调用
- */
- void triggerGetTemp() {
- if (tempTaskHandle != NULL) {
- xTaskResumeFromISR(tempTaskHandle);
- }
- }
-
- /**
- * 任务从DHT11传感器读取温度
- * @param pvParameters
- * 指向任务参数的指针
- */
- void tempTask(void *pvParameters) {
- Serial.println("tempTask loop started");
- while (1) // tempTask循环
- {
- if (tasksEnabled) {
- // 获取温度值
- getTemperature();
- }
- // 再次进入睡眠
- vTaskSuspend(NULL);
- }
- }
-
- /**
- * getTemperature
- * 从DHT11传感器读取温度
- * @return bool
- * true 如果温度获取成功
- * false 如果获取失败
- */
- bool getTemperature() {
- // 读取湿度的温度大约需要250毫秒!
- // 传感器读数也可能长达2秒“旧”(它是一个非常慢的传感器)
- TempAndHumidity newValues = dht.getTempAndHumidity();
- // 检查是否有任何读取失败并提前退出(以便再次尝试)。
- if (dht.getStatus() != 0) {
- Serial.println("DHT11 error status: " + String(dht.getStatusString()));
- return false;
- }
-
- float heatIndex = dht.computeHeatIndex(newValues.temperature, newValues.humidity);
- float dewPoint = dht.computeDewPoint(newValues.temperature, newValues.humidity);
- float cr = dht.getComfortRatio(cf, newValues.temperature, newValues.humidity);
-
- String comfortStatus;
- switch(cf) {
- case Comfort_OK:
- comfortStatus = "舒适";
- break;
- case Comfort_TooHot:
- comfortStatus = "太热";
- break;
- case Comfort_TooCold:
- comfortStatus = "太冷";
- break;
- case Comfort_TooDry:
- comfortStatus = "太干燥";
- break;
- case Comfort_TooHumid:
- comfortStatus = "太潮湿";
- break;
- case Comfort_HotAndHumid:
- comfortStatus = "又热又潮湿";
- break;
- case Comfort_HotAndDry:
- comfortStatus = "又热又干燥";
- break;
- case Comfort_ColdAndHumid:
- comfortStatus = "又冷又潮湿";
- break;
- case Comfort_ColdAndDry:
- comfortStatus = "又冷又干燥";
- break;
- default:
- comfortStatus = "未知状态";
- break;
- };
-
- Serial.println(" 温度:" + String(newValues.temperature) + " 湿度:" + String(newValues.humidity) + " 热指数:" + String(heatIndex) + " 露点:" + String(dewPoint) + " " + comfortStatus);
- return true;
- }
-
- void setup(){
- Serial.begin(115200);
- Serial.println();
- Serial.println("DHT ESP32 任务示例");
- initTemp();
- // 向任务发出setup()结束的信号
- tasksEnabled = true;
- }
-
- void loop() {
- if (!tasksEnabled) {
- // 等待2秒以让系统稳定下来
- delay(2000);
- // 启用将从DHT传感器读取值的任务
- tasksEnabled = true;
- if (tempTaskHandle != NULL) {
- vTaskResume(tempTaskHandle);
- }
- }
- yield();
- }
复制代码
|