【电子DIY作品】开关灯辅助工具+ESP12F模组

[复制链接]
查看1941 | 回复11 | 2023-11-17 12:00:24 | 显示全部楼层 |阅读模式
一、 介绍
本项目要实现的是一个通过手机APP控制寝室灯开关的辅助工具。
项目框图如下图所示。
Snipaste_2023-11-17_16-33-22.png

实现原理

  • 手机和本模块都接入同一个wifi网络,手机端发送命令,本模块执行相应的命令。

  • 开关灯,通过舵机来进行实现。

二、硬件设计
2.1 主控
ESP8266串口WIFI ESP-12F
ESP8266-12F是ESP8266-12的增强版。

1.png 2.png
2.2 原理图设计
2.2.1 控制板
本项目实际上只需要一个GPIO口来控制舵机即可。
将其他的引脚引入是为了后续可能扩展其他功能使用。
Snipaste_2023-11-17_16-51-14.png
2.2.2 电源板
ESP12F模组3.3v供电,舵机5v供电。
使用了一片AMS1117-3.3v和一片AMS1117-5v芯片,实现12v至3.3v和5v的转换。
( 由于寝室开关座子附近有一个插座,所以就直接找了一个输入220v输出12v点的电源线,作为电源板的输入电源 )
Snipaste_2023-11-17_16-06-01.png
2.3 PCB设计
2.3.1 控制板PCB
需要注意ESP12F模组天线部分的布局,与周围的PCB要有大于5mm的间距。
Snipaste_2023-11-17_16-07-50.png Snipaste_2023-11-17_16-08-06.png
2.3.2 电源板PCB
Snipaste_2023-11-17_16-06-17.png Snipaste_2023-11-17_16-06-30.png
三、软件设计
3.1 控制程序
开发环境使用的是Arduino IDE。
要实现的功能有两大块
  • 舵机的控制
  • UDP网络通信

