爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zhigao1986 于 2022-5-23 10:36 编辑
打印机等设备太多,长期通电待机功耗大,不同电,使用时又不方便,之前一直使用小K 一位智能插座,连接排插,定时开关所有设备。知道最近玩起ESP8266,学习了Arduino,所以产生了自己DIY智能插座的项目。 目前已实现功能:1.低功耗设计,采用4只磁保持继电器,只在开关动作时继电器线圈通电,其余时间只有ESP8266待机耗电,用USB电流表测试整个PCB待机电流0.08A,单个继电器动作时电流0.15A。 2.断网状态 4位插座可独立使用按键控制,相应LED指示通断状态。 3.采用MQTT协议接入Home Assistant,可使用Home Assistant WEB或者手机客户端控制每位开关,同时插座会反馈按键开关操作插座的状态,按动任意按键,插座将局域网IP发送给MQTT订阅主题 4.使用ESP8266 WEBserver服务,可网页操作开关通断(同时支持POST参数控制,可接入其他自动控制设备或程序) 5.使用ESP8266 EEPROM存储开关状态,重启上电可分别设置每位开关状态为 关闭/开启/保持上次状态(使用WEB配置) 6.WEB界面可设置4位开关备注名称 7.上电长按第3个按键(电源线端为按键1),可重置EEPROM参数 8.WIFI账号密码配网,使用过WiFiManager中文库做WEB配网,但偶尔程序跑飞,所以改成WEB页面配网,断码请自行完善 9.WEB配网及内置定时开关功能正在完善中,敬请期待 注意,插座带有220V交流电,非专业人士请勿拆开和改造!该文章仅为展示,如仿制请自行注意安全!!! PCB在某创开源,标题同此标题。 本开源项目遵循GPL3.0开源协议,但是如果商用,请您捐助所得净利的20%给慈善项目并且将整个捐款订单公开,如果做不到请不要商用 PCB,为了薅羊毛,分成2块 PCB 2块PCB都焊好原件 PCB拼接起来 PCB正面 PCB背面HC595 打样的PCB,这还只是一小部分 继电器焊好 换个角度 PCB背面 改装对象 公牛插座 型号铭牌 特制螺丝加特制螺丝刀 拆开插座 继续拆 拆LED指示灯 PCB安装试下 固定柱高了
直接截断 这个位置也高了,截断 圈圈全部截断
原开关 只取开关帽 螺柱加强筋顶到PCB了 这个加强筋也顶到了 加强筋直接处理掉 另一边的加强筋 指示灯固定座也搞了,直接截断 PCB装好后,按键基本在中间 背壳4个固定柱档到继电器了,截掉 LED,取前端导光部分 LED导光安装到LED固定座,按键中间打热熔胶,减小与轻触开关之间的间隙 处理后的样子 火线用导线连接铜触片 换个角度 电源模块加高温胶纸绝缘 装好电源模块的样子 LED导光柱加热熔胶固定 火线焊接到PCB 全部连接好 接线特写 装好螺丝,严丝合缝,和原装的一样 正面,也是和原装一模一样 WEB配置及控制界面 Home Assistant WEB界面 支持插座反馈状态 固件升级页面,直接WEB上传bin文件升级
- platform: mqtt name: "GN-B3043-1F773D-K1" #设备名称,自己设置 state_topic: "GN-B3043-1F773D/state/K1" # “GN-B3043-1F773D” MQTT订阅主题,即插座的设备名称,可网页自行设置,设置成Auto 则自动用MAC生产,该地址即自动生成 command_topic: "GN-B3043-1F773D/set/K1" unique_id: "32b33778a2614be0a3290f81afdeaba9" #实体ID,任意,不重复就行,不设置,Home Assistant会提示无唯一实体ID payload_on: "1" payload_off: "0" state_on: "1" state_off: "0" optimistic: false qos: 0 retain: false icon: mdi:monitor- platform: mqtt name: "GN-B3043-1F773D-K2" state_topic: "GN-B3043-1F773D/state/K2" command_topic: "GN-B3043-1F773D/set/K2" unique_id: "32b33778a2614be0a3290f81afdeabaa" payload_on: "1" payload_off: "0" state_on: "1" state_off: "0" optimistic: false qos: 0 retain: false- platform: mqtt name: "GN-B3043-1F773D-K3" state_topic: "GN-B3043-1F773D/state/K3" command_topic: "GN-B3043-1F773D/set/K3" unique_id: "32b33778a2614be0a3290f81afdeabab" payload_on: "1" payload_off: "0" state_on: "1" state_off: "0" optimistic: false qos: 0 retain: false icon: mdi:television-classic- platform: mqtt name: "GN-B3043-1F773D-K4" state_topic: "GN-B3043-1F773D/state/K4" command_topic: "GN-B3043-1F773D/set/K4" unique_id: "32b33778a2614be0a3290f81afdeabac" payload_on: "1" payload_off: "0" state_on: "1" state_off: "0" optimistic: false qos: 0 retain: false
程序源码 EPS8266_4chazuo__595_V1.8_WEB_202205012_OTA__.rar
#include <ESP8266WiFi.h>#include <Ticker.h>#include <WiFiUdp.h>#include <WiFiManager.h>#include <EEPROM.h>#include <PubSubClient.h>#include <ESP8266WebServer.h>#include <ESP8266HTTPUpdateServer.h>Ticker flipper;//定义定时器//#define PIN_POWER 4 //指示灯位于GPIO4 #define PIN_LED 13 //指示灯位于GPIO2 #define KEY1 0 //KEY对应值GPI14 #define KEY2 2 //KEY对应值GPI14 #define KEY3 4 //KEY对应值GPI14 #define KEY4 5 //KEY对应值GPI14 int dspin = 16;//74HC595的14脚 数据输入引脚SI 数据int clkpin = 12;//74hc595的11脚 时钟线 SCK 时钟int latpin = 14;//74hc595的12脚 输出存储器锁存线RCK 锁存String AutoRigName = "";// 设备名 如果“Auto”则使用MAC自动生成)String RIG_IDENTIFIER ; // EEPROM 地址 120String K1_name = "开关1"; //开关1名称 EEPROM 地址 200String K2_name = "开关2"; //开关2名称 EEPROM 地址 220String K3_name = "开关3"; //开关3名称 EEPROM 地址 240String K4_name = "开关4"; //开关4名称 EEPROM 地址 260const char ssid[] = "*****"; //WiFi名 EEPROM 地址 140const char pass[] = "****"; //WiFi密码 EEPROM 地址 160ADC_MODE(ADC_VCC);//设置ADC模式为读取系统电压int wifi_flg = 0;//WIFI状态标志 0 未连接 1 连接中 2 配网中 3 WIFI已连接 4 MQTT已连接int power_time = 0;//倒计时关机 int K1_flg;//定义开关1状态标志位 EEPROM 地址 101int K2_flg;//定义开关1状态标志位 EEPROM 地址 102int K3_flg;//定义开关1状态标志位 EEPROM 地址 103int K4_flg;//定义开关1状态标志位 EEPROM 地址 104int O595_1_flg = 255;//定义595 1 标志位int O595_2_flg = 255;//定义595 1 标志位int K1_ACflag = 2; // EEPROM 地址 181int K2_ACflag = 2; // EEPROM 地址 182int K3_ACflag = 2; // EEPROM 地址 183int K4_ACflag = 2; // EEPROM 地址 184uint32_t t=0;//按键计时WiFiClient espClient;PubSubClient client(espClient);const char* mqtt_server = "*******.f3322.org";//mqtt服务地址const char* clientID ="8266-001"; // 设备id//WiFiUDP Udp;//实例化WiFiUDP对象//unsigned int localUdpPort = 4321; // 自定义本地监听端口//unsigned int remoteUdpPort = 8629; // 自定义远程监听端口//char incomingPacket[255]; // 保存Udp工具发过来的消息//char replyPacket[] = "Hi, this is esp8266\n"; //发送的消息,仅支持英文void callback(char *topic, byte* payload, unsigned int length); //回调函数声明,用于传入mqtt客户端构造函数作为参数//void write_String(int a,String str);//EEPROM写字符串//参数: MQTT服务器地址,端口号,回调函数名,承载的连接(WIFI)PubSubClient mqttClient(mqtt_server, 1833, callback, espClient);ESP8266WebServer server(80);ESP8266HTTPUpdateServer httpUpdater;//变量常量定义:String postForms() { String htmlCode = "<!DOCTYPE html><html>\n"; htmlCode += "<head>\n"; htmlCode += "<title>GN-B3034智能插座</title>\n"; htmlCode += "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n"; htmlCode += "<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0'/>\n"; htmlCode += "<style>\n"; htmlCode += "body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\n"; htmlCode += "</style>\n"; htmlCode += "</head>\n"; htmlCode += "<body>\n"; htmlCode += "<h1>GN-B3034智能插座控制页面</h1><br>\n"; htmlCode += "<h3>请输入0或1控制开关</h3><br>\n"; htmlCode += "<form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/\">\n"; htmlCode += " 0为关,1为开 <br>\n"; htmlCode += "开关1<input type=\"text\" name=\"K1_power\" value= \""; htmlCode += K1_flg; htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">("; htmlCode += K1_name; htmlCode += ")<br>\n"; htmlCode += "开关2<input type=\"text\" name=\"K2_power\" value= \""; htmlCode += K2_flg; htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">("; htmlCode += K2_name; htmlCode += ")<br>\n"; htmlCode += "开关3<input type=\"text\" name=\"K3_power\" value= \""; htmlCode += K3_flg; htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">("; htmlCode += K3_name; htmlCode += ")<br>\n"; htmlCode += "开关4<input type=\"text\" name=\"K4_power\" value= \""; htmlCode += K4_flg; htmlCode += "\" size=\"5\" initial-scale = 2.0 autocomplete=\"off\">("; htmlCode += K4_name; htmlCode += ")<br>\n"; htmlCode += "<input type=\"submit\" value=\"应用\"></form><hr>\n"; htmlCode += "<h3>系统参数设</h3>\n"; htmlCode += "<form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/\">\n"; htmlCode += "网络名称<input type=\"text\" name=\"network_name\" value= \"0\" size=\"20\" initial-scale = 2.0 autocomplete=\"off\">\n"; htmlCode += "\n"; htmlCode += "<input type=\"submit\" value=\"修改\">\n"; htmlCode += "</form>\n"; htmlCode += "<form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/\">\n"; htmlCode += "网络密码<input type=\"text\" name=\"network_password\" value= \"0\" size=\"20\" initial-scale = 2.0 autocomplete=\"off\">\n"; htmlCode += "<input type=\"submit\" value=\"修改\"></form>\n"; htmlCode += "<form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/\">\n"; htmlCode += "设备名称<input type=\"text\" name=\"RIG_IDENTIFIER\" value= \""; htmlCode +=read_String(120); htmlCode += "\" size=\"20\" initial-scale = 2.0 autocomplete=\"off\">\n";
|