005.Python制作客户端截屏通过合宙ESP32-C3投屏到0.96OLED
Python制作客户端截屏通过ESP32-C3投屏到0.96’OLED
一、实现原理
- Python对屏幕进行截屏,并进行数据处理
- Python与ESP32-C3通过WIFI建立tcp连接
- Python将处理后的数据发送给ESP32-C3
- ESP32-C3将接受到的数据推送给0.96’OLED
- ESP32-C3将接受到的数据推送给0.96’OLED
合宙Esp32-c3投屏电脑屏幕
二、0.96’OLED显示原理
1.显示原理
OLED显示屏宽128像素,高64像素,即128x64,共8192个像素
为了清晰这里以32x16进行展示
显示过程:
c3将0x01写入红色方框1,按照低位在前的顺序,如图进行显示,而后依次是2/3/4/5
一个十六进制字节0x01可以确定8个像素的状态,由此可知屏幕 所需字节=128∗64/8所需字节=128*64/8所需字节=128∗64/8即1024字节。
2.OLED与Esp32连接
OLED | Esp32 |
---|---|
GND | GND |
VCC | 5V |
SCL | IO5 |
SDA | IO4 |
三、Python截屏原理
1.截屏
img_screen = ImageGrab.grab() # 截屏
2.数据处理
img_screen = np.asarray(img_screen) # 将截屏转化为array,[[第1行像素],[第2行像素]...]
img_screen = cv.resize(img_screen, (myScreenWidth,myScreenHeight)) # 截切截屏图片为128*64
img_screen = cv.cvtColor(img_screen, cv.COLOR_BGR2GRAY)#转为灰度图
img_screen = cv.adaptiveThreshold(img_screen, 1, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 15, 1)#二值化 img_screen_tcp = Numpy2HexArray(img_screen)
3.将数据转化为ESP32-C3能读取的信息
#将'0,1,0,0,1,1,0,1,0,0,0,0,1,1,1,1,....'(1位代表1个像素亮或灭)转化为'b'\xb2\xf0....',前八位反向合并即为0xb2
def Numpy2HexArray(img_screen_01str):str_bin_8bit = '' # 建立空白字符串,用于存放二进制数字串len_img_screen = int(len(img_screen_01str))#图像数据为二维数组[[],[],[]],数组的长度为图片的高度,里面每一个数组存放有图片宽度个0.1数字str_hex=''# 建立空白字符串,用于存放'b2f0......'#因为imread读取图片的方式为从左往右,从上至下的方式进行#故应当先读取第一行,再读取第二行,依此类推for i in range(0, len_img_screen):#图片高度64for k in range(0,int(myScreenWidth/8)):#图片宽度128除8,用于取出每一个单一数组中的0.1数字for j in range(7+8*k, -1+8*k, -1): # 低位在前,一次将8位二进制数字(0,1,0,0,1,1,0,1)反向合并为一个字符串'10110010'str_bin_8bit = str_bin_8bit + str(img_screen_01str[i][j])mumber = int(str_bin_8bit, 2) # 字符串'00001001'转为10进制数字(178)str_bin_8bit = ''#二进制数字符串清零,读取下一个8位二进制数# 将转化得到的10进制数字(178)转化为'0xb2',确保'0xb2'宽度为2位,同时去除0x,得到b2,合并至字符串str_hex('b2f0......')str_hex=str_hex+hex(mumber)[2:].zfill(2).replace("0x","")str_hex=str_hex.strip('\n')#去除字符串结尾的'\n',确保字符串为偶数位,防止出现ODD错误img_screen_hex = binascii.a2b_hex(str_hex)#将'b2f0......'转化为'b'\xb2\xf0....',用于TCP socket传输return img_screen_hex
四、开启TCP传输
1.创建线程
def tcp_create_server(self):tcp = threading.Thread(target=self.tcp_create) # 创建串口接收线程tcp.start()
2.创建TCP连接
def tcp_create(self):global decision_path, connect_flag,connect_txrx_flagconnect_txrx_flag = 0HOST = '192.168.42.50'hoststr = 'IP :' + HOSTself.ui.textEdit.append(hoststr)PORT = 9999portstr = '端口:' + str(PORT)self.ui.textEdit.append(portstr)BUFSIZ = 1024ADDR = (HOST, PORT)tcpSerSock = socket(AF_INET, SOCK_STREAM)tcpSerSock.bind(ADDR) # 绑定IP地址和端口号tcpSerSock.listen(5) # 监听,使得主动变为被动print('正在等待连接....')self.ui.textEdit.append('正在等待连接....')while True:tcpCliSock, addr = tcpSerSock.accept() # 当来新的连接时,会产生一个的新的套接字为客户端服务print(tcpCliSock)print(addr)print('连接成功')self.ui.textEdit.append('连接成功'+str(addr))connect_flag = 1myrec = threading.Thread(target=rec, args=(tcpCliSock, BUFSIZ,))myrec.start()mysend = threading.Thread(target=send, args=(tcpCliSock,))mysend.start()tcpSerSock.close()
3.发送数据
def send(tcpCliSock):global connect_flagglobal decision_pathglobal path_change_flagdelay = 0.8# data = screen_capture_tcp()while connect_flag:data = screen_capture_tcp()tcpCliSock.send(data)time.sleep(delay) # 间隔delay秒发一次tcpCliSock.close()
五、ESP32-C3接受并显示
1.连接WIFI
const char* ssid = "XTZJM"; //填写你的wifi名字,笔记本和ESP32连接同一WIFI
const char* password = "XXXX"; //填写你的wifi密码
const int httpPort = 9999; //设置上位机端口
char* IP = "192.168.42.50"; //上位机IP
WiFi.begin(ssid, password); //连接wifidisplay.setFont(ArialMT_Plain_10); delay(1000); //等待1秒while (WiFi.status() != WL_CONNECTED) //判断wifi是否连接成功{delay(1000); //每500毫秒检测一次状态display.clear();display.drawString(0, 32,"Connect to wifi....");display.display();}
2.接受数据
while (client.available()) {read_count = client.read(buff, 1024); //向缓冲区读取数据if (read_count == 1024) {read_count = 0;display.clear();display.drawXbm(0, 0, WiFi_Logo_width, WiFi_Logo_height, buff);display.display();}}display.clear();display.drawXbm(0, 0, WiFi_Logo_width, WiFi_Logo_height, buff);display.display();}}
005.Python制作客户端截屏通过合宙ESP32-C3投屏到0.96OLED相关推荐
- 合宙esp32+显示屏测试
1.开发板 合宙esp32 c3,主频160mhz. 2.显示屏 合宙0.96寸lcd,驱动为st7735. 3.代码 这是开发板的定义,如果要修改开发板则需要去示例程序PDQ graphicstes ...
- Arduino框架下通过TFT_eSPI库驱动ESP32+合宙1.54“ 电子墨水屏(e-paper)显示
Arduino框架下通过TFT_eSPI库驱动ESP32+合宙1.54" 电子墨水屏(e-paper)显示 demo演示效果 相关库 EPD_Libraries:https://github ...
- Arduino框架下ESP32+合宙1.54“ 电子墨水屏(e-paper)驱动显示示例
Arduino框架下ESP32+合宙1.54" 电子墨水屏(e-paper)驱动显示示例 显示效果展示; 合宙1.54" 电子墨水屏 有关合宙1.54"电子墨水屏的介绍资 ...
- pc投屏android软件,Scrcpy安卓电脑投屏软件下载
Scrcpy安卓投屏软件是一款非常棒的安卓电脑投屏软件工具.这款软件可以为用户提供有线.无线两种投屏方式,用户可以方便地利用 Scrcpy 来测试 APP 应用.玩游戏.高效完成一些需要在手机上进行的 ...
- 电脑投屏软件哪个好_无线投屏器和软件投屏的区别是什么,哪个更好用?
日常生活中,我们运用无线投屏器和软件投屏都可以实现投屏功能,因此就有不少用户会疑惑两者有什么区别,今天小智就带大家来了解一下什么是无线投屏器,什么又是软件投屏,以及两者的不同之处. 一.无线投屏器和软 ...
- AirServer专业的投屏软件 支持安卓、苹果手机投屏至电脑
AirServer一款专业的投屏软件,支持安卓.苹果手机投屏至电脑,畅享办公.教学.直播.会议.游戏.2K高清投屏详细的投屏教程让投屏更加简单,同时支持多设备投屏.不需要中间的转换设备,可以直接进行投 ...
- iphone屏幕录制_如何将iPhone投屏到Mac上?iphone投屏到苹果电脑方法
不知道你们在生活.学习或者工作中有没有萌生过要是能把手机屏幕投放到电脑上就好了的念头. 如何将iPhone投屏到Mac上?iphone投屏到苹果电脑方法 - macw下载站www.macw.com ...
- 投屏画面尺寸拉伸怎么办_手机投屏转换器设置方法图文教程
手机投屏电视转换器可以让手机投屏电视.投影仪等大屏显示设备,高清看直播玩游戏更畅快. 下面是绿联手机投屏电视转换器US228的设置教程,本教程适用于安卓手机和iPhone,非智能电视也通用. 一.苹果 ...
- 华为手机投屏电脑_华为手机如何投屏到电脑?这很实用
原标题:华为手机如何投屏到电脑?这很实用 前几天打电话回家,老家的爸妈老是不太开心的样子,问了又不说,直到周末的时候回了趟家才知道,原来二老是为了家里的电视不开心.农村老年人没啥业余活动,晚上也只能围 ...
最新文章
- vue中 静态文件引用注意事项
- 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器...
- jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同怎么办
- MonoDroid相关资源
- 在linux下添加路由
- 通俗易懂,先来认识一下Vuex
- 计算机处理负数加法,怎么让加法器实现两个负数相加
- mysql8.0 的新特性_MySQL8.0-新特性汇总
- c#.net实体类序列化方法 为什么要序列化
- python sqlite3
- url存在宽字节跨站漏洞_【XSS漏洞】XSS漏洞相关总结v1.0
- 安装搭建zimbra邮件服务器(dns域名解析)
- 【java与移动智能设备】高级用户组件
- Java程序设计应用教程_Java程序设计及应用开发教程.pdf
- 不确定度在线计算_计量测量的不确定度详解
- 在Mind+下使用Easy loT实现mqtt消息消息的通讯
- Spanning Tree协议安全攻防
- web前端大作业 (仿英雄联盟网站制作html css javascript) 学生dreamweaver网页设计作业
- proteus7.7+Keil2仿真80C51控制流水灯
- Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示
热门文章
- SIGIR2020推荐系统论文聚焦
- git did not exit cleanly(exit code 128)报错的部分原因及解决方法
- 2022年国家自然科学基金指南发布情况
- 计算机学校校歌,【2018十大最受欢迎高校校歌】_最受欢迎的十大高校校歌
- 水星mw325r设置无线服务器未响应,水星路由器325r设置WiFi隐藏信号方法
- [HPM] Error occurred while trying to proxy request /login/account from localhost:8000 to localhost:8
- 安装EVE-NG模拟器
- Win10深度学习环境配置(CUDA+cuDNN+TensorFlow-gpu+Keras)
- [附源码]计算机毕业设计JAVA基于JSP社区生鲜配送系统
- Scanpy(四)使用ingest和BBKNN整合数据