这里使用AT-START-WB415测试板子读取DHT11温湿度传感器数据,并显示在OLED上。
在前面的测评中已经添加了OLED的显示功能。
这里只是使用DHT11实现温湿度数据的读取功能了。
为了提供工作效率,还是使用的宏定义实现的DHT11的IO口的操作。
DHT11对演示函数有着精确的要求,所以这里使用的是系统自带的延时代码,使用systick实现的 。
如果systick被占用,可以使用定时器失效相同的效果的。
直接宏定义温湿度传感器的IO口。
#define DHT11_IO_GPIO_Port GPIOA
#define DHT11_IO_Pin GPIO_PINS_1
驱动IO的高低电平和读取数据
//设置驱动IO端口
#define DHT11_DQ_OUT_1 DHT11_IO_GPIO_Port->scr = DHT11_IO_Pin
#define DHT11_DQ_OUT_0 DHT11_IO_GPIO_Port->clr = DHT11_IO_Pin
#define DHT11_DQ_IN gpio_input_data_bit_read(DHT11_IO_GPIO_Port, DHT11_IO_Pin)
最重要的是初始化IO口了。
gpio_init_type gpio_init_struct;
/* enable the led clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
/* set default parameter */
gpio_default_para_init(&gpio_init_struct);
/* configure the gpio */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = DHT11_IO_Pin;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(DHT11_IO_GPIO_Port, &gpio_init_struct);
很多的代码都是千篇一律的,主要是延时函数。
at32wb415_board.c的文件中已经提供了精确延时函数,这里只需要宏定义或者替换一下即可。
void delay_us(uint32_t nus)
{
uint32_t temp = 0;
SysTick->LOAD = (uint32_t)(nus * fac_us);
SysTick->VAL = 0x00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;
do
{
temp = SysTick->CTRL;
}while((temp & 0x01) && !(temp & (1 << 16)));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x00;
}
这里就是现实的主函数了。
if(!dht11Read(&temperature, &humidity))//Read DHT11 Value
{
sprintf(s_temp,"温:%02d'C 湿:%02d%% ",temperature,humidity);
OLED_ShowString(0,32,(unsigned char*)s_temp,1);// 显示温湿度
}
附上效果图。
|