首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【蓝桥杯——物联网设计与开发】基础模块6 - OLED

  • 25-03-06 11:27
  • 2526
  • 10194
blog.csdn.net

目录

一、OLED

(1)原理图

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

二、踩坑日记

(1)i2c.c 文件中需要添加两个部分

(2)OLED 显示问题

(3)显示对齐问题


一、OLED

(1)原理图

        在蓝桥杯物联网竞赛实训平台中,有一块 0.91 寸的 OLED,原理图如下所示:

图1        OLED 电路连接图

        如图,该 OLED 是通过 I2C 协议与 MCU 进行连接传输,控制引脚为 PA8 和 PB4,这两个引脚也正是硬件 I2C 所映射的引脚。

        OLED 供电源为 A_+3V3(节点 B 为 B_+3V3),通过查阅电路原理图可知,此处通型号为 SI2301 的 P 沟道场效应管与节点电压 +3V3 连接,管道控制端 G 极与引脚 PB5 相连接。

  • 当 {U_{S}} > {U_{G}} 时,即控制引脚 PB5 输出低电平时,PMOS 导通,OLED 通电;
  • 当 {U_{S}} < {U_{G}} 时,即控制引脚 PB5 输出高电平时,PMOS 截止,OLED 失去供电源;
图2        OLED 电源

(2)STM32CubeMX 软件配置

?“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出icon-default.png?t=N7T8http://iyenn.com/rec/1715909.html?spm=1001.2014.3001.5502 

1️⃣点击引脚 PB5 → 选择 GPIO_Output 模式(此处默认为推挽输出,输出低电平);

图3        引脚 PB5 配置



2️⃣点击左侧 "Connectivity" → 选择 "I2C3"  → 模式选择 "I2C" ( I2C 总线模式);

        ⚠️此处模式参数默认,请根据题意或项目需求进行修改;

图4        I2C 模式配置


3️⃣生成代码即可;

4️⃣将赛点资源数据包中的参考代码:"font.h"、"oled.h"、"oled.c"、"i2c.h" 添加到工程;

图5        添加 OLED 驱动文件

(3)代码编写

?️MX_I2C3_Init 函数代码补全

        ⚠️该函数需要添加一句代码,以稳定 OLED 电压:

HAL_Delay(200);

  1. void MX_I2C3_Init(void)
  2. {
  3. /* USER CODE BEGIN I2C3_Init 0 */
  4. /* USER CODE END I2C3_Init 0 */
  5. /* USER CODE BEGIN I2C3_Init 1 */
  6. /* USER CODE END I2C3_Init 1 */
  7. hi2c3.Instance = I2C3;
  8. hi2c3.Init.Timing = 0x00707CBB;
  9. hi2c3.Init.OwnAddress1 = 0;
  10. hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  11. hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  12. hi2c3.Init.OwnAddress2 = 0;
  13. hi2c3.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  14. hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  15. hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  16. if (HAL_I2C_Init(&hi2c3) != HAL_OK)
  17. {
  18. Error_Handler();
  19. }
  20. /** Configure Analogue filter
  21. */
  22. if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  23. {
  24. Error_Handler();
  25. }
  26. /** Configure Digital filter
  27. */
  28. if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK)
  29. {
  30. Error_Handler();
  31. }
  32. /* USER CODE BEGIN I2C3_Init 2 */
  33. HAL_Delay(200); // 延时以稳定 OLED 电压
  34. /* USER CODE END I2C3_Init 2 */
  35. }

?️OLED_Write 函数代码实现

  1. void OLED_Write(uint8_t ucType, uint8_t ucData)
  2. {
  3. uint8_t pData[2]; // 定义数组存储传输的数据
  4. pData[0] = ucType; // 数据类型:数据 或者 命令
  5. pData[1] = ucData; // 数据本身
  6. HAL_I2C_Master_Transmit(&hi2c3, 0x78, pData, 2, 10); // 调用库函数使用硬件 I2C 进行传输
  7. }

        ⚠️此处注意 OLED 地址为 0x78;

?️main 函数

  1. /* USER CODE BEGIN Includes */
  2. #include
  3. #include "oled.h"
  4. /* USER CODE END Includes */
  5. /* USER CODE BEGIN PV */
  6. uint8_t puc_oled[17]; // OLED 显示存储区
  7. /* USER CODE END PV */
  8. /**
  9. * @brief The application entry point.
  10. * @retval int
  11. */
  12. int main(void)
  13. {
  14. /* USER CODE BEGIN 1 */
  15. /* USER CODE END 1 */
  16. /* MCU Configuration--------------------------------------------------------*/
  17. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  18. HAL_Init();
  19. /* USER CODE BEGIN Init */
  20. /* USER CODE END Init */
  21. /* Configure the system clock */
  22. SystemClock_Config();
  23. /* USER CODE BEGIN SysInit */
  24. /* USER CODE END SysInit */
  25. /* Initialize all configured peripherals */
  26. MX_GPIO_Init();
  27. MX_I2C3_Init();
  28. /* USER CODE BEGIN 2 */
  29. OLED_Init(); // OLED 初始化
  30. OLED_Clear(); // OLED 清屏,去除初始噪点
  31. sprintf((char*)puc_oled, "123456789ABCDEFG"); // 将需要显示的字符串格式化到显示存储区
  32. OLED_ShowString(0, 0, puc_oled, 16); // 第0行显示
  33. sprintf((char*)puc_oled, " Hello World! ");
  34. OLED_ShowString(0, 2, puc_oled, 16); // 第2行显示
  35. /* USER CODE END 2 */
  36. /* Infinite loop */
  37. /* USER CODE BEGIN WHILE */
  38. while (1)
  39. {
  40. /* USER CODE END WHILE */
  41. /* USER CODE BEGIN 3 */
  42. }
  43. /* USER CODE END 3 */
  44. }

        ⚠️此处显示存储区大小为什么是 17,在后文有介绍;

(4)实验现象

        OLED 一共显示两行,第一行显示字符串 "123456789ABCDEFG",第二行显示 "Hello World!";

图6        实验现象

二、踩坑日记

(1)i2c.c 文件中需要添加两个部分

  • void MX_I2C3_Init(void) 函数中添加 HAL_Delay(100); 以等待 OLED 电源稳定;

  • 编写函数 void OLED_Write(uint8_t ucType, uint8_t ucData);

(2)OLED 显示问题

⚠️该 OLED 像素点为128 × 32:

  • Y轴:显示大小为 16 时,最多显示 2 排;显示大小为 8 时,最多显示 4 排;
  • X轴:最多显示 16 个字符,由于sprintf会在字符串后面添加  ’\0’  ,所以 OLED 显示数组 pucBuf 大小应该为 17;

(3)显示对齐问题

在蓝桥杯赛题上,会对 OLED 显示的字符有相对位置要求,如下图所示:

图7        赛题要求

        根据上文对 OLED 的显示分析,一行最多有 16 个字符。那么根据这一特性,我们可以先写入一排大小为 8 的字符串 "123456789ABCDEFH",可以根据此字符串进行居中显示等;

注:本文转载自blog.csdn.net的逝灮的文章"https://blog.csdn.net/m0_63116406/article/details/136196071"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top