esp32 spi 驱动 oled 屏显示来自 PC 的画面
esp32 spi 驱动 oled 屏显示来自 PC 的画面
实验代码
gayhub 实验源码
设备及运行环境
- 装有python的电脑
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
- esp32开发板(ttgo-t-display)
- 0.96 OLED(80 * 160 ST7735S)
流程
- PC端
- py截屏
- py缩小图片
- py将缩小的图由rgb转成 rgb565
- 将图片转码完成后以字节流的方式存入临时bin文件
- 读取bin文件,通过socket发送
- 因为需要转码、转存文件,测试之后大概是一秒四帧。(这个时候socket缓冲默认,后来缓存调整得很大,发送帧率上去了,但是数据还是堵在服务端没发送出去。。。)
- esp32
- 连接 wifi 的同时设置好端口(跟PC端设置的socket端口一样,我只是使用了 arduino中的WIFI库, 可以使用socket方式接收数据也是偶然发现的,~~后续有新的发现会做记录(谁知道我还会不会想起来嘿嘿)~)
- 设置 oled 屏 io 口,使用SPI驱动oled屏(这里有一些不理解。。。 查看 ttgo 的 io 说明,发现上面标注我所使用到的 io 口都是gpio,并不是被标注为 SPI。所以有可能是gpio模拟的 spi???~~后续有新的发现会做记录 嘿嘿~)
使用的库
- TFT_eSPI
- arduino 的 wifi 库(不确定是arduino的通用库,还是esp32的专属库。。。。。)
OLED 配置方式
- 软件配置
修改配置文件。修改 TFT_eSPI 根目录里面的 User_Setup_Select.h, 将#include <User_Setups/Setup43_ST7735.h> // Setup file configured for my ST7735S 80x160的注释删掉,然后将其它不需要用到的配置头文件注释掉
修改 io 口。 修改 TFT_eSPI/User_Setups/Setup43_ST7735.h 的文件, 修改 io 口(这里直接就是对应开发板上面标注的 io, 这里直接没有设置背光 )
#define TFT_MOSI 26 // 对应 oled板的 sda #define TFT_SCLK 27 // 对应 oled板的 scl #define TFT_CS 32 // 对应 oled板的 cs #define TFT_DC 33 // 对应 oled板的 dc #define TFT_RST 25 // 对应 oled板的 res #define TFT_BL 0 // Display backlight control pin
- 设置 wifi 得 client
const IPAddress serverIP(192,168,0,104); //欲访问的地址 uint16_t serverPort = 8080; //服务器端口号
运行时发现的问题
- 问题: 帧率低(一秒一帧。。。)。
- 实际测试来看,屏可以实现更高帧率,问题有可能是出现在了数据接收这一块,因为没有找到arduino 的 wifi库里面 client类设置缓冲大小的方法,所以缓冲是没有设置的。
- 问题: 内存告急
- 为了解决无法设置缓冲大小的问题,尝试使用多个数组来实现队列,用队列缓存数据,实现先进先出,但是创建两个数组后,内存就告急了。。。(一个数组长度 12800。。。我可能是个憨憨。。。),目前是不了了之。。。
- 问题: 设置发送端的 socket缓冲区大小为 0 可以有效提高帧率
- 当调大发送端的 socket缓冲区,发送速率翻倍增长, 但是接收端的显示帧率反倒是因此变得更加低了。发送端缓冲设置为0 确实可以让帧率提升,而后果就是丢帧严重。。。。。。。。
部分代码
- 发送端的 rgb888 转 rgb565 (起初没有发现驱动需要的色彩数据是rgb565,费了很多功夫重新阅读了驱动部分的代码,总算懵懵懂懂搞完了)
# png 转 rgb565
def png2rgb565(im):binoutfile = open("binData.bin", "wb")swapLast = ''pix = im.load() #load pixel arrayfor h in range(imgH):for w in range(imgW):if w < im.size[0]:R=pix[w,h][0]>>3G=pix[w,h][1]>>2B=pix[w,h][2]>>3rgb = (R<<11) | (G<<5) | Bif (isSWAP == True):swap_string_low = rgb >> 8swap_string_high = (rgb & 0x00FF) << 8swap_string = swap_string_low | swap_string_highbinoutfile.write(struct.pack('H', swap_string))else:print(".")else:rgb = 0binoutfile.close()
- esp32 接收部分的代码
while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据
{if (client.available()) //如果有数据可读取{// binData1 = client.read();if(flag % 2 == 0){/*读取一个像素的色彩数据的第二字节, 这里只能一次读取一个字节, 而从服务端发送的数据是用一个16位数字表示1像素点的 rgb色彩的,所以就需要读两次才可以获取一个完成像素色彩*/binData1 = client.read(); binData1 = binData1 << 8; // 左移八位result = binData0 | binData1; // 数据还原ttgo[index] = (uint16_t)result; // 数据存入缓存数组index++;if(index == 12800) // 读取完一帧就显示{index = 0;tft.pushImage(0, 0, sh, sw, ttgo);}}else{binData0 = client.read(); // 读取一个像素的色彩数据的第一字节}flag++;}else // else 啥我也想不到,反正是拿来测试的{// Serial.print("\n");}}
这次的小实验完成后感慨太多了, 因为完成的东西也是个半成品,跟预期的样子还差了很远(毕竟现在一秒一帧。。。)。不过本着一帧不卡,两帧流畅,三帧电竞的乐观精神来说,这次也不算是完败,起码我还走到了写实验总结这一步。hhhhh。接下来是回归基础学习了,毕竟在学校学的那点c语言都忘得差不多了。
学习计划 1. 重新学习c/c++ 2. 开始学习 stm32
目标 从硬件到软件,做一个穿戴设备
esp32 spi 驱动 oled 屏显示来自 PC 的画面相关推荐
- esp32使用MicroPython驱动oled屏显示中文和英文
文章目录 esp32使用MicroPython驱动oled屏显示中文和英文 介绍 安装 特点 开源 硬件连接 API 示例 显示英文字符 显示汉字 参考链接 esp32使用MicroPython驱动o ...
- 【嵌入式】STM32基于SPI通信协议OLED屏显示
STM32基于SPI通信协议OLED屏显示 一.SPI协议和OLED介绍 1.SPI协议介绍 物理层 协议层 2.OLED显示屏介绍 二.显示个人学号姓名实验 1.题目要求 2.代码部分 1.完整代码 ...
- 实验 STM32 基于SPI的OLED屏显示
STM32 基于SPI的OLED屏显示 一.任务要求 二.显示自己的学号和姓名 1.例子程序的改写 (1)下载资料 (2)解压后找到文件,并用KEIL打开. (3)改写程序 2.连接硬件 3.运行结果 ...
- 基于SPI的OLED温湿度显示
本文首先会简单介绍SPI通信协议,然后后面的实验分为两个板块,一个是OLED屏的使用,另一个是在此基础上,结合上次实验(结尾会附上链接),用OLED屏显示温湿度信息. 实验器材:STM32F103C8 ...
- 嵌入式开发-STM32硬件SPI驱动TFT屏
嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...
- 用STM32F103达成基于I2C协议的AHT20温湿度传感器和OLED屏显示汉字
目录 一 I2C协议简介 硬件I2C与软件I2C 二 代码和ATH20芯片实现温湿度的串口显示 三 用stm32f103芯片的SPI和IIC接口接上OLED屏显示中文姓名温湿度 1 先用文字字模生成器 ...
- 0.96寸OLED屏显示(IIC通信)Ⅰ
0.96寸OLED屏显示(IIC通信) 一.0.96寸OLED简介 0.96寸OLED屏内部驱动IC为SSD1306:兼容6800.8080两种并行接口方式,3线或 4线的串行SPI接口方式和 I ...
- STM32硬件SPI驱动OLED
文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...
- arduino上ESP8266用Adafruit_SSD1306库驱动OLED屏
关注.星标公众号,不错过精彩内容 编辑:Tony 来源:公众号TonyCode 在进行后续的ESP8266学习前,我们先来对OLED屏进行驱动,为后续学习提供直观的信息显示. 1. 安装驱动库 在之前 ...
最新文章
- 一不小心,删错了,还把回收站清空了,咋办啊?
- 【PAT (Advanced Level) Practice】1093 Count PAT‘s (25 分)
- Codeforces Round #587 C. White Sheet(思维+计算几何)
- CodeForces 213 E
- 用excel数据写入html,如何使用epplus将我的html表格写入excel文件
- 和get redis_Springboot2连接redis哨兵模式
- matlab学习笔记1
- python 纵向输出字符串_Python(五)字符串
- CentOS设置默认启动命令行(不启动图形界面)
- C#中winform怎么在线预览PDF,预览网上的PDF控件!不用安装Adobe PDF Reader等等其他,方案记录
- 7年了,终于拉开窗帘,看窗外,世界依然美好,这个世界,我还在
- 分不清?企业征信报告Or企业信用评级报告,差别大了去了!
- App Inventor 2能编译出苹果iOS版App吗?
- 微信的WXML和HTML WXSS和CSS的区别详解
- java反斜杠_如何在字符串中使用反斜杠(\)?
- ddn高性能服务器,DDN是什么,DDN专线的优势详解
- 手机点餐系统概述_实训答辩安卓点餐系统ppt课件
- 计算机网络 考博试题,计算机网络考博题集及参考答案9
- 软件测试之——性能测试,Web性能测试用例(详全)
- 2020年2月份所有文章汇总
热门文章
- SpringBoot 配置文件加密的两种方式
- 1+1>2,维也纳酒店欧暇·地中海如何打好投资“组合拳”?
- 我收藏的短线操作技巧
- 延迟渲染(Deferred Rendering)
- sketch mac版设置快捷键的小技巧
- 两寸照片电子版怎么弄?教你一分钟搞定
- 转Draren总结的ollydbg v1.09d 中文版使用说明
- 在…视域下是什么意思_视阈是什么意思论文范文 有关教师在社会视域中的角色认知毕业论文写作资料...
- python爬楼梯问题_爬楼梯算法的数学思路
- 君が呼ぶ、メギドの丘で スキルライン