使用.Net nanoFramework 驱动ESP32的OLED显示屏
本文介绍如何使用.Net nanoFramework 驱动ESP32的OLED显示屏。我们将会从最基础的部分开始,逐步深入,让你能够理解并实现整个过程。无论你是初学者还是有一定经验的开发者,这篇文章都会对你有所帮助。
1. 硬件准备
1.1 ESP32开发板
这里我们选用的 ESP32 开发板是微雪的 ESP32-S3-Zero ,体积非常小巧,但是功能非常强大,这款开发板采用了 ESP32-FH4R2 系统级芯片(SoC),这是一款集成了低功耗 Wi-Fi 和 BLE5.0 的芯片,具有 4MB 的 Flash 和 2MB 的 PSRAM。它还配备了硬件加密加速器、随机数生成器(RNG)、HMAC 和数字签名模块,以满足物联网的安全要求。
虽然开发板小巧,但是其引脚提供的却是着实不少,下图是 ESP32-S3-Zero 的引脚图:

1.2 OLED显示屏
这里我们选用的 OLED 显示屏还是我之前的 0.96寸 黄蓝双色OLED模块,这款显示屏采用了 SSD1306 驱动芯片,支持 I2C 通信,分辨率为 128x64,非常适合用来做小型的显示屏。其一共4个引脚接口:3.3V正极VCC,负极GND,SCL时钟线,SDA数据线。

这款显示屏可以说是一代人的回忆,当年的MP3等小型电子设备都是采用的这款显示屏,虽然现在已经被淘汰了,但是它的显示效果还是非常不错的,依然在硬件开发和学习领域有着广泛的应用,而且价格也非常便宜,只需要 10 元左右就可以买到。
2. 硬件连接
硬件的连接非常简单,首先是供电:只需要将 OLED 的 VCC 接到 ESP32 的 3.3V 引脚,GND 接到 ESP32 的 GND 引脚。然后将 SCL 和 SDA 接到 ESP32 支持 I2C 通信的引脚即可,这里我们选择的是 GP1 和 GP2。

3. 软件准备
这里的软件准备不做过多的介绍,可以看之前的文章《快速入门 .NET nanoFramework 开发 ESP32-Pico 应用》。该文章中介绍了如何安装 .NET nanoFramework 开发环境,以及如何使nanoff工具进行固件刷写。
需要注意的是,这里我们使用的是 ESP32-S3-Zero 开发板,所以在刷写固件的时候,可以选择 ESP32_S3 或 ESP32_S3_BLE。
nanoff --target ESP32_S3_BLE --serialport COM5 --update
4. 编写代码
4.1 依赖安装
打开 Visual Studio,创建一个新的 .NET nanoFramework 应用,通过 nuget 安装以下包依赖:
- nanoFramework.Hardware.Esp32
- nanoFramework.Iot.Device.Ssd13xx
- nanoFramework.System.Collections
4.2 绘图方法
SSD1306 驱动提供了一些绘图方法,这些方法允许你在屏幕上像素级别的绘图:
- DrawPixel(…):绘制一个像素
- DrawHorizontalLine(…):绘制一条水平线
- DrawVerticalLine(…):绘制一条垂直线
- DrawFilledRectangle(…):绘制一个填充的矩形
- DrawBitmap(…):绘制一个位图
- DrawString(…):使用预设的字体绘制一个字符串
使用这些方法,你无需关心驱动程序使用的任何技术来显示你的绘图指令。
另外,关于字体方面的设置需要注意。因为设备的资源有限,所以字体需要通过点阵数据转换为十六进制编码在代码中使用,这里我们使用的是 BasicFont 字体,可以在官方的示例中找到。
关于点阵字体更多的介绍,可以关注之后的文章,我会专门介绍如何制作点阵字体。
4.3 编写代码
对于 ESP32 设备,我们需要根据我们的接线情况,对设备的引脚进行配置,这里我们需要配置 I2C 的 SCL 和 SDA 引脚,代码如下:
Configuration.SetPinFunction(1, DeviceFunction.I2C1_DATA);
Configuration.SetPinFunction(2, DeviceFunction.I2C1_CLOCK);
然后我们需要创建一个 I2cDevice 对象,用来进行 I2C 通信,传递给 SSD1306 驱动,代码如下:
using Ssd1306 device = new Ssd1306(I2cDevice.Create(new I2cConnectionSettings(1, Ssd1306.DefaultI2cAddress)), Ssd13xx.DisplayResolution.OLED128x64);
最后我们就可以通过 SSD1306 驱动来控制 OLED 显示屏了:
device.ClearScreen();
device.Font = new BasicFont();
device.DrawString( 0, 0, "nanoFramework", 1);
device.DrawString(0, 32, ".NET", 3);
device.Display();
将代码部署到 ESP32 开发板上,就可以看到 OLED 显示屏上显示出了我们想要的内容。

