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键再烧一次
③出现下图问题
分析问题:这里排查是因为摄氏度℃符号问题所致,应该是℃占用字节较大,需要多空出来一格
解决:℃后面多空一格即可