嵌入式人工智能(7-树莓派4B的IIC总线连接OLED显示中文与图片)

1、IIC总线

IIC总线(Inter-Integrated Circuit)是一种串行通信总线,也被称为I2C总线。它由飞利浦(Philips)公司在1980年代开发,用于连接微处理器和外部设备。

IIC总线使用两根信号线:SDA(Serial Data)和SCL(Serial Clock)。SDA线用于数据传输,SCL线用于时钟同步。这两根线通过上拉电阻连接到正电源电压,数据传输时通过开漏或三态输出进行。

总的来说,IIC总线是一种常用的串行通信总线,具有低成本、低功耗和简单的硬件连接等优点。它广泛应用于各种设备和系统,如传感器、存储器、显示器、音频设备等。

打开终端命令,输入gpio readall,回车,在返回的IO表中可以看见有SDA1、SCL1;SDA0,SCL0两组I2C接口,我们使用SCL1与SDA1这一组进行。

2、OLED屏

OLED使用的是单色0.96英寸显示屏,它的驱动器是SSD1306,显示尺寸为128x64像素,使用I2C通信,如下图所示。

3、连接OLED

使用杜邦线将OLED连接到面包板上面的扩展卡,没有面包板直接接树莓派。VCC接3.3V引脚,GND接地,SDA接3 - GPIO 2 (SDA),SCL接5 - GPIO 3(SCL)。

4、启用系统IIC总线

一般把所有的总线、端口、服务,能打开的全部打开,不用担心功耗问题,这点电费还是不在话下的。

或者通过raspi-congifg命令进行开启。