对于显示较长的字符串,我们可以通过滚动的方式来显示,代码如下:
// 滚动展示更多内容string str = ".net nanoFramework ";//增加2个空格,确保显示效果
int strWidth = device.Font.Width * str.Length; // 计算原始字符串的宽度
int ledWidth = 128; // 设备的宽度
int showTimes = 5; // 内容需要显示次数
int showWidth = strWidth * showTimes - ledWidth; // 计算内容需要左移的宽度
string showStr = "";
// 增加 showStr + str 直到大于 showWidth
do
{showStr += str;
}while (device.Font.Width * showStr.Length < showWidth);for (int i = 0; i < showWidth; i++)
{// 清除滚动区域device.ClearDirectAligned(0, 0, 128, 16);// 根据条件修正字符串的起始位置int x = i > strWidth ? i - strWidth : i;device.DrawString(-x, 0, showStr, 1); // 将字符串的起始位置向左移动device.Display();Thread.Sleep(10);
}

5. 总结
本文介绍了如何使用.Net nanoFramework 驱动ESP32的OLED显示屏。我们将会从最基础的部分开始,逐步深入,让你能够理解并实现整个过程。无论你是初学者还是有一定经验的开发者,这篇文章都会对你有所帮助。
相关文章:
使用.Net nanoFramework 驱动ESP32的OLED显示屏
本文介绍如何使用.Net nanoFramework 驱动ESP32的OLED显示屏。我们将会从最基础的部分开始,逐步深入,让你能够理解并实现整个过程。无论你是初学者还是有一定经验的开发者,这篇文章都会对你有所帮助。 1. 硬件准备 1.1 ESP32开发板 这里我们…...
0基础学习VR全景平台篇第134篇:720VR全景,云台调整节点
相机、云台和脚架全套设备组装完成后需要进行调校才能开始拍摄。这一节,我们将主要介绍云台调整的两个内容:对中心靶、调三点一线。(后附调校原理) 云台部件名称 一、调节准备 (一)对于安装好的云台 1.检…...
扫地机器人地图与用户终端的同步
以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/APaJheSbgTW3jNssWsp5Ng 地图数据来源于机器人算法模块,一般通过SLAM算法完成建图的过程。 建图过程中,基础数据涉及到各…...
使用机器学习进行语法错误检测/纠正
@francescofranco_39234 一、说明 一般的学习,特别是深度学习,促进了自然语言处理。各种模型使人们能够执行机器翻译、文本摘要和情感分析——仅举几个用例。今天,我们将研究另一个流行的用途:我们将使用Gramformer构建一个用于机器学习语法错误检测和纠正的管道。 阅读本文…...
从0到1快速入门ETLCloud
一、ETLCloud的介绍 ETL是将业务系统的数据经过抽取(Extract)、清洗转换(Transform)之后加载(Load)到数据仓库的过程,目的是将企业中的分散、凌乱、标准不统一的数据整合到一起,为企…...
QT上位机开发(会员管理软件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们学习了ini文件的解析办法,通过QSettings类就可以很轻松地访问ini文件里面的数据。除了ini文件之外,另外一种经常出…...
线性代数笔记3 1.1
学习视频: 2.2 矩阵运算(二)_哔哩哔哩_bilibili 包括内容: p10矩阵运算(二) p11特殊矩阵 p12逆矩阵(一) p13逆矩阵(二)...
2023年12月编程语言排行榜
TIOBE Index for December 2023 December Headline: C# on its way to become programming language of the year 2023 2023年12月的TIOBE指数:12月头条:c#将成为2023年最佳编程语言 Yes, I know, we have been here before. At the end of 2022, it looked like …...
Redis VS Memcached:选择哪个更适合您的应用?
目录 1、前言 2、概念简介 2.1 Redis 2.2 Memcached 3、数据模型 4、持久性 5、分布式能力 6、性能和扩展性 7、如何选择适合您引用的缓存系统 8、结语 1、前言 Redis和Memcached都是常见的内存缓存系统,用于提升应用程序的性能和可扩展性。它们都具有高…...
【HarmonyOS开发】共享包HAR和HSP的创建和使用以及三方库的发布
OpenHarmony提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包。 HAR与HSP都是为了实现代码和资源的共享,都可以包含代码、C库、资源和配置文件&…...
安装 Node.js、npm
安装 nodejs 安装Node.js的最简单的方法是通过软件包管理器。 Node.js官网:https://nodejs.org/en/download/ cd /usr/local/src/wget -c https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz xz -d node-v18.16.0-linux-x64.tar.xz tar -xf node…...
解决报错:找不到显卡
今天做实验碰到一个问题:torch找不到显卡: 打开任务管理器,独显直接没了,一度以为是要去修电脑了,突然想到上次做实验爆显存,屏蔽了gpu用cpu训练: import os os.environ["CUDA_DEVICE_OR…...
如何使用Node.js快速创建本地HTTP服务器并实现公网访问服务端
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【社交网络分析】课程考试复盘 + 相关资料补充
【社交网络分析】考试后复盘 相关资料补充 写在最前面论述1.描述Logistic回归模型构造损失函数的主要思想。它是如何把线性回归预测模型转化为二分类模型的。Logistic回归模型构造损失函数的主要思想Logistic回归如何将线性回归预测模型转化为二分类模型 2.社交网络分析中面临…...
算法——队列+宽搜(BFS)
队列这种数据结构大都服务于一个算法——宽搜(BFS)。宽搜还可以运用到二叉树、图、迷宫最短路径问题、拓扑排序等等 N叉数的层序遍历 N叉树的层序遍历 题目解析 给定一个 N 叉树,返回其节点值的_层序遍历_。(即从左到右&#…...
前端八股文(CSS篇)二
目录 1.css中可继承与不可继承属性有哪些 2.link和import的区别 3.transition和animation的区别 4.margin和padding的使用场景 5.::before和:after的双冒号和单冒号有什么区别? 6.display:inline-block什么时候会显示间隙 7…...
系统架构设计师笔记
第1章计算机组成与体系结构 1.1.1计算机硬件的组成 (1)控制器。控制器是分析和执行指令的部件,也是统一指挥并控制计算机各部件协调工作的中心部件,所依据的是机器指令。控制器的组成包含如下。 ①程序计数器PC:存储下…...
Livox-Mid-360 固态激光雷达ROS格式数据分析
前言: Livox-Mid-360 官方采用livox_ros_driver2ROS功能包发布ROS格式的数据,livox_ros_driver2可以把Livox原始雷达数据转化成ROS格式并以话题的形式发布出去。 下面列举一些雷达的基本概念: 点云帧:雷达驱动每次向外发送的一…...
如何恢复 iPhone 上永久删除的照片?
2007年,苹果公司推出了一款惊天动地的智能手机,也就是后来的iPhone。你会惊讶地发现,迄今为止,苹果公司已经售出了 7 亿部 iPhone 设备。根据最新一项调查数据,智能手机利润的 95% 都进了苹果公司的腰包。 如此受欢迎…...
基于单片机的公交车站自动报站器设计与实现
一、摘要 随着城市交通的快速发展,公交车作为城市公共交通的主要工具,其便捷性和高效性得到了广泛的认可。然而,由于公交车站的广播系统存在一定的局限性,如人工报站容易出现失误、音量大小不一等问题,给乘客带来了不…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
