【AT32F421测评】+ DHT22温湿度检测
本帖最后由 jinglixixi 于 2021-5-20 23:36 编辑<p style="text-align:justify">DHT22是一种常见的数字式温湿度传感器,它采用单总线方式进行工作,故较为节省GPIO口资源。将它与OLED屏组合在一起即可形成一个小巧而便捷的温湿度检测装置,其起始界面和工作界面分别如图1和图2所示。</p>
<p></p>
<p>图1 起始界面</p>
<p>图2 工作界面</p>
<p> </p>
<p>DHT22与MCU的连接关系为:</p>
<p>Dat---PB11</p>
<p>VCC---5V</p>
<p>GND--- GND</p>
<p> </p>
<p>实现DHT22输出高低电平及读取的语句定义为:</p>
<p>#define DHT22_D0_H GPIOB->BSRE= GPIO_Pins_11</p>
<p>#define DHT22_D0_L GPIOB->BRE= GPIO_Pins_11</p>
<p>#define DHT22_D0_R GPIO_ReadInputDataBit(GPIOB,GPIO_Pins_11)</p>
<p> </p>
<p>DHT22的初始化函数为:</p>
<pre>
<code class="language-cpp">uint8_t DHT22_Init(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
DHT22_Rst();
return DHT22_Check();
}</code></pre>
<p>DHT22读取模式的设置函数为:</p>
<pre>
<code class="language-cpp">void DHT22_IO_IN(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Pull = GPIO_Pull_PD;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}</code></pre>
<p> </p>
<p>DHT22位读取函数为:</p>
<pre>
<code class="language-cpp">uint8_t DHT22_Read_Bit(void)
{
uint8_t retry=0;
while(DHT22_D0_R&&retry<100)
{
retry++;
Delay_us(2);
}
retry=0;
while(!DHT22_D0_R&&retry<100)
{
retry++;
Delay_us(2);
}
Delay_us(40);
if(DHT22_D0_R) return 1;
else return 0;
}</code></pre>
<p>DHT22字节读取函数为:</p>
<pre>
<code class="language-cpp">uint8_t DHT22_Read_Byte(void)
{
uint8_t i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT22_Read_Bit();
}
return dat;
}</code></pre>
<p> </p>
<p>实现显示效果的主程序为:</p>
<pre>
<code class="language-cpp">int main(void)
{
uint8_t senflag;
AT32_Board_Init();
AT32_OLED_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AT32F421",16);
OLED_ShowString(0,2,"OLED & DHT22",16);
senflag=DHT22_Init();
Delay_ms(2000u);
if(!senflag) OLED_ShowString(100,0,"NO",16);
else OLED_ShowString(100,0,"OK",16);
OLED_ShowString(0,2,"T= C H= %RH",16);
while(1)
{
if(senflag)
{
DHT22_Read_Data(&temperature,&humidity);
OLED_ShowNum(16,2,temperature,2,16);
OLED_ShowNum(64,2,humidity,2,16);
}
Delay_ms(500u);
AT32_LEDn_Toggle(LED2);
}
}</code></pre>
<p> </p>
<p>不错不错,期待后续哈~</p>
w494143467 发表于 2021-5-21 10:39
不错不错,期待后续哈~
<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>
<p>谢谢分享</p>
<p>谢谢分享,话说楼主后面还有测评吗,今天就结束了。</p>
Albert.G 发表于 2021-5-24 11:22
谢谢分享,话说楼主后面还有测评吗,今天就结束了。
<p>哈哈,计划的任务已全部完成!</p>
<p>AM2302这个传感器以前弄过,当时的程序能用,但是数据偶尔会有错误很是奇怪.</p>
<p>直到最近用定时器通道捕获方式才看出当时的问题,那个传感器在发送完一个字节后会有一个超长的低电平,手册上并没有说清楚.</p>
页:
[1]