草帽王子 发表于 2021-4-30 21:01:53

第七十一章:CH32V103应用教程——温湿度及RTC显示

本帖最后由 草帽王子 于 2021-9-10 18:02 编辑

本章教程主要使用温湿度传感器(DHT11)读取周围环境温湿度并通过OLED屏显示,同时显示时间。本章教程在第十二章、第六十九章、第七十章基础上进行,可以看作这三章的综合应用


1、IIC、RTC、DHT11简介及相关函数介绍

关于IIC、RTC、DHT11的简介前面章节已经介绍,在此不再赘述。


2、硬件设计

本章教程使用温湿度传感器(DHT11)读取周围环境温湿度并通过OLED屏显示,同时显示时间,其中OLED显示采用硬件IIC驱动OLED的方式。各模块与单片机引脚连接如下:


[*]DHT11的VCC、GND引脚与单片机VCC、GND引脚连接
[*]DHT11的Dout引脚与单片机用户自定义引脚连接(此处为PA11)
[*]PB7连接OLED屏的SDA引脚
[*]PB6连接OLED屏的SCL引脚


3、软件设计

本章教程使用温湿度传感器(DHT11)读取周围环境温湿度并通过OLED屏显示,同时显示时间,具体程序见程序各文件内容,与前面章节一样,在此主要介绍main.c文件内容:
main.c文件
/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2020/04/30
* Description      : Main program body.
*******************************************************************************/

/*
*@Note
环境温湿度及RTC OLED显示:
本章教程使用温湿度传感器(DHT11)读取周围环境温湿度并通过OLED屏显示,同时显示时间。
*/

#include "debug.h"
#include "dht11.h"
#include "rtc.h"
#include "iic.h"
#include "oled.h"

/*******************************************************************************
* Function Name: main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
int main(void)
{

    u8 temperature;
    u8 humidity;

    Delay_Init();
    USART_Printf_Init(115200);
    OLED_Init();
    RTC_Init();
    DHT11_Init();

    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf("DHT11 & RTC OLED Display\r\n");

    //检测DHT11是否正常
    while(DHT11_Init()) //DHT11初始化
    {
      OLED_Refresh();
      Delay_Ms(500);
      OLED_Clear();
      OLED_ShowString(0,20,"DHT11 not normal",16,1);
    }

    OLED_Refresh();
    Delay_Ms(500);
    OLED_Clear();

    OLED_ShowString(0,0,"Data:    //",16,1);
    OLED_ShowString(0,16,"Time:::",16,1);
    OLED_ShowString(12,32,"Temp:   C",16,1);
    OLED_ShowString(12,48,"Humi:   %",16,1);

    while(1)
    {
      Delay_Ms(1000);

      DHT11_Read_Data(&temperature,&humidity);
      OLED_ShowNum(55,32,temperature,2,16,1);
      OLED_ShowNum(55,48,humidity,2,16,1);
      printf("temperature:%d\r\n",temperature);
      printf("humidity:%d\r\n",humidity);

      printf("year/month/day/week/hour/min/sec:\r\n");
      printf("%d-%d-%d%d%d:%d:%d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,
                                          calendar.week,calendar.hour,calendar.min,calendar.sec );

      OLED_ShowNum(40,0,calendar.w_year,4,16,1);
      printf("hour:%d\r\n",calendar.w_year);

      OLED_ShowNum(80,0,calendar.w_month,2,16,1);
      printf("min:%d\r\n",calendar.w_month);

      OLED_ShowNum(104,0,calendar.w_date,2,16,1);
      printf("sec:%d\r\n",calendar.w_date);


      OLED_ShowNum(40,16,calendar.hour,2,16,1);
      printf("hour:%d\r\n",calendar.hour);

      OLED_ShowNum(64,16,calendar.min,2,16,1);
      printf("min:%d\r\n",calendar.min);

      OLED_ShowNum(88,16,calendar.sec,2,16,1);
      printf("sec:%d\r\n",calendar.sec);


      OLED_Refresh();
      Delay_Ms(10);
    }
}

main.c文件主要进行函数初始化、DHT11模块异常检测显示、温湿度检测显示以及日期时间显示。


4、下载验证

将编译好的程序下载到开发版并复位,OLED显示如下:
1、当未检测到DHT11,OLED显示如下:
2、当已检测到DHT11,OLED显示如下:

70、温湿度及RTC显示.rar

链接:https://pan.baidu.com/s/1KIBvHQavbmRd-nasbtzIBg
提取码:d8rj
复制这段内容后打开百度网盘手机App,操作更方便哦



页: [1]
查看完整版本: 第七十一章:CH32V103应用教程——温湿度及RTC显示