SPI 接口OLED 模块 - 兼容5V 和3.3V 电平
PCB 布局参考了老王0.8元128x32OLED显示屏转接板,开源项目地址:老王0.8元128x32OLED。


老王家买的屏幕放了快一年了,终于还是决定整个单独的模块,之前一直打算集成到开发板上的,不太灵活。相比那个转接板,主要的修改是:
- 添加了3.3V LDO,ME6206A33,就是常用的662K,可以兼容3.3V 到5V 的输入电压;
- 四线SPI 接口加入了电平转换电路,可以兼容3.3V 和5V 电平;
- 7pin 排针减少到6pin,去掉复位,没什么用;
- 去掉多余的螺丝孔,板子面积很小,一个M3 螺丝就够固定了。不需要螺丝固定的话还可以一剪子把螺丝孔突出的环形部分剪掉;
实物图如下:

电路

就是复制粘贴成品OLED 模块的上电路,电容的参数不敏感,小范围变动取值对屏幕工作没什么影响,比如C4,换成0.1uF 实测也OK。
供电
参考ME6206 的规格书:

OLED 工作电流不大,所以压差应该不超过300mV。理论上,如果输入3.3V,输出电压仍大于3V,而OLED 芯片SSD1316 的规格书上说最低电压3V,所以足够驱动了。另外,OLED 模块的电源正极V+ 可以不接,因为CS 线默认是高电平,只在通讯过程中拉低,其他几个信号线也可能间歇地处于高电平,那么当单片机使用5V 供电时,可以只通过这几个信号线给OLED 供电,实测基本能用,只是屏幕亮度会降低,还有点闪。
电平转换
因为模块是用SPI 驱动的,参考:SPI 接口OLED 使用5V 信号驱动可能需要电平转换,就是说如果直接和5V 单片机连在一起,屏幕可能不工作,所以就加了四组分压电路,用来把5V 电平降到3.3V。