启用后,通过输入ls /dev/*i2c* 命令检查用户模式的IIC端口

树莓派回复I2C端口名字,也可以通过i2C-tools工具测试扫描连接开发板上的任何I2C设备,新版该i2C-tools工具已经默认安装,如果没有安装,使用sudo apt-get install -y i2x-tools命令安装即可。安装后,通过sudo i2cdetect 1查看挂载到i2c总线上的设备。可看到该OLED从设备的寄存器地址为0x3c。

5、在OLED屏显示

(1)安装luma.oled库

使用pip install luma.oled  或者 pip3 install luma.oled ,也可以sudo,代表的含义不同。

这里有一些注意事项比较麻烦,一个是pip安装的设置安装源问题,一个是高版本的Python在树莓派linux上不让直接使用pip进行安装,需要虚拟环境。我不管,上来就开整。

1、设置pip

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

2、修改权限

pip 不让安装模块:注意python版本号写你自己的别直接抄

sudo mv /usr/lib/python3.11/EXTERNALLY-MANAGED /usr/lib/python3.11/EXTERNALLY-MANAGED.bk

Installing collected packages: pyusb, cbor2, pyftdi, luma.core, luma.oled
Successfully installed cbor2-5.6.4 luma.core-2.4.2 luma.oled-3.13.0 pyftdi-0.55.4 pyusb-1.2.1
安装成功!

(2)Adafruit Python 库

这两个库都可以驱动OLED,大家找一个好用的自己摸索即可。

6、OLED屏显示Helloworld与中文

import os
import glob
import time
from PIL import Image  
from PIL import ImageDraw
from PIL import ImageFont
import RPi.GPIO as GPIO
import time
import luma.oled as oled  
from luma.core.interface.serial import i2c    
from luma.oled.device import ssd1306  
from luma.core.render import canvasWIDTH=128
HEIGHT=64 # 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)# 关闭警告
GPIO.setwarnings(False)# 设置输入引脚
channel = 13# 设置GPIO输入模式, 使用GPIO内置的上拉电阻, 即开关断开情况下输入为HIGH
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)def load_device():# 创建I2C接口对象  serial = i2c(port=1, address=0x3C)  # 地址可能因显示屏型号而异,由命令行“sudo i2cdetect -y 1”得到# 创建OLED设备对象  device = ssd1306(serial, WIDTH, HEIGHT) return deviceif __name__=='__main__':global devicedevice = load_device()#font = ImageFont.load_default()font = ImageFont.truetype('SIMKAI.TTF',15)while True:if GPIO.input(channel)==GPIO.LOW:GPIO.cleanup()exit()with canvas(device) as draw:#draw.rectangle((0,0,WIDTH,HEIGHT), outline=0, fill=0)draw.rectangle(device.bounding_box, outline=0, fill=0)draw.text((0,0), "Hello World",font=font, fill=255)draw.text((0,20), '欢迎你!', font=font, fill="white")

显示中文报错的小伙伴这里需要注意了。

需要将字体文件拷贝到/usr/share/fonts/truetype/目录下面才行,还需要注意大小写。

sudo cp /home/pi/Embed_Python/STKAITI.TTF /usr/share/fonts/truetype/

7、OLED显示图片或者小视频

把这张图片放到指定目录中3_OLED\pic\里面,调用PIL库的resize和convert来转换为1位图像,如果是视频,要存放多张连贯的图片,并且用数字按顺序命名。

import os
import glob
import time
from PIL import Image  
import luma.oled as oled  
from luma.core.interface.serial import i2c    
from luma.oled.device import ssd1306  
import RPi.GPIO as GPIO# 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)# 关闭警告
GPIO.setwarnings(False)# 设置输入引脚
channel = 13# 设置GPIO输入模式, 使用GPIO内置的上拉电阻, 即开关断开情况下输入为HIGH
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)WIDTH=128
HEIGHT=64 def search_dir_pic(dir_name, suffix):# 设置文件夹路径  folder_path = os.path.join(os.getcwd(), dir_name)print(dir_name)print(folder_path)# 使用glob模块匹配以数字命名的文件  number_files = glob.glob(os.path.join(folder_path, '[0-9]*.'+suffix)) print('图片文件名')print(number_files)return number_filesdef load_device():# 创建I2C接口对象  serial = i2c(port=1, address=0x3C)  # 地址可能因显示屏型号而异,由命令行“sudo i2cdetect -y 1”得到# 创建OLED设备对象  device = ssd1306(serial, WIDTH, HEIGHT) return devicedef load_pic(pic_name):# 加载图片并调整大小  #print('ready show pic'+pic_name)image = Image.open(pic_name).convert('1')  # 转换为1位图像  image = image.resize((WIDTH, HEIGHT)) return imagedef show(image):# 将图片数据发送到OLED  device.display(image)time.sleep(1/24)if __name__=='__main__':global devicedevice = load_device()pic_group = search_dir_pic('3_OLED/pic', 'jpg')while True:if GPIO.input(channel)==GPIO.LOW:GPIO.cleanup()exit()for pic_file in pic_group:image = load_pic(pic_file)show(image)

总之用Pyhton语言来做就是搭积木,相比C语言的寄存器编程、库函数编程、HAL编程都要简单多了,我好像什么都没有写就完成简单的功能了。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript 算法】树的遍历:前序、中序与后序

🔥 个人主页:空白诗 文章目录 一、前序遍历(Preorder Traversal)前序遍历的步骤前序遍历的JavaScript实现 二、中序遍历(Inorder Traversal)中序遍历的步骤中序遍历的JavaScript实现 三、后序遍历&#xff…

朴素模式匹配算法与KMP算法(非重点)

目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现(只会出现在选择题,考察代码的概率不大) 三. 手算next数组四. KMP算法的进一步优化4…

springboot2.x AOP 默认使用Cglib 源码

一、背景 在 SpringBoot 2.x AOP中会默认使用Cglib来实现,但是Spring5中默认还是使用jdk动态代理。Spring AOP 默认使用 JDK 动态代理,如果对象没有实现接口,则使用 CGLIB 代理。也可以强制使用 CGLIB 代理。springboot默认使用cglib实现代码…

在GPU上运行PyTorch

文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主&#x…

使用assembly插件来将外部文件夹打进jar包

目录&#xff1a; 1、pom文件的配置2、新建assembly的描述文件3、maven打包 1、pom文件的配置 <!--maven构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</ar…

python自动化之用flask校验接口token(把token作为参数)

用到的库&#xff1a;flask 实现效果: 写一个接口&#xff0c;需要token正确才能登录 代码&#xff1a; # 导包 from flask import Flask,request,jsonify,json # 创建一个服务 appFlask(__name__) # post请求&#xff0c;路径&#xff1a;/query app.route(/query, met…

ESP32部署TensorFlow Lite

本来是想找一篇中文教程&#xff0c;不过只看到一个英文官方的&#xff0c;也行吧&#xff0c;虽然效率会慢丢丢。 GitHub - espressif/esp-tflite-micro: TensorFlow Lite Micro for Espressif Chipsets 看了一圈&#xff0c;有个中文的&#xff1a; esp-dl/README_cn.md a…

C语言 ——— 编写代码,判断 整型数组 是否 有序

目录 题目要求 代码实现 题目要求 判断 整型数组 是否有序 如果 整型数组 有序输出 sorted&#xff1b;否则输出 unsorted 代码实现 #include<stdio.h> int main() {int arr[10] { 0 };int sz sizeof(arr) / sizeof(arr[0]);//输入for (int i 0; i < sz; i){s…

5个超牛的Java开源OA项目(强烈推荐)

1. O2OA ——开源地址&#xff1a;https://gitee.com/o2oa/O2OA 概述&#xff1a; O2OA 是一款真正全代码&#xff08;包含服务器、安卓以及IOS客户端&#xff09;开源的企业应用定制化开发平台&#xff0c;适用于企业OA、协同办公类信息化系统的建设和开发。技术&#xff1a;…

【JavaScript 算法】栈与队列:解决括号匹配问题

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、总结 在编程中&#xff0c;括号匹配问题是一类常见的算法题&#xff0c;通常用于验证括号的正确性&#xff0c;即检查括号是否成对出现且嵌套正确。栈&#xff08;Stack&#xff0…

Uniapp基础篇(持续更新)

1. Uni-app常用内置组件 view 视图容器 scroll-view 可滚动视图区域&#xff0c;用于区域滚动。需注意在webview渲染的页面中&#xff0c;区域滚动的性能不及页面滚动。 swiper 滑块视图容器。一般用于左右滑动或上下滑动&#xff0c;比如banner轮播图。 image uniapp官方iam…

软件测试——非功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

微软的vscode和vs2022快捷键官网链接

vscode官方文档:https://code.visualstudio.com/docs/ vscode快捷键官方文档:https://code.visualstudio.com/docs/getstarted/keybindings vs2022官方文档:https://learn.microsoft.com/zh-cn/visualstudio/ide/?viewvs-2022 vscode快捷键官方文档:https://learn.microsoft.c…

Spring Cloud环境搭建

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 开发环境安装 1.1 安装JDK ​1.2 安装MySQL 2. 案列介绍 2.1 …

【顺序表】算法题 --- 力扣

一、移除元素 移除元素 这个题让我们移除数组nums中值为val的元素&#xff0c;最后返回k&#xff08;不是val的元素个数&#xff09; 这样显然我们就不能再创建一个数组来解决这个问题了&#xff0c;只能另辟蹊径 思路&#xff1a;双指针 这里定义两个指针&#xff08;l1&…

解决Ubuntu 20.04下外接显示屏无信号问题【多次尝试无坑完整版!!!】

解决Ubuntu 20.04下外接显示屏无信号问题【多次尝试无坑完整版&#xff01;&#xff01;&#xff01;】 一、引言 作为一名开发者&#xff0c;我经常在Windows和Ubuntu之间切换&#xff0c;以满足不同的开发需求。最近&#xff0c;我在使用惠普暗影精灵9&#xff08;搭载RTX 4…

算法力扣刷题记录 四十九【112. 路径总和】和【113. 路径总和ii】

前言 二叉树篇继续。 记录 四十九【112. 路径总和】和【113. 路径总和ii】 一、【112. 路径总和】题目阅读 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 target…

框架设计MVC

重点&#xff1a; 1.用户通过界面操作&#xff0c;传输到control&#xff0c;control可以直接去处理View&#xff0c;或者通过模型处理业务逻辑&#xff0c;然后将数据传输给view。 2.control包含了model和view成员。 链接&#xff1a; MVC框架详解_mvc架构-CSDN博客 MVC架…

vue 给特定满足条件的表单数据添加背景颜色,组件的 row-class-name

1、:row-class-name"tableRowClassName" 可为表格每行根据后面的函数绑定class名 <!-- 列表框 --><div class"tableList"><el-table :data"teamModelListTable" style"width: 100%"selection-change"handleSele…

【Sklearn-驯化】一文搞懂sklearn中特征平滑之-贝叶斯平滑策略使用技巧

【Sklearn-驯化】一文搞懂sklearn中特征平滑之-贝叶斯平滑策略使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容…