本帖最后由 RISCVLAR 于 2021-2-21 20:09 编辑
CH32V103应用教程——温湿度及RTC显示
本章教程主要使用温湿度传感器(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显示如下:
|