7.(OLED屏幕)AHT21+OLED模块在STM32C8T6上实现简易温湿度计

stm32c8t6、oled屏幕、aht21模块、stlink即可实现点亮屏幕

 

大家记得一键三连!!!

1.本文基于上文6拓展, 点击这里即可跳转
2.(实验)将OLED、AHT21模块与STM32设置的打开I2C的GPIO口相连,并将写好的代码通过stlink烧录进STM32中,实现点亮OLED屏幕

2.1 器材

硬件:STM32F103C8T6、AHT21模块、OLED屏幕、面包板、STLink、若干杜邦线

软件:CubeMX、keil5

2.2 结果

OLED显示当前环境温湿度值

2.3接线

大家对照相应杜邦线接线即可

将AHT21模块和OLED屏幕的SDA、SCL口接到你stm32打开I2C的GPIO口上即可

(我这里PB6是SCL口、PB7是SDA口)

接线总览图

2.4 CubeMX配置

SYS配置串口

RCC配置 

I2C1设置,下方设置为:Fast Mode

时钟配置,改为72 MHZ

2.5 代码(仅添加修改处)

/*font.h*/
extern const Image temperatureImg;
extern const Image humidityImg;
/*font.c*/
const uint8_t zh16x16[][36] = {
/* 0 温 */ {0xe6,0xb8,0xa9,0x00,0x10,0x60,0x02,0x8c,0x00,0x00,0xfe,0x92,0x92,0x92,0x92,0x92,0xfe,0x00,0x00,0x00,0x04,0x04,0x7e,0x01,0x40,0x7e,0x42,0x42,0x7e,0x42,0x7e,0x42,0x42,0x7e,0x40,0x00,},
/* 1 度 */ {0xe5,0xba,0xa6,0x00,0x00,0x00,0xfc,0x24,0x24,0x24,0xfc,0x25,0x26,0x24,0xfc,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8f,0x80,0x84,0x4c,0x55,0x25,0x25,0x25,0x55,0x4c,0x80,0x80,0x80,0x00,},
/* 2 湿 */ {0xe6,0xb9,0xbf,0x00,0x10,0x60,0x02,0x8c,0x00,0xfe,0x92,0x92,0x92,0x92,0x92,0x92,0xfe,0x00,0x00,0x00,0x04,0x04,0x7e,0x01,0x44,0x48,0x50,0x7f,0x40,0x40,0x7f,0x50,0x48,0x44,0x40,0x00,},
/* 3 ℃ */ {0xe2,0x84,0x83,0x00,0x00,0x18,0x24,0x24,0x18,0xc0,0x20,0x10,0x08,0x08,0x08,0x10,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x10,0x20,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00,}
};
const Font font16x16 = {.w =16, .h = 16, .chars = (const uint8_t *)zh16x16,.len = sizeof(zh16x16)/36, .ascii = &afont16x8};

/*按照你找到的图片为准*/
const uint8_t temperatureData[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x70, 0x70, 0x70, 0x70, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xe0, 
0xe0, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0xf0, 0xfc, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0f, 0x1e, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1f, 0x0f, 0x03, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
};
const Image temperatureImg = {32, 32, temperatureData};

/*按照你找到的图片为准*/
const uint8_t humidityData[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 
0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 
0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfc, 0xfe, 
0xff, 0x8f, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0xf0, 0xf8, 0xfe, 0xff, 0xfc, 0xf8, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0f, 0x0f, 
0x0f, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 
};
const Image humidityImg = {32, 32, humidityData};
/*main.c内(仅修改处)*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "aht20.h"
#include "stdio.h"
/* USER CODE END Includes */


/* USER CODE BEGIN 2 */
	HAL_Delay(200);//OLED屏幕比stm32启动慢,延时200ms
	OLED_DisPlay_On();//打开屏幕
	OLED_Init();//OLED屏幕初始化
	AHT20_Init();//AHT模块初始化
	float temperature,humidity;//温度、湿度
	char message[50];//用于拼接字符串
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		AHT20_Measure();
		temperature = AHT20_Temperature();
		humidity = AHT20_Humidity();
		
		OLED_NewFrame();
		
		OLED_DrawImage(15,0,&temperatureImg,OLED_COLOR_NORMAL);
		sprintf(message,"%.1f℃ ",temperature);
		OLED_PrintString(45,8,message,&font16x16,OLED_COLOR_NORMAL);
		
		OLED_DrawImage(15,32,&humidityImg,OLED_COLOR_NORMAL);
		sprintf(message,"%.1f%%",humidity);
		OLED_PrintString(45,40,message,&font16x16,OLED_COLOR_NORMAL);
		
		OLED_ShowFrame();
		
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

[重点]!!!实验注意:(一些区别、问题以及解决方法)

①部分问题及方法见上文[重点]处

②出现下图问题

分析原因:根据报错得知,出现该情况是烧录进stm32中发生问题。stm32内部程序卡死。

解决问题:将stm32板上的reset键长按不动,再点击烧录,再松开reset键即可,若还不行就不按reset键再烧一次

③出现下图问题

分析问题:这里排查是因为摄氏度℃符号问题所致,应该是℃占用字节较大,需要多空出来一格

解决:℃后面多空一格即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值