[活动专区] 【AutoChips MCU评测报告】+RTC及温湿度显示功能实现

[复制链接]
949|2
 楼主| jinglixixi 发表于 2020-6-2 15:17 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2020-6-4 08:58 编辑

1. 温湿度检测
DHT22是一种单总线的数字式温湿度传感器,它共有3个引脚,只需占用一个GPIO接口工作。
DHT22MCU的连接关系为:
DAT——PA7
其余两个引脚则接3.3V工作电源

定义GPIO读取电位及输出高低电平的语句为:
#define DHT22_D0_H                GPIO_SetPinBits(7)              //PA7
#define DHT22_D0_L                GPIO_ResetPinBits(7)          //PA7
#define DHT22_D0_R                GPIO_GetPinValue(7)          //PA7

设置GPIO为输入、输出的函数为:
  1. void DHT22_IO_IN(void)
  2. {
  3. GPIO_SetDir(GPIO_PA7, 0);  
  4. }

  5. void DHT22_IO_OUT(void)
  6. {
  7. GPIO_SetDir(GPIO_PA7, 1);  
  8. }


DHT22的初始化函数为:
u8 DHT22_Init(void)
{
GPIO_SetDir(GPIO_PA7, 1);
DHT22_Rst();
return DHT22_Check();
}

DHT22读取数据的函数为:
  1. u8 DHT22_Read_Data(u8 *temp,u8 *humi)   
  2. {        
  3. u8 buf[5];
  4. u8 i;
  5. DHT22_Rst();
  6. if(DHT22_Check()==0)
  7. {
  8. for(i=0;i<5;i++)
  9. {
  10. buf[i]=DHT22_Read_Byte();
  11. }
  12. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  13. {
  14. *humi=(buf[0]*256+buf[1])/10;
  15. *temp=(buf[2]*256+buf[3])/10;
  16. }
  17. }else return 1;
  18. return 0;            
  19. }


实现图1与图2显示效果的主程序为:
  1. int main(void)
  2. {  
  3. u8 senflag;
  4. InitDebug();
  5. InitDelay();
  6. GPIO_SetDir(GPIO_PA0, 1);
  7. OLED_Init();
  8. OLED_Clear();
  9. OLED_ShowString(0,0,"AC8711",16);
  10. OLED_ShowString(0,2,"DHT11 TEST",16);
  11. OLED_ShowString(0,4,"  C   %RH",16);
  12. senflag=DHT22_Init();
  13. if(senflag) OLED_ShowString(64,0,"NO SEN!",16);
  14. else   OLED_ShowString(64,0,"SEN OK!",16);
  15. while(1)
  16. {
  17. if(!senflag)
  18. {
  19. DHT22_Read_Data(&temperature,&humidity);
  20. OLED_ShowNum(0,4,temperature,2,16);
  21. OLED_ShowNum(32,4,humidity,2,16);
  22. printf("T=%dC,H=%d%%RH \r\n\r\n",temperature,humidity);
  23. }
  24. mdelay(500);
  25. }
  26. }


a.jpg
图1  串口输出效果


b.jpg
图2  DHT22温湿度检测


2.  RTC计时
I2C_OLED屏是一种借由I2C接口工作的器件,共有4个引脚,它与MCU的连接关系为:
OLED_SCLK——PA4
OLED_SDIN——PA5
其余的两个引脚则接3.3V工作电源

RTC显示函数为:
  1. void RTC_ClockDisplay(uint32_t counter)
  2. {
  3. uint32_t tempHour = 0, tempMin = 0, tempSec = 0;
  4. tempSec = counter % 60;
  5. tempMin = (counter / 60) % 60;
  6. tempHour = (counter / 3600) % 60;
  7. OLED_ShowChar(0,6, tempHour / 10 + '0', 16);
  8. OLED_ShowChar(8, 6, tempHour % 10 + '0', 16);
  9. OLED_ShowString(16, 6, ":", 8);
  10. OLED_ShowChar(24, 6, tempMin / 10 + '0', 16);
  11. OLED_ShowChar(32, 6, tempMin % 10 + '0',16);
  12. OLED_ShowString(40, 6, ":", 8);
  13. OLED_ShowChar(48, 6, tempSec / 10 + '0',16);
  14. OLED_ShowChar(56, 6, tempSec % 10 + '0',16);
  15. }


RTC秒中断处理函数为:
  1. int32_t RTCCallBackFunc(uint32_t wparam, uint32_t lparam )
  2. {
  3.     static uint32_t s_clkCounter = 1;
  4.     RTC_ClockDisplay(s_clkCounter);
  5.     printf("RTC CallBack Function,counter:%d\r\n", s_clkCounter++);
  6. return 0;
  7. }


实现图3所示效果的主程序为:
  1. int main(void)
  2. {
  3. uint32_t tmpMod = 99;
  4. uint32_t tmpPrescalerValue = 0x752ff;
  5. RTC_ConfigType RTCConfig = {0};
  6. InitDelay();
  7. InitDebug();
  8. OLED_Init();
  9. OLED_Clear();
  10. OLED_ShowString(0,0,"AC8711",16);
  11. OLED_ShowString(0,2,"DHT22 TEST",16);
  12. OLED_ShowString(0,4,"  C   %RH",16);
  13. senflag=DHT22_Init();
  14. if(senflag) OLED_ShowString(64,0,"NO SEN!",16);
  15. else   OLED_ShowString(64,0,"SEN OK!",16);
  16. RTCConfig.clockSource = 0;
  17. RTCConfig.moduloValue = tmpMod;
  18. RTCConfig.interruptEn = ENABLE;
  19. RTCConfig.prescalerValue = tmpPrescalerValue;
  20. RTCConfig.RTCOut = ENABLE;
  21. RTC_SetEventCallback(RTCCallBackFunc);
  22. RTC_Initialize(&RTCConfig);
  23. while(1)
  24. {
  25. if(!senflag)
  26. {
  27. DHT22_Read_Data(&temperature,&humidity);
  28. OLED_ShowNum(0,4,temperature,2,16);
  29. OLED_ShowNum(32,4,humidity,2,16);
  30. }
  31. mdelay(500);
  32. }
  33. }


IMG_20200603_164442_resized_20200604_085440847.jpg
图3  综合运行效果

yljon 发表于 2020-6-4 10:35 | 显示全部楼层
非常不错,楼主辛苦!!!
 楼主| jinglixixi 发表于 2020-6-4 10:38 | 显示全部楼层
yljon 发表于 2020-6-4 10:35
非常不错,楼主辛苦!!!

感谢支持!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部