WiFI-UDP通信参考:ESP8266 – WiFiUDP库 – 太极创客 (taichi-maker.com)
通信协议较为简单,命令长度为2个字节,第1个字节为固定值0xff,第2个字节为相应的控制码( 0x00: 关灯,0x01开灯 )
通信的安全性,在通信过程中并没有做握手、认证等处理。通信用户的有效性是通过wifi密码来鉴别的( 只有成功连接wifi,才可以控制灯的开关 )。
  1. #include <ESP8266WiFi.h>
  2. #include <WiFiUdp.h>
  3. typedef unsigned char  u8;
  4. typedef unsigned short u16;
  5. typedef unsigned int   u32;
  6. /*********************** 舵机相关 ************************/
  7. // 连接舵机的引脚
  8. #define STEER_PIN 13
  9. typedef enum SWITCH_STATE{
  10.   SWITCH_ON,
  11.   SWITCH_OFF
  12. }SWITCH_STATE;

  13. typedef struct SWITCH_CONTROL{
  14.   u16          switch_on;
  15.   u16          switch_off;
  16.   SWITCH_STATE switch_state;
  17. }SWITCH_CONTROL;

  18. void Steer_Init_PWM(){
  19.   pinMode(STEER_PIN,OUTPUT);
  20. }
  21. /**
  22. * 根据pwm高电平时间(us)控制舵机
  23. */
  24. void Steer_SetAngle_PWM(u16 pwm) {
  25.   u8 index = 0;
  26.   // 控制舵机转动
  27.   for(index = 0;index<10;index++){
  28.     digitalWrite(STEER_PIN,HIGH);
  29.     delayMicroseconds(pwm);
  30.     digitalWrite(STEER_PIN,LOW);
  31.     delayMicroseconds(20000 - pwm);
  32.   }
  33. }

  34. SWITCH_CONTROL switch_contrl = {
  35.   .switch_on    = 2300,
  36.   .switch_off   = 1400,
  37.   .switch_state = SWITCH_OFF
  38. };

  39. void Change_Switch_State( u8 switch_state ) {
  40.   if( switch_state == SWITCH_ON){
  41.     Steer_SetAngle_PWM(switch_contrl.switch_on);
  42.     switch_contrl.switch_state = SWITCH_ON;
  43.   }else if(switch_state == SWITCH_OFF){
  44.     Steer_SetAngle_PWM(switch_contrl.switch_off);
  45.     switch_contrl.switch_state = SWITCH_OFF;
  46.   }else{
  47.    
  48.   }
  49. }
  50. /*******************************************************/

  51. /*********************** WIFI相关 ***********************/
  52. typedef enum WIFI_STATE{
  53.   WIFI_OK,
  54.   WIFI_ERROR,
  55.   UDP_OK,
  56.   UDP_ERROR
  57. }WIFI_STATE;

  58. typedef enum USER_CMD {
  59.   CMD_ERROR,
  60.   CMD_SWITCH_ON,
  61.   CMD_SWITCH_OFF
  62. }USER_CMD;

  63. #define UDP_PORT  6666
  64. #define BUF_LEN   20

  65. const char* ssid   = "xxxxx";   //wifi name
  66. const char* passwd = "xxxxx";//wifi passwd

  67. // buf
  68. unsigned char udp_buf[BUF_LEN] = {0};

  69. WiFiUDP Udp;

  70. u8 WIFI_Init(const char* wifi_ssid, const char* wifi_passwd){
  71.   u8 counter = 0;
  72.   WiFi.begin(wifi_ssid, wifi_passwd);

  73.   while (WiFi.status() != WL_CONNECTED) {
  74.     counter++;
  75.     delay(500);
  76.     //10秒后如果还是连接不上,就判定为连接超时
  77.     if (counter > 20) return WIFI_ERROR;
  78.   }
  79.   return WIFI_OK;
  80. }

  81. u8 UDP_Init(u16 port) {
  82.   if(Udp.begin(port)){  //启动Udp监听服务
  83.     return UDP_OK;
  84.   }else {
  85.     return UDP_ERROR;
  86.   }
  87. }

  88. u8 Get_UDP_Packet(unsigned char * buf,u8 buf_len){
  89.   int packetSize = Udp.parsePacket();//获得解析包
  90.   if(Udp.available()){
  91.     return Udp.read(buf, buf_len);
  92.   }else{
  93.     return 0;
  94.   }
  95. }

  96. /**
  97. *  定义报文格式
  98. *   1B   1B
  99. *  0xff  cmd
  100. *  开关灯的cmd: 0x00:关灯 0x01:开灯
  101. */
  102. u8 Parse_UDP_Packet(unsigned char * data,u8 data_len){
  103.   if( data[0] != 0xff ) return CMD_ERROR;
  104.   if( data[1] == 0x00 ) return CMD_SWITCH_OFF;
  105.   else if( data[1] == 0x01 ) return CMD_SWITCH_ON;
  106.   else return CMD_ERROR;
  107. }

  108. void Execute_Cmd(u8 cmd){
  109.   switch( cmd ) {
  110.     case CMD_SWITCH_ON:
  111.       Change_Switch_State(SWITCH_ON);
  112.       break;
  113.     case CMD_SWITCH_OFF:
  114.       Change_Switch_State(SWITCH_OFF);
  115.       break;
  116.     default:
  117.       break;
  118.   }
  119. }
  120. /*******************************************************/

  121. void setup() {
  122.   Serial.begin(9600); // 波特率9600
  123.   Steer_Init_PWM();
  124.   if(WIFI_Init(ssid,passwd) == WIFI_OK) {
  125.     Serial.println(WiFi.localIP());  // 打印ip地址
  126.     if( UDP_Init(UDP_PORT) ) {
  127.       Serial.printf("UDP监听端口:%d\r\n",UDP_PORT);
  128.     }else{
  129.       Serial.println("UDP Init Failed");
  130.     }
  131.   }else{
  132.     Serial.println("WIFI Init Failed");
  133.   }
  134. }

  135. void loop() {
  136.   u8 datalen = Get_UDP_Packet(udp_buf,BUF_LEN);
  137.   if( datalen == 0 ) return ;
  138.   u8 user_cmd = Parse_UDP_Packet(udp_buf,datalen);
  139.   if( user_cmd == CMD_ERROR ) return;
  140.   Execute_Cmd(user_cmd);
  141. }
复制代码
3.2 手机APP程序
使用Flutter开发手机APP,实现遥控灯的开关。
界面设计较为简单,只有两个功能按键,分别对应灯的开与关。
QQ图片20231117162204.jpg
四、外壳设计
Snipaste_2023-11-17_16-20-29.png
五、结果展示
将辅助工具与灯座进行固定,使用的是纳米胶。( 直接粘在灯座上,不要粘在墙上-->直接导致墙皮脱落
( 这里使用了一块黑色的废PCB板的原因,这个开关座子是一个双开开关,控制两个灯,粘上了一块板子将一个双开开关合成一个整体 )
QQ图片20231117162220.jpg QQ图片20231117162225.jpg

六、附件
1. 控制板制板文件
Gerber_PCB_ESP8266-12F控制板.zip (55 KB, 下载次数: 1)
回复

使用道具 举报

干簧管 | 2023-11-17 15:35:27 | 显示全部楼层
补充详细点
回复 支持 1 反对 0

使用道具 举报

yyrwkk | 2023-11-17 16:01:23 | 显示全部楼层

正在完善中
回复 支持 反对

使用道具 举报

san | 2023-11-18 14:28:01 | 显示全部楼层
学习
回复

使用道具 举报

yyrwkk | 2023-11-18 15:42:27 | 显示全部楼层
回复 支持 反对

使用道具 举报

心云 | 2023-11-19 10:18:25 | 显示全部楼层
学习
回复

使用道具 举报

lazy | 2023-11-19 22:41:41 | 显示全部楼层
很不错呢
回复

使用道具 举报

yyrwkk | 2023-11-20 23:00:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

yyrwkk | 2023-11-20 23:01:15 | 显示全部楼层
回复 支持 反对

使用道具 举报

心云 | 2023-11-28 14:44:30 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则