【正点原子STM32H7R3开发套件试用体验】DS18B20、DHT11温湿度采集
本文主要分为两部分,分别介绍了使用正点原子STM32H7R3开发套件,通过 DS18B20、DHT11 传感器采集环境温湿度数据的主要流程和关键代码,并对这两款常见传感器进行了介绍。
DS18B20
DS18B20 数字温度计是 DALLAS 公司生产的 1-Wire 单总线器件,具有线路简单、体积小的特点。
简介

特点
- 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
- 测温范围 -55℃~+125℃,固有测温误差 1℃。
- 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
- 工作电源: 3.0~5.5V/DC (可以数据线寄生电源)
- 在使用中不需要任何外围元件
- 测量结果以9~12位数字量方式串行传送
时序图

DS18B20 数据显示

硬件
- LED
- USART1
- USART1_TX - PB14
- USART1_RX - PB15
- MPU
- HyperRAM
- 正点原子 2.8/3.5/4.3/7 寸 LCD 模块
- DS18B20 高精度温度传感器
项目实现
- 检测是否有 DS18B20 存在,如果没有,则提示错误。
- 检测到 DS18B20 后,开始读取温度,显示在 LCD,每隔 100ms 读取并显示,串口发送温度值。
- LED0 闪烁,指示程序运行状态。
代码
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/HYPERRAM/hyperram.h"
#include "./BSP/DS18B20/ds18b20.h"
int main(void)
{
uint8_t t = 0;
short temperature;
sys_mpu_config();
sys_cache_enable();
HAL_Init();
sys_stm32_clock_init(300, 6, 2);
delay_init(600);
usart_init(115200);
led_init();
hyperram_init();
lcd_init();
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "DS18B20 TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
while (ds18b20_init())
{
lcd_show_string(30, 110, 200, 16, 16, "DS18B20 Error", RED);
delay_ms(200);
lcd_fill(30, 110, 239, 130 + 16, WHITE);
delay_ms(200);
}
lcd_show_string(30, 110, 200, 16, 16, "DS18B20 OK", RED);
lcd_show_string(30, 130, 200, 16, 16, "Temp: . C", BLUE);
while (1)
{
if (t % 10 == 0)
{
temperature = ds18b20_get_temperature();
if (temperature < 0)
{
lcd_show_char(30 + 40, 130, '-', 16, 0, BLUE);
temperature = -temperature;
}
else
{
lcd_show_char(30 + 40, 130, ' ', 16, 0, BLUE);
}
lcd_show_num(30 + 40 + 8, 130, temperature / 10, 2, 16, BLUE);
lcd_show_num(30 + 40 + 32, 130, temperature % 10, 1, 16, BLUE);
printf("Temperature = %u.%u°C\r\n",temperature/10,temperature%10);
}
delay_ms(10);
t++;
if (t == 20)
{
t = 0;
LED0_TOGGLE();
}
}
}
效果
LCD 屏显示温度数据

串口打印温度信息

完整项目工程见附件。*附件:Demo2_DS18B20.zip
DHT11
DHT11 数字温湿度传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
简介
DHT11 内置一个电阻式感湿元件和一个 NTC 测温元件,DHT11 为 4 针单排引脚封装,采用单线制串行接口,只需加适当的上拉电阻,信号传输距离可达20米以上。

DHT11 工作参数:
- 湿度测量范围:20~90%RH
- 湿度测量精度:±5%RH
- 温度测量范围:0~50℃
- 温度测量精度:±2℃
- 工作电压:DC 3.3V/5V
DHT11 采用单总线协议,也就是使用一根 DATA 线进行数据的收发。DHT11 的 DATA 线一次通讯时间 4ms 左右,数据分整数部分、小数部分和校验位,具体为: 8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位。
时序图

DHT11 的 DATA 传输一次完整的数据为 40bit,按照高位在前,低位在后的顺序传输。
数据格式为:8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位,一共 5 字节(40bit)数据。
硬件
硬件资源及引脚分配
- LED
LED0 - PD14
- USART1
USART1_TX - PB14
USART1_RX - PB15
- MPU
- HyperRAM
- 正点原子 2.8/3.5/4.3/7寸LCD模块
- DHT11传感器 (接在PG15上)
项目实现
- 检测是否有DHT11存在,如果没有,则提示错误;
- 检测到DHT11后,开始读取温湿度值,并显示在LCD上,程序每隔100ms左右读取一次数据,并通过串口发送温湿度数据;
- LED0 闪烁指示系统正在运行。
代码
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/HYPERRAM/hyperram.h"
#include "./BSP/DHT11/dht11.h"
int main(void)
{
uint8_t t = 0;
uint8_t temperature;
uint8_t humidity;
sys_mpu_config();
sys_cache_enable();
HAL_Init();
sys_stm32_clock_init(300, 6, 2);
delay_init(600);
usart_init(115200);
led_init();
hyperram_init();
lcd_init();
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "DS18B20 TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
while (dht11_init())
{
lcd_show_string(30, 110, 200, 16, 16, "DHT11 Error", RED);
delay_ms(200);
lcd_fill(30, 110, 239, 130 + 16, WHITE);
delay_ms(200);
}
lcd_show_string(30, 110, 200, 16, 16, "DHT11 OK", RED);
lcd_show_string(30, 130, 200, 16, 16, "Temp: C", BLUE);
lcd_show_string(30, 150, 200, 16, 16, "Humi: %", BLUE);
while (1)
{
if (t % 10 == 0)
{
dht11_read_data(&temperature, &humidity);
lcd_show_num(30 + 40, 130, temperature, 2, 16, BLUE);
lcd_show_num(30 + 40, 150, humidity, 2, 16, BLUE);
printf("Temperature = %u°C,Humidity = %u%%\r\n", temperature, humidity);
}
delay_ms(10);
t++;
if (t == 20)
{
t = 0;
LED0_TOGGLE();
}
}
}
效果
LCD 屏显示温湿度数据

同时串口打印温度和湿度数值

完整工程文件见附件。*附件:Demo3_DHT11.zip
总结
本文介绍了使用正点原子STM32H7R3开发套件,结合DS18B20、DHT11温湿度传感器,采集环境温度和湿度数据,并通过 LCD 屏显示,同时串口发送的项目。由于温湿度数据在工业和生活中扮演重要角色,很多仪器设备对环境温湿度较为敏感,因此该项目对于温湿度的自动化采集具有一定的参考和借鉴价值。