还有个拨动开关SW-LVL-SHIFT,开关闭合时启用分压功能,断开后分压电路就退化成了限流电路,下拉部分R7 至R10 失去作用,R3 和R6 串入信号线里限流。经过实测,用5V 的Arduino 驱动,只要限流电阻就够了,OLED 可以工作,所以四个下拉电阻和拨动开关可以不装。不过,SPI 信号线SCLK 和MOSI 上的限流电阻肯定会影响信号的上升时间,也就是说SPI 通信频率不能太高,虽说我也没试过最高能到多少。
焊接
- 原理图里那两个和0.1uF 电容并联的4.7uF 电容可以不装,之前试过,能用;
- 像上面说的,2k 下拉电阻R7 至R10 以及拨动开关也可以不装;
- 如果确定不需要兼容5V 电平,LDO 可以去掉,1k 限流电阻可以用一坨锡替代;
- LDO 的输入输出电阻也可以用1uF,怎么方便怎么来;
所有元件都是贴片的,而且是单面安装,推荐使用焊锡膏配加热台的焊接方式,我是用针管点锡膏的,反正元件种类不多,熟悉之后也挺快的,唯一的难点就是那个座子,我就没遇到过能一次性焊好的。如果用加热台焊接,注意座子底下焊锡膏尽量少一点,免得之后连锡太多拖不开;要是焊锡膏太多,融化的锡球还可能把座子给顶起来。不推荐用热风木仓焊座子,很容易烤坏,其实加热台基本也焊不了座子,只是能初步把座子固定在焊盘上,之后用烙铁的时候稍微省点事。
座子的焊盘我修改过,把引脚的焊盘向外拉长了,就是为了方便检查和用烙铁拖。除了电烙铁,必要的工具还有放大镜和助焊膏。处理连锡的方法就是先助焊膏满上,把烙铁头用海绵或者钢丝球清理干净,然后轻柔的贴在连锡的焊盘上向外拖。动作轻柔的目的是避免把焊盘刮坏,引脚的焊盘间距太小了,阻焊层很脆弱。此外,还要避免烙铁头把融化的锡挤到座子里面。除了容易连锡,还容易虚焊,可以用放大镜快速观察一下,涂满助焊膏,在烙铁头上沾一点焊锡,然后从里往外拖,让烙铁上的锡沾到引脚和焊盘上,沾得焊锡太多就容易把焊锡挤进座子内部。烙铁和座子引脚接触时间太长的话会让座子内部的铜引脚被加热到比较高的温度,焊锡也就更容易跑进去。
故障排除
如果单片机程序ok,但屏幕全黑,没反应,首先考虑是不是座子上连锡或虚焊。连锡用放大镜很容易观察到,用干净的烙铁头配上助焊膏也很容易拖干净,所以更可能是虚焊。此时需要先把屏幕拔下来,这里也有点要注意的地方,如果是虚焊,说明座子的引脚只靠塑料件固定着,没连到焊盘上,那么,刚经过高温焊接,塑料肯定有一些变形,引脚的固定不一定牢靠,有可能在拔掉屏幕时把座子的引脚一起拔下来,避免的方法当然是尽量控制焊接温度和时间。然后要么拿放大镜纯靠眼力判断虚焊的地方,要么就用万用表测量焊盘和座子引脚的通断,可能需要用细尖表笔,一个一个扫过去,熟练的话也不怎么费劲。
如果屏幕能亮,但是亮度比较低,会闪烁,那可能是那个560K 的电阻没焊好。加热台上焊接有时候会出现立碑的现象,就是电阻之类的小东西一侧的焊锡比较少,然后电阻被另一侧的焊锡拉着拽起来了,导致电阻一边浮空。总之大部分问题应该都是和座子的焊接有关,其他元件没焊好容易观察到。
例程
使用例程参考Arduino 版u8g2 库的例子,屏幕型号SSD1316 128x32,四线SPI 驱动方式,RST 不连接, 参数上写U8X8_PIN_NONE。虽然,似乎大部分人都说这屏幕是128x32,但我不管怎么试,看起来都更像是128x28,用8x7 的字符刚好够显示4 行,8x8 的字符第四行会显示不全。顺便放上一个Hello world 例程,Arduino 加U8G2 库,使用硬件SPI:
/*HelloWorld.ino"Hello World" version for U8x8 APIUniversal 8bit Graphics Library (https://github.com/olikraus/u8g2/)Copyright (c) 2016, olikraus@gmail.comAll rights reserved.Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/#include
#include #ifdef U8X8_HAVE_HW_SPI
#include
#endif//DC 连接到D9, CS 到D10,SCK 和MOSI 连到对应的SPI 引脚,V+ 连接到5V 或3.3V 电源,也可以不接。
U8X8_SSD1316_128X32_4W_HW_SPI u8x8(10, 9, U8X8_PIN_NONE); void setup(void)
{u8x8.begin();u8x8.setPowerSave(0);
}void loop(void)
{static bool line = false;u8x8.setFont(u8x8_font_chroma48medium8_r);if(line) {u8x8.drawString(0,1,"1: 8x7 character");u8x8.drawString(0,2,"2: 4 line => 28 ");}else {u8x8.drawString(0,1,"Hello World! ");u8x8.drawString(0,2,"Hello World! ");}line = !line;u8x8.drawString(0,0,"0 start line");u8x8.drawString(0,3,"3 end line");delay(2000);
}
相关文章:
SPI 接口OLED 模块 - 兼容5V 和3.3V 电平
PCB 布局参考了老王0.8元128x32OLED显示屏转接板,开源项目地址:老王0.8元128x32OLED。 老王家买的屏幕放了快一年了,终于还是决定整个单独的模块,之前一直打算集成到开发板上的,不太灵活。相比那个转接板,主…...
css布局和定位
在Web开发中,CSS布局和定位是非常重要的技能。在这篇博客中,我们将深入探讨CSS布局和定位的概念、基本技术和最佳实践。 **CSS布局基础** ├── 盒模型 │ ├── 内边距 │ │ ├── padding │ │ ├── padding-top │ │ ├── p…...
python -- 批量读取多个文件,并将每个文件中相同变量累加
python – 批量读取多个文件,并将每个文件中相同变量累加 情况描述 现有多个nc文件,位于同一个文件夹中,如下所示每个文件中都有相同的变量,想要读取每个文件中的变量然后将其加起来意思就是说: 文件1中的变量文件2中…...
低代码开发流程是怎么样的?
低代码开发流程是怎么样的?现在很多文章都在下功夫宣传what(低代码是什么)、why(为什么要用低代码),但是很少有文章能够系统讨论how(怎么用低代码)的问题。 所以我花3天的时间准备了…...
任何时候都不要在 for 循环中删除 List 集合元素!!!
首先说结论:无论什么场景,都不要对List使用for循环的同时,删除List集合元素,因为这么做就是不对的。 阿里开发手册也明确说明禁止使用foreach删除、增加List元素。 正确删除元素的方式是使用迭代器(Iteratorÿ…...
koa+Vite+vue3+ts+pinia构建项目
一、 初始化构建项目 npm create vite myProject -- --template vue-ts 注:Vite 需要 Node.js 版本 14.18,16。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版…...
k8s-yaml文件
文章目录一、K8S支持的文件格式1、yaml和json的主要区别2、YAML语言格式二、YAML1、查看 API 资源版本标签2、编写资源配置清单2.1 编写 nginx-test.yaml 资源配置清单2.2 创建资源对象2.3 查看创建的pod资源3、创建service服务对外提供访问并测试3.1 编写nginx-svc-test.yaml文…...
存储引擎
目录 ❤ MySQL存储引擎 什么是存储引擎? MySQL支持哪个存储引擎? ❤ 各种存储引擎的特性 概述 各种存储引擎的特性 各种搜索引擎介绍 ❤ 常用存储引擎及适用场景 ❤ 存储引擎在mysql中的使用 存储引擎相关sql语句 指定存储引擎建表 在建表时指定 在配置文件中…...
Go中 channel的使用
文章目录背景channel 简介使用说明声明发送和接受数据关闭channel使用示例背景 使用 sync 包和 context 包的工具可以实现多个协程之间互相协作, 但是没有一种很好的方式解决多个协程之间通信的问题. golang 作者 Rob Pike 说过一句话,不要通过共享内存来通信&…...
【C++】string OJ练习
文章目录1. 仅仅反转字母思路分析代码实现2. 字符串中的第一个唯一字符题目分析代码实现3. 《剑指offer》——替换空格解法一:寻找替换思路分析代码实现优化解法二:空间换时间思路分析代码实现4.字符串最后一个单词的长度思路分析代码实现5. 字符串相加思…...
进程间通信IPC
进程间通信IPC (InterProcess Communication) 一、进程间通信的概念 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据…...
操作系统-页面淘汰算法(下)-软件设计(二十六)
操作系统-PV操作(上)-软件设计(二十五)https://blog.csdn.net/ke1ying/article/details/129476031 存储管理-分区存储组织 问:计算机系统内存大小为128k,当前系统分配情况如图,那么作业4再次申…...
23种设计模式-责任链模式(Android开发实际应用场景介绍)
什么是责任链模式 责任链模式是一种行为型设计模式,它的核心思想是将请求从一系列处理者中传递,直到其中一个处理者能够处理它为止。在这个过程中,请求可以被任何一个处理者处理,也可以被拒绝,直到有一个处理者能够处…...
Socket+Select+Epoll笔记
讲到epoll,就必须了解Socket,上篇博客写了Socket的基本使用方法,步骤主要为创建一个socketsocket是进程之间通信的,那么进程通信如何找到这个socket呢?当然是端口号,所以socket就要和端口号进行绑定&#x…...
git查看最近修改的文件
git log --name-status 每次修改的文件列表, 显示状态 git log --name-only 每次修改的文件列表 git log --stat 每次修改的文件列表, 及文件修改的统计 git whatchanged 每次修改的文件列表 git whatchanged --stat 每次修改的文件列表, 及文件修改的统计 git show 显示最…...
【算法基础(四)】堆排序(二)
堆排序(二) 把数组从零开始连续的一段 完全二叉树 size i 左 son 2*11 i 右 son 2*12 父 (i-1) / 2 堆是完全二叉树,分为大根堆和小根堆 在完全二叉树里,每一棵子数最大的值是头节点的值,就是大根堆 同理&…...
C++类型转换
C语言的转换是在变量前加类型名进行转换的,比如double pi 3.14;int a (int) pi;对于指针也是如此double* dptr πint* iptr (int*)dptr;虽然c兼容了C语言的转型方式,但是也做了很多限制,比如向上类型转换,在c中建议使用…...
Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台(2023-03-11)
注:这个是MDK6,不是MDK5 AC6,属于下一代MDK视频版: https://www.bilibili.com/video/BV16s4y157WF Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台一年一度的全球顶级嵌入式会展Embedded Wor…...
蓝桥杯刷题第九天
题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。素数就是不能再进行等分的整数。比如7,11。而 9 不是素数,因为它可以平分为 3 等份。一般认为最小的素数是2,接着是 3,5&…...
a-tree-select 基本使用,下拉框高度和宽度设置、回显时滚动条定位解决。
目录一、基本使用1. 界面效果2. 代码实现3. 问题1:下拉框占满整个屏幕4. 问题4:菜单内容过长时,下拉菜单宽度无限变宽。二、数据回显、滚动条定位1. 界面效果2. 代码实现2.1 获取默认展开节点2.1.1 代码实现2.1.2 说明2.2 设置滚动条定位2.2.…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
