
基于ESP32的台式电脑远程开机卡
简介
程序vscode+platformio编写,可以在局域网内完成远程开机。能通过AHT20测量温湿度并显示在网页和TFT屏幕上。注意:此项目未真实上主板测试,所造成的损失本人不负责!
简介:程序vscode+platformio编写,可以在局域网内完成远程开机。能通过AHT20测量温湿度并显示在网页和TFT屏幕上。注意:此项目未真实上主板测试,所造成的损失本人不负责!开源协议
:MIT License
描述
注意:此项目未经过真实上主板验证,复刻需谨慎,所造成的损失本人概不负责!
开机的原理跟图吧老哥螺丝刀开机一样。本项目真正有点价值的部分是littlefs系统与网页控制的部分
摘要
看完摘要剩下的可以不用看了
代码已在GitHub上开源github-ESP32台式电脑远程开机卡,文末附件也可以直接下载代码。本项目是我新生项目课的作业,感谢阎老师的引导,她提到的工程实战经验十分有用。这个开机卡能在局域网内实现远程开机(可以连接ESP32的2.4G热点进入控制台,也可以让ESP32连接至指定的路由,在路由网络中输入分配的IP地址也能进入控制台)。开机卡能通过AHT20传感器获取温湿度数据上传至网络控制台和TFT屏幕上。
一、 项目研究背景
1.1 问题分析
做这个的灵感来源是我同学在家里部署了一个服务器,想在学校用它,但是目前对于电脑的远程开机缺少一个简单的方案。市面上已经出现了电脑远程开机卡来解决电脑远程开机这一问题,但是这些产品仍然不完善。主要的缺点有:(1)缺少工作指示灯,不能在开机卡上直接读取状态。(2)供电方式单一。(3)不能检测机箱内温度。(4)贵。去年8月份的时候开机卡的价格还很贵,但是等我做出这个产品的时候市面上的开机卡已经降价到20多元了。
1.2 研究重点
(1)电脑的开机方式
(2)开机卡如何供电
(3)远程控制与温度监测
2.3 应用场景
以下两种供电方式二选一,不能同时使用!
方式一:如图3,安装在主板的PCIE插槽中,用杜邦线将开机卡上的power两个排针与主板上的power排针相连。
方案二:使用type-c供电,现在的大部分主板在关机后主板USB口仍然供电,将type-c线一端接入开机卡type-c口,另一端接在电脑主板上的USB口即可。用杜邦线将开机卡上的power两个排针与主板上的power排针相连(不区分正负)。
开机卡通电后手机连接WIFI“ESP32远程开机卡”,密码为12345678。连接完成后浏览器输入192.168.4.1进入控制台。在控制台中点击“开机”即可
二、 项目技术方案
2.1 总体方案
2.1.1 需求分析(功能描述)
本产品的MCU选用ESP32,开发平台为vscode+platformio。编程语言为arduino。使用继电器来隔离开机卡电路与主板电路并通过继电器的短时间闭合实现电脑开机。使用DHT11温湿度传感器测量机箱内部的温湿度(第二版中更换为更先进的AHT20)使用ESPAsyncWebServer库使单片机连接网络并搭建了简单的HTML5网页作为控制台。用户可以在控制台中进行网络配置,电脑开关机与获取机箱内部温湿度。
2.1.2 架构设计
系统板如图5所示,软件流程图如图6所示。
图5:系统板
图6:软件流程图
2.1.3 平台选型及报价
模块名称及厂家 |
单价 |
数量 |
总价 |
乐鑫ESP32 |
20元 |
1 |
20元 |
1.8寸TFT屏幕 |
13元 |
1 |
13元 |
DHT11温湿度传感器 |
3元 |
1 |
3元 |
5V继电器 |
1.4元 |
1 |
1.4元 |
PCB板 |
感谢嘉立创 |
5 |
0元 |
|
37.4元 |
2.2子模块1:电脑开机方案
图7:主板上的开机跳线(蓝色框中)
电脑的开机是通过短接PWR两个跳线(图8中蓝色框)来实现的。用继电器短接这两个引脚0.5秒即可实现开机。原理和图吧老哥螺丝刀开机一样
2.3 子模块2:供电模块方案
现在的大部分电脑主板在关机时PCIE和USB口都会维持供电,PCIE接口有固定3.3V输出(图8中B10 3.3Vaux),不用通过降压模块降压。type-c供电输入的5V电压则采用AMS1117-3.3V稳压芯片降为驱动单片机和TFT屏的3.3V电压。降压模块已集成在PCB板上
图8:PCIE供电
图9:type-c供电
图10:降压模块原理图
2.4 子模块3:TFT屏幕方案
TFT屏幕选用1.8寸,方便后续升级显示更多信息和UI动画。现在OLED屏涨价了,能显示彩色和尺寸更大的TFT屏性价比更高。
软件使用TFT_eSPI库,如图12
图12:在platformio中导入TFT_eSPI库
完整代码见附件或GitHub。这里摘录了重要代码
#include // TFT屏幕显示库,下载TFT_eSPI库后要在User_Setup.h中设置使用型号
#include
#include "xfont.h" //中文显示,感谢https://github.com/StarCompute/tftziku/tree/master/src
XFont *_xFont;
TFT_eSPI tft = TFT_eSPI(); // TFT显示屏
void tftsetup()
{
tft.init(); // TFT屏幕初始化
tft.fillScreen(TFT_BLACK); // 设置背景为黑色
// tft.setCursor(0, 0); // 鼠标置于屏幕原点
tft.setTextColor(TFT_WHITE); // 设置字体颜色
tft.setTextFont(4); // 设置字体
tft.setTextSize(3); // 设置字体大小
tft.initDMA(); // 开启DMA刷屏更快
}
_xFont->DrawChinese(0, 0, "控制台", TFT_GREEN); // 在(0,0)开始显示汉字
tft.setCursor(70, 0); // 鼠标置于(70,0)
tft.println(myIP); // TFT屏幕上显示APIP地址
TFT_eSPI 库中的 tft.print() 和 tft.printf() 函数都用于在屏幕上打印文本,但它们有一些区别:
tft.print() 函数用于打印文本或变量的字符串表示形式。你可以使用它来打印数字、字符、字符串和其他数据类型的值。它可以接受不同类型的参数,并将它们转换为字符串进行显示。例如,tft.print(123) 将打印数字 "123",tft.print("Hello") 将打印字符串 "Hello"。
tft.printf() 函数是一个格式化打印函数,类似于C语言中的 printf()。它允许你使用格式化字符串和变量来构建输出。你可以在格式化字符串中包含特殊的格式说明符,如 %d(整数)、%f(浮点数)、%s(字符串)等,然后在参数列表中传递相应类型的变量。例如,tft.printf("Value: %d", 123) 将打印 "Value: 123"。
tft.println()会在末尾换行
使用TFT_eSPI 库显示中文较为麻烦,最初我参考了b站“伊娃老师来了”的视频:
【ESP32+TFT零基础入门中文字显示,从软件下载到字符转换的保姆级教程,代码开源快快来学】 https://www.bilibili.com/video/BV1yz4y1u7eV/?share_source=copy_web&vd_source=c91c35fde3c46c7e7f8e829ecd5674f9
但是这个视频提供的文字取模比较麻烦,TFT上显示的中文也不清晰,最大的缺点是中文需要单独取模,占用存储空间大,1150个汉字的字库要占用2.62MB的flash空间,对于自带flash仅有4MB的ESP32很不友好。后来我使用https://github.com/StarCompute/tftziku/tree/master/src这个补丁,这个7000字的字库仅需744KB,且显示文字清晰。引用这个库可以参考网站里的readme和main.cpp,但是需要注意几个问题。
1.这个补丁同时支持Arduino_GFX和TFT_eSPI库,若是使用TFT_eSPI库,需要在xfont.h的第3行将#define TFT_ESPI取消注释并注释掉上一行,更改后结果如下:
// 在这里注释选择使用的库,在80行选择方向,在xfont.cpp35行选择方向
// #define ARDUINO_GFX
#define TFT_ESPI
2.屏幕默认顺时针旋转90度显示,若是选择正常显示要在xfont.h第80行将TFT_HEIGHT和TFT_WIDTH换位置,更改后结果如下:
#elif defined(TFT_ESPI)
int screenHeight = TFT_HEIGHT;
int screenWidth = TFT_WIDTH;
#endif
并将xfont.cpp将第35行注释掉 // tft.setRotation(1);//顺时针旋转90度显示
2.5 子模块4:AHT20温湿度传感器方案
直接在platformio中导入AHTX0库即可,里面有示例代码。
2.6 子模块5:网络控制台方案
网络控制台使用HTML5+ChatGPT编写
控制台页面home.html,网页效果见图4
ESP32台式电脑开机卡
Wi-Fi配置
联网成功后将会关闭热点
输入WiFi名称和密码:
WiFi名称:
WiFi密码:
连接测试
开发板上有一个蓝色LED,可以用这个测试连接状态
点击 开灯
点击 关灯
开机
点击 开机
点击 关机
温度和湿度
两秒更新一次
温度:
湿度:
当用户在网页中点击开机键时,网页会跳转到/ON(如图12),单片机收到信号后GPIO13输出高电平0.5秒使继电器短暂闭合,连通主板上的POWER SW+和POWER SW-,使电脑开机
网页中按下开机键后同时会转到另一个网页,等待3秒后返回,防止用户误触导致短时间内发送多个指令。
server.on("/ON", HTTP_GET, [](AsyncWebServerRequest *request)
{
switchmode = 1;
digitalWrite(control, HIGH);
delay(100);
digitalWrite(control, LOW);
request->send(LittleFS, "/wait.html"); // 展示收到界面
});
图14:返回页面
2.7 子模块6:littlefs文件系统
对于大容量设备的开发,建立一个文件系统实现对文件的查找、分类与管理是十分必要的。使用文件系统之前,home.html和wait.html网页代码只能合并在main.c中,这对于代码的查看及修改十分不方便,若是以后制作更复杂的网页,有更多的html代码甚至图片将堆积在main.c中。
经过我的查询,目前FS(file system)这个系统正逐渐被淘汰,取而代之的是littleFS系统,使用方法如下,也可以参考视频 【【ESP8266】 如何使用 VScode + PlatformIO 上传文件到 单片机 FLASH 闪存并建立 LittleFS 文件系统】
1. 在platformio.ini中添加board_build.filesystem = littlefs,如图14
图15 platformio.ini中添加littlefs
2.在项目目录下新建文件夹,名称为data,如图15,并将要烧录的文佳放入data文件夹。
图16 项目目录下新建data文件夹
3.在platformio控制台中先点击Build Filesystem Image,编译完成后点击Upload Filesystem Images上传至单片机,如图16
图17 编译和上传文件系统中的文件
这样网站代码就可以放在data文件夹中,调用示例:
server.begin();
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send(LittleFS, "/home.html"); // 展示控制台界面
});
三、 验证与测试结果
第一版完成网站显示与温度数据的发送,在实验室中用直流电源夹住PCIE对应引脚测试,功能正常。第二版进行了升级。实验室中用直流电源夹住PCIE对应引脚测试,继电器可以切换,插入type-c供电线,功能正常。没敢插到主板上测试开机
图18:第一版实物展示
图19:第一版实物展示
图20:第二版实物展示
图19:第二版实物展示
四、 总结与展望
本开机卡软件使用vscode+platformio编写程序,硬件上使用嘉立创EDA绘制原理图和PCB,经验证已经完成了基本功能,但目前有2点需要改进(1)将控制范围由局域网升级为广域网(2)增加历史记录等实用功能。
虽然经过我的进一步查阅资料发现电脑远程开机可以通过WAN口(网络)唤醒,完全不需要开机卡,但是这个项目仍然具有重要实战意义,以后可以集成风扇控制器、RGB灯光控制器、机箱副屏等。
五、 参考文献
立创开源广场上的其他远程开机卡
设计图

BOM


评论