vscode的wsl环境,ESP32驱动0.96寸oled屏幕

注意大小写,wsl(也就是linux环境)严格区分大小写。有帮助记得订阅专栏+点赞,当前不定期持续更新。

一、文件夹格式:

project/                  # 项目根目录
├─ main/                # 主程序文件夹
│  ├─ main.c            # 主函数文件(包含 app_main)
│  └─ CMakeLists.txt    # main 组件的编译配置
├─ components/          # 自定义组件目录(与 main 同级)
│  └─OLED/             # OLED 组件
│    ├─ OLED.c         # OLED 功能实现
│    ├─ OLED.h         # OLED 头文件(声明函数、宏等)
│    └─ CMakeLists.txt # OLED 组件的编译配置
├─ CMakeLists.txt       # 项目根目录编译配置(指定项目名称、依赖等)
├─ sdkconfig            # ESP-IDF 配置文件(由 menuconfig 生成)
└─ partitions.csv       # 分区表配置文件(可选,默认使用 ESP-IDF 自带)

二、OLED.c

#include "OLED.h"
#include "font.h"
#include "driver/i2c.h"
#include "esp_log.h"static const char *TAG = "OLED";// I2C初始化
void OLED_I2C_Init(void)
{i2c_config_t conf = {.mode = I2C_MODE_MASTER,.sda_io_num = OLED_SDA_PIN,.scl_io_num = OLED_SCL_PIN,.sda_pullup_en = GPIO_PULLUP_ENABLE,.scl_pullup_en = GPIO_PULLUP_ENABLE,.master.clk_speed = OLED_FREQ_HZ,};ESP_ERROR_CHECK(i2c_param_config(OLED_I2C_PORT, &conf));ESP_ERROR_CHECK(i2c_driver_install(OLED_I2C_PORT, conf.mode, 0, 0, 0));ESP_LOGI(TAG, "I2C initialized successfully");
}// I2C写数据
static esp_err_t i2c_master_write_slave(uint8_t *data_wr, size_t size)
{i2c_cmd_handle_t cmd = i2c_cmd_link_create();i2c_master_start(cmd);i2c_master_write_byte(cmd, (OLED_I2C_ADDRESS << 1) | I2C_MASTER_WRITE, true);i2c_master_write(cmd, data_wr, size, true);i2c_master_stop(cmd);esp_err_t ret = i2c_master_cmd_begin(OLED_I2C_PORT, cmd, pdMS_TO_TICKS(1000));i2c_cmd_link_delete(cmd);return ret;
}// 写命令
void OLED_WriteCommand(uint8_t Command)
{uint8_t buf[2] = {0x00, Command}; // 0x00表示命令ESP_ERROR_CHECK(i2c_master_write_slave(buf, 2));
}// 写数据
void OLED_WriteData(uint8_t Data)
{uint8_t buf[2] = {0x40, Data}; // 0x40表示数据ESP_ERROR_CHECK(i2c_master_write_slave(buf, 2));
}// 以下函数保持不变,与原始代码相同
void OLED_SetCursor(uint8_t Y, uint8_t X)
{OLED_WriteCommand(0xB0 | Y);OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));OLED_WriteCommand(0x00 | (X & 0x0F));
}void OLED_Clear(void)
{  uint8_t i, j;for (j = 0; j < 8; j++){OLED_SetCursor(j, 0);for(i = 0; i < 128; i++){OLED_WriteData(0x00);}}
}void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	uint8_t i;OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i]);}OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);}
}void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i++){OLED_ShowChar(Line, Column + i, String[i]);}
}uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y--){Result *= X;}return Result;
}void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{uint8_t i;uint32_t Number1;if (Number >= 0){OLED_ShowChar(Line, Column, '+');Number1 = Number;}else{OLED_ShowChar(Line, Column, '-');Number1 = -Number;}for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i, SingleNumber;for (i = 0; i < Length; i++)							{SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;if (SingleNumber < 10){OLED_ShowChar(Line, Column + i, SingleNumber + '0');}else{OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');}}
}void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');}
}void OLED_Init(void)
{uint32_t i, j;for (i = 0; i < 1000; i++)			//上电延时{for (j = 0; j < 1000; j++);}OLED_I2C_Init();			//端口初始化OLED_WriteCommand(0xAE);	//关闭显示OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率OLED_WriteCommand(0x80);OLED_WriteCommand(0xA8);	//设置多路复用率OLED_WriteCommand(0x3F);OLED_WriteCommand(0xD3);	//设置显示偏移OLED_WriteCommand(0x00);OLED_WriteCommand(0x40);	//设置显示开始行OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常 0xC0上下反置OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置OLED_WriteCommand(0x12);OLED_WriteCommand(0x81);	//设置对比度控制OLED_WriteCommand(0xCF);OLED_WriteCommand(0xD9);	//设置预充电周期OLED_WriteCommand(0xF1);OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别OLED_WriteCommand(0x30);OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭OLED_WriteCommand(0xA6);	//设置正常/倒转显示OLED_WriteCommand(0x8D);	//设置充电泵OLED_WriteCommand(0x14);OLED_WriteCommand(0xAF);	//开启显示OLED_Clear();				//OLED清屏
}

三、OLED.h

#ifndef __OLED_H
#define __OLED_H#include "driver/i2c.h"
#include "font.h"// I2C 配置参数
#define OLED_I2C_PORT        I2C_NUM_0
#define OLED_I2C_ADDRESS     0x3C    // 通常为0x3C或0x3D
#define OLED_SCL_PIN         5      // 根据实际连接修改
#define OLED_SDA_PIN         4      // 根据实际连接修改
#define OLED_FREQ_HZ         100000  // I2C频率// 函数声明
void OLED_I2C_Init(void);
void OLED_WriteCommand(uint8_t Command);
void OLED_WriteData(uint8_t Data);
void OLED_SetCursor(uint8_t Y, uint8_t X);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_Init(void);#endif

四、CMakeLists.txt

idf_component_register(SRCS "OLED.c"INCLUDE_DIRS "."REQUIRES driver
)

五、说明

OLED使用到了espidf官方提供的iic库,所以REQUIRES (依赖)需要包含 driver(设备)

六、参考

[4-2] OLED显示屏_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93492.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeBuddy AI Coding 企业场景落地实践与思考

&#x1f449;目录1 引言2 诊断团队研发流程3 选择合适的 AI CODING 工具4 团队 AI 研发流程落地实践5 全面 CodeBuddy &#xff0c;深入 CodeBuddy6 诚邀共建在 AI 浪潮席卷全球的今天&#xff0c;AI CODING 已经不是企业研发团队的可选项&#xff0c;而是必选项。如果你是企业…

windows下hashcat使用gpu破解execl打开密码

需要的软件 1.hashcat &#xff1a;https://hashcat.net 2.john the ripper &#xff1a;https://www.openwall.com 获取execl加密文件的Hash PS G:\dl\john-1.9.0-jumbo-1-win64\john-1.9.0-jumbo-1-win64\run> python .\office2john.py .\test6.xlsx test6.xlsx:$office$*…

SpringCloud -- Nacos详细介绍

5. Nacos 5.1 Nacos介绍 Nacos 可以理解为微服务的“电话簿 遥控器”。它是阿里巴巴开源的一个核心工具&#xff0c;主要解决微服务架构中的两大问题&#xff1a; 5.1.1 服务注册与发现&#xff08;电话簿&#xff09; 服务注册&#xff1a;当某个微服务&#xff08;比如“订单…

【狂热算法篇】探寻图论幽径之SPFA算法:图论迷宫里的闪电寻径者(通俗易懂版)

​​​​​本篇带大家探究的是SPFA算法&#xff1b;从基本理解&#xff0c;画图分析展示&#xff0c;再到最后的代码实现&#xff0c;以及为何要这样实现代码&#xff0c;等一些细节问题做解释&#xff0c;相关题型应用&#xff0c;非常值得哟&#xff0c;尤其是刚入门的小白学…

webrtc网页一对一通话

基于flutter-webrtc-server做的更改&#xff0c;只使用网页实现语音和视频一对一通话&#xff0c;不支持多对多。 项目地址: https://github.com/chging/rtc-server

Java调用bat执行python脚本

1、问题概述&#xff1f;在windows环境中可以通过Java调用bat执行文件&#xff0c;从而调用python脚本&#xff0c;使用起来方便。2、实现方式&#xff1f;2.1、核心代码bat文件可以在任意位置//获取文件在项目中的文职 String batFilePathSystem.getProperty("user.dir&q…

JavaWeb 欢迎页设置详解

JavaWeb 欢迎页设置详解 欢迎页&#xff08;Welcome Page&#xff09;是用户访问 Web 应用根目录时自动展示的默认页面。在 JavaWeb 中有多种配置方式&#xff1a;一、配置方式 1. 通过 web.xml 配置&#xff08;传统方式&#xff09; <web-app><!-- 配置欢迎页列表 -…

反射和类加载机制

一 类加载机制 1.1 加载机制简介 Java程序从编写到运行这个过程大致可以分为两个阶段&#xff1a;编译阶段和运行阶段。 编译阶段指的是&#xff0c;java源代码文件**(*.java)被java编译器&#xff08;javac&#xff09;编译成字节码文件(*.class)**的过程。这个过程不需要直接…

在CentOS 7 上安装 MySQL 数据库

文章目录前言一、使用官方 MySQL 仓库安装 MySQL1.1 下载并安装 MySQL 官方 YUM 仓库1.2 安装 MySQL YUM 仓库1.3 安装 MySQL1.3.1 补充&#xff1a;1.4 启动 MySQL 服务1.5 设置 MySQL 服务开机启动1.6 获取临时 root 密码1.7 配置 MySQL1.7.1 注意事项1.8 完成安装二、使用默…

Linux:套接字

从进程的视角来看&#xff0c;网络通信就是一个主机上的进程和另外一个主机上的进程进行信息传递&#xff0c;因此对于操作系统而言&#xff0c;网络通信就是一种进程间通信的方式。不过这种进程间通信有特殊之处&#xff1a;同一台主机下可以通过进程ID来标识一个唯一的进程&a…

Android init.rc详解3

关于Android Init的详解&#xff0c;关于Action&#xff0c;Service&#xff0c;Trigger的请参考Android init.rc详解1&#xff0c;关于Options的请参考Android init.rc详解2&#xff0c;本章将介绍常见的Commands。 1 Commands bootchart [start|stop] 启动或停止bootcharti…

Sentinel原理之规则管理

文章目录1. 基础知识2. 数据源使用2.1 RedisDatasource2.2 ZookeeperDatasource1. 基础知识 流量控制规则&#xff08;FlowRule&#xff09;&#xff1a; 阈值类型grade&#xff1a; 0&#xff08;并发线程数&#xff09;&#xff1a;限制同时处理请求的线程1&#xff08;QPS…

系统时钟配置

STM32F103C8T6的系统时钟配置成72MHZ1. 什么是 STM32 系统时钟系统时钟&#xff08;System Clock&#xff09;是整个 MCU&#xff08;微控制器&#xff09;运行的“节拍信号”&#xff0c;所有 CPU 指令执行、外设操作、定时器计时、总线数据传输等&#xff0c;都依赖这个时钟频…

Al大模型-本地私有化部署大模型-大模型微调

魔塔社区 魔塔社区平台介绍 https://www.modelscope.cn/models/Qwen/Qwen2.5-0.5B-Instruct 申请免费的试用机器 如果自己没有机器 &#xff0c;从这里申请机器 。 下载大模型 pip install modelscope 下载到当前目录 mkdir -p /root/autodl-tmp/demo/Qwen/Qwen2.5-0.5B-Ins…

国内著名AI搜索优化专家孟庆涛发表《AI搜索内容可信度评估综合指南》

近日&#xff0c;国内著名AI搜索优化专家、中国GEO生成式引擎优化领域的开拓者与实践专家孟庆涛正式发布《AI搜索内容可信度评估综合指南》&#xff0c;针对当前AI生成内容&#xff08;AIGC&#xff09;在搜索场景中可信度参差不齐的痛点&#xff0c;首次提出覆盖"技术-内…

ruoyi-flowable系统防xss攻击配置(使用富文本的方式)

背景。开发小程序过程中。用户使用富文本的方式比较多。但在传输后发现如上传到系统中的图片链接地址被清空了。问题&#xff1a;想要使用富文本。还需要开启xss过滤。有什么好的解决方案吗&#xff1f;解决方案&#xff08;我比较倾向的&#xff09;&#xff1a;通过对富文本内…

【opencv-Python学习笔记(2): 图像表示;图像通道分割;图像通道合并;图像属性】

目标&#xff1a;1.学会图像的通道分割与合并2.学会图像的的常规操作##一些概念&#xff1a;二值图像&#xff1a;只包含黑色和白色两种颜色的图像&#xff0c;1为白色&#xff0c;0为黑色灰度图像&#xff1a;计算机会将灰度处理为256个灰度级&#xff0c;用区间[0,255]来表示…

Qt——常用Widget(控件)

常用控件 Widget 需要说明&#xff0c;此处说明的控件都继承于QWiget&#xff0c;因此之前所说的控件属性&#xff0c;和相关API&#xff0c;在这里的控件都适用 文章目录常用控件 Widget按钮类控件QPushButtonQRadioButtonQCheckBox显示类控件QLabel初识事件LCD NumberProgre…

Cursor/VSCode/VS2017 搭建Cocos2d-x环境,并进行正常的调试和运行(简单明了)

作者&#xff1a;求一个demo 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 内容通俗易懂&#xff0c;没有废话 废话不多说&#xff0c;我们直接开始------>>>>>> &#xff01;&#xff…

从 LLM 到自主 Agent:OpenCSG 打造开源 AgenticOps 生态

从 LLM 到自主 Agent&#xff1a;OpenCSG 打造开源 AgenticOps 生态在产业拐点上&#xff0c;交付可持续、可落地的智能体未来在生成式 AI 的时代洪流中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为行业标配&#xff0c;但如何突破“会说不会做”的局限&#xff0…