|
本帖最后由 hmj901 于 2020-2-12 12:56 编辑
先给大家问个好,上大学开始潜水数码之家,工作之后很忙,便也没有发过帖子。今年受疫情影响,公司远程办公(工作性质原因基本等于没事做),终于得空整理一下,发个帖子。
前几天花170块钱买了个某品牌的UPS,自带USB管理,配套的软件也很全面,支持自动关机啥的,避免广告嫌疑,具体就不表了
看到配套软件支持串口,想起吃灰的山特MT500 PRO(当年因为没找到配套软件没弄成自动关机就吃灰了),也带了个RS232串口,不知道支不支持
于是又翻出来一根上古USB转RS232,这个线是真的丑,而且驱动还不好找,还好WIN10免驱
试了试还真的可以用那个软件!抽了根烟想了想,这就是个串口,手头也有几块ESP8266闲置着,能不能用ESP8266连到WIFI去接入网络然后做网络管理呢?查了查资料,找到不少关于这个通信协议的,都试了试,发现是下面这个(比特率2400):
https://wenku.baidu.com/view/60c25777b9d528ea80c77978.html
手上的ESP8266就是这种,5块多还包邮的ESP-01,避免广告,商店信息去掉了
简直就是绝配!虽然这个板子IO缩的不行,基本就一个硬件串口可以用,但是用来接这个UPS是刚刚好,还自带WIFI
话不多说,开始讲过程。由于我是弄完了再整理的,大家就将就看吧,我照着操作顺序说,供大家参考一下
需要准备:
1.ESP8266一块
2.USB转TTL模块(给ESP8266刷固件用)
3.AMS1117-3.3一块(给ESP8266提供电源,没有可以用DC-DC降压模块)
4.导线等常用物料
5.烙铁焊锡剪刀万用表等工具
第一步,拆机,拆掉所有螺丝
注意红圈处有颗螺丝,但不容易发现
第二步,切断原有的串口RS232电压转换线路(红圈处),以防影响ESP8266和UPS的MCU通信
第三步,在控制板上焊上AMS1117,能并联一个电容最好,控制板是立起来插着的那块板,上面有个6P座子是连接前面板的开关和指示灯的,图中圈出来了,左一常通12V电池正极,左二在开机开关按下的时候通12V,那就用这个脚做供电正极,负极在板子上用万用表随便打找一个,和电池负极通就行。忽略我的渣渣焊工哈哈
第四步,焊上串口线,如图,有实机的拆客们应该能辨认出来(这俩脚我用万用表找了半天)
第五步,裁一块万用板,把线焊上万用板,再整个双排4P的座子,连接ESP8266,下面的图中,黑色负极,红色3.3V,白色TX,黄色RX。还有一点注意的是把ESP8266的一个脚上拉,用导线或者电阻都行
第六步,电脑上准备好Arduino for ESP8266的环境,具体可以参照下面这个链接
https://blog.csdn.net/chenchen2360060/article/details/84838788
用然后在arduino安装如下这个wifiManager库,看清楚作者,不要安装错了
ESP8266用USB转TTL连接电脑,连之前上面一张图中上面一排的右二脚要接地进入刷写模式,arduino新建一个项目,粘贴我的代码,上传配置如下,主要是框出来的俩,端口要改成你ESP8266的串口,给ESP8266传上代码
我的代码(附件中有):
- #include <ESP8266WiFi.h>
- #include <DNSServer.h>
- #include <ESP8266WebServer.h>
- #include <WiFiManager.h>
- #define PERIOD 1000 //检测间隔,单位为毫秒
- String upsinfo = "Starting";
- unsigned long t = 0;
- WiFiServer ser(80);
- void updateUpsInfo() {
-
- Serial.println("Q1");
- delay(10);
- if (Serial.available() > 0) {
- delay(20);
- upsinfo = Serial.readStringUntil('\r');
- }
- t = millis();
- }
- void handleHttp() {
- WiFiClient client = ser.available();
- while (client.available()) {
- client.read();
- }
- client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"));
- client.print(upsinfo);
- }
- void setup() {
- WiFiManager wifiManager;
- wifiManager.autoConnect("ESP_UPS");
- ser.begin();
- Serial.begin(2400);
- Serial.flush();
- }
- void loop() {
- if (t > millis()) {
- t = 0;
- }
- else if (t + PERIOD < millis()) {
- updateUpsInfo();
- }
- handleHttp();
- }
复制代码
第七步,把ESP8266插上焊好的座子,然后开UPS试机(注意安全,不要摸到高压部分),我没有电池只能接12V座子了:lol:
开机之后,ESP8266应该会启动并发射名为ESP_UPS的无密码的WIFI热点,手机连上,如图配置ESP8266的WIFI,如果没有检查一下连线之类的有没有问题
去路由器看一下ESP8266获取的IP是哪一个,并设置成固定IP,以后ESP8266只要连接这个WIFI就会默认获取这个IP,大家的路由器不一样就不细表。我这里是192.168.119.24,用电脑浏览器打开,应该能看到数据:
用热熔胶固定所有焊上去的线路和板子,防止短路和乱动
第八步,需要自动关机的电脑上安装winpower(UPS管理软件,后面找到的,不用注册,我买的UPS带的那个要注册码)、VSPD虚拟串口、python,其中python还要安装pyserial和requests这两个库,如果你没有装过python,就需要先安装python,再安装pip,然后在命令行窗口下面输入:
pip install pyserial
pip install requests
winpower下载地址:http://mydown.yesky.com/pcsoft/413547207.html
VSPD下载地址:http://www.3322.cc/soft/28771.html
VSPD安装好之后打开,新建一对串口就可以关掉了(我用的是COM10和COM11):
然后新建一个python文件,.py的后缀名,粘贴如下代码,IP地址改成你的ESP8266的,还有COM口要改一下,如果上一步你用的不是10和11的话:
尝试了引用的python代码显示出来的格式有问题,所以代码放在附件中了
保存并用python运行,应该不会报错,如果报错就检查一下python的环境是否有问题
第九步,运行python脚本,不要退出它,然后打开UPS,如果你试机的时候设置了WIFI,它就会自动连接WIFI,然后,打开安装好的winpower,没有弹出对话框的话就去任务栏点那个绿色插头,然后点系统-->成为管理员,提示输入密码,实际上没有密码,直接点确定,然后再点系统,自动搜索设备,它就会自动搜索出COM10的设备了,然后就可以正常使用了
第十步,在winpower设置自动关机,再把这个python脚本加进启动项,就可以长期使用了,市电断了会自动关机,就不细表了,网上有各种方法,例如下面这个
https://blog.csdn.net/Game_jqd/article/details/86707836
总结:
该方案的优点:
1.对于MT500PRO这个机子来说,成本低,买一根USB转RS232的线也得十几块钱
2.相比直接用串口,这个方案可以支持更多的机器一起自动关机
3.ESP8266的代码稍加修改可以支持到其他的UPS机器,没有串口的都行,有一个GPIO能检测UPS是不是在电池状态就行了,如果在电池状态就按照协议WEB输出电池状态的数据,就能帮助电脑自动关机了
以上就是所有内容,供大家参考,欢迎交流,搞了一天,现在终于写完帖子了,太晚了,要睡了,毕竟明天还上班呢哈哈哈
-------------------------重新编辑了一下,给加上了python代码,个人觉得这点渣渣代码不值35M币,之前是没找到插入代码的按钮---------------------------------
- # -*- coding:utf-8 -*-
- import serial
- import requests
- import time
- url = 'http://192.168.119.24'
- ser = serial.Serial('com11', 2400, timeout=0.1) #com10改成自己的
- data=''
- err_c=0
- last_t=0
- while True:
- try:
- key=ser.readline()
- if key=='Q1\r':
- info=(data+'\r').encode()
- ser.write(info)
- now_t=time.time()
- if now_t-last_t>1:
- try:
- req = requests.get(url,timeout=0.1)
- data=req.text
- err_c=0
- now_t=time.time()
- except:
- if err_c==5:
- data=''
- else:
- err_c+=1
- except:
- print('')
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|