引言
来自哈尔滨工业大学的同学本次寒假练也参加了多个平台,项目都很优秀,而ESP32平台也选择了几乎没有几个人完成的远程遥控题目,离开鼠标,利用遥控器也能轻松切换网页。项目需求
项目8远程遥控利用板上的红外接收器,用遥控器控制网页界面上的按钮
完成的功能
2.1接收红外遥控信号2.2UDP通信2.3python图像识别自动点击网页(注:图为程序自动点击,无手动操作,详情请参考b站视频)实现思路
esp32采用arduino框架进行开发,可调用开源的接收红外信号库,仿照例程可获取红外遥控器发出的信号。
使esp32连入局域网(可为PC端分享的热点),使esp32发送UDP请求并由PC端接收,即可向PC端传递红外信号信息。
PC端需要有中继器解析UDP信息,并控制鼠标移动,这部分功能使用python实现。实现过程
4.1程序架构图4.2环境配置-esp32部分由于arduino开发具有调用函数方便,结构清晰,硬件配置简单等优点,项目采用arduino进行开发。arduino-esp32s2环境配置教程参考了硬核学堂的培训教程:基于ESP32-S2模块的物联网/音频信号处理平台(eete.cn)。注意esp32与esp32s2的环境配置方法不太一样,使用esp32的环境会导致软件开发出现问题,最好参考上述视频链接进行配置。(注:我在项目配置时,使用ArduinoIDE,即Arduino2.0配置时,存在卡死在启动页面无法进入的情况,如果读者也出现这种情况可以在Ardunio1.8环境下进行配置,步骤基本相同)配置好后,需要在库管理器中安装IRmote库,如下所示:然后选择开发板为ESP32S2DevModule,并选择相应的端口,即可烧录程序4.3环境配置-python部分python环境配置部分可参考附件中/esp-web-mote/py_mote/使用说明书1.docx文件,该文件为b站up主不高兴就喝水撰写的,包括安装python与下载python关于图像识别的包——pyautogui。另外,该文件夹中waterRPA.py文件是不高兴就喝水给的例程,供参考。udpRPA.py是我在其基础上修改得到的最终文件,复现时请运行udpRPA.py。4.4接收红外信号esp32s2使用Arduino框架,调用IRmote库实现接受红外信号,该函数是阻塞型的,写在loop()的最前端:if(ircv.decode(sults)){//检查是否接收到红外遥控信号Serial.println(sults.value,HEX);//输出指令信息ircv.sume();//接收下一指令//后续代码}
其中,sults.value即为读取到的红外信号,可表示为16位整型变量,后续操作即围绕此变量展开。4.5UDP通信由于esp32s2接收到的红外数据需要传给PC端,为了降低项目开发难度,接受端采用python编写。由于tcp通信在通信之前需要建立连接,比较复杂,为了提高项目的灵活性,采用udp通信协议。esp32s2为udp通信协议的发送方,调用了arduino的"WiFIUdp.h"库,发送的内容即为复制接收到的红外信号,关于UDP发送的代码如下:Udp.beginPacket("...",localUdpPort);//准备发送数据switch(sults.value){case0xFF02FD:Udp.print("FF02FD");//复制数据到发送缓存bak;case0xFFA:Udp.print("FFA");//复制数据到发送缓存bak;case0xFFF:Udp.print("FFF");//复制数据到发送缓存bak;case0xFFC23D:Udp.print("FFC23D");//复制数据到发送缓存bak;}Udp.endPacket();//发送数据
python为udp数据的接受端,采用阻塞式接收方法,接收到的数据为字符串,接收后即根据字符串数据向相应字典里查找图像匹配所需的图像名称,拼接出图像路径,交由后续代码调用,python端udp接收代码如下:#初始化UDP通信server_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)addss=("0.0.0.0",)server_socket.bind(addss)#为服务器绑定一个固定的地址,ip和端口#存储图片路径的字典imgDict={b"FF02FD":"bilibili.png",b"FFA":"csdn.png",b"FFF":"gitee.png",b"FFC23D":"zhihu.png"}whileTrue:#阻塞等待UDP接收到数据ceive_data,client=server_socket.cvfrom()print(ceive_data,client)#执行点击任务imgName=imgDict.get(ceive_data)ifimgName!=None:imgPath="img/"+imgNameprint(imgPath)mouseClick(1,"left",imgPath,1)time.sleep(0.1)print("等待0.1秒")
4.6图像识别与鼠标点击python代码需要根据UDP接收到的信号操纵鼠标点击。而针对寻找目标网页按钮,项目使用图像匹配的方式,用户需事先对需要点击的网页按钮进行截图,然后放入img文件夹下,由python调用pyautogui包的方法进行自动化图像匹配与操作鼠标,具体代码如下:defmouseClick(clickTimes,lOrR,img,Try):ifTry==1:whileTrue:location=pyautogui.locateCenterOnScen(img,confidence=0.9)iflocationisnotNone:pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)bakprint("未找到匹配图片,0.1秒后重试")time.sleep(0.1)elifTry==-1:whileTrue:location=pyautogui.locateCenterOnScen(img,confidence=0.9)iflocationisnotNone:pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)time.sleep(0.1)elifTry1:i=1whileiTry+1:location=pyautogui.locateCenterOnScen(img,confidence=0.9)iflocationisnotNone:pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)print("重复")i+=1time.sleep(0.1)
相关讲解可参考up主:不高兴就喝水的视频: