2510浏览
查看: 2510|回复: 1

【智能开关】手机控灯(改造家用开关,不搞破坏)

[复制链接]
本帖最后由 云天 于 2022-1-5 21:47 编辑

【项目背景】
智能控制开关,是我很早就在考虑的一个项目。一直没有做主要是因为,我有以下几个要求:1、不破坏原有的器件(媳妇不让)。
2、不动220V(危险)
3、具有一定可调整性(开关大小不一致)。
我见过最简单的方法是,把舵机直接用热熔胶粘在开关边上(简单粗暴)。有的把设置粘在墙面上(有破坏性)。
我发现一个现象,就是一般的开关都是要突出于墙面,应该是方便拆卸(外面是一个壳,用力能抠下来,里面有螺丝)。而突出这部分正是我可以利用的,因为我没有3D打印和激光切割机,只能使用一些金属构件。
【项目设计】
主控使用,FireBeetle Board ESP32 E,主要原因是它有蓝牙、Wifi功能,可无线控制。驱动开关使用SG90舵机,小巧且不用单独供电。
方案1:使用蓝牙和WIfi热点,手机app控制。
方案2:使用通过STA 模式:ESP32模块通过路由器连接互联网,手机通过互联网实现对设备的远程控制。
方案3:通过红外模块,使用遥控器控制


方案1的优点是,手机是随身携带物品,且不用连接互联网。缺点是使用前需连接蓝牙或热点。
方案2的优点是,手机一般情况都是连着互联网的。缺点是,FireBeetle Board ESP32 E需要一直连接互联网,当然家里如果Wifi一直不关的话,也不是问题。
方案3的优点是,遥控器拿起来就用,不像手机还要解锁、开程序等,使用方便。缺点是,我们不会把遥控器一直带在身上,当然开关灯也不会频繁进行,遥控器放在床边或办公桌上就可以。还有一个缺点就是使用遥控器,显得不高大上。

下面将使用方案1进行测试,“WIfi热点”。
【编程环境】
Arduino IDE 编译环境配置,参考:https://wiki.dfrobot.com.cn/_SKU ... rd_ESP32_E#target_6

【硬件设备】

1、FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。

它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。FireBeetle ESP32-E深度支持ArduinoIDE编程。

2、扩展板

  • 接口方式:Gravity标准接口
  • GDI显示接口,单线连接显示屏
  • 支持数字输入输出:13
  • 支持模拟输入:5
  • 支持I2C*3
  • 支持UART
  • 支持SPI
  • 支持SP
  • 支持低功耗
  • 支持外接电源


【控制舵机】

esp32 在arduino ide环境下控制180°舵机
180°的舵机在arduino 板子上控制是很方便的。当我们用esp32板子编写的时候,。这时候我们应该去IDE那边下载个esp32专用的舵机库(ServoESP32)。

以下为测试程序
  1. #include <Servo.h>
  2. Servo myservo;  // 创建舵机对象以控制舵机
  3.                 // 最多可以创建八个伺服对象
  4. int pos = 0;    // 变量来存储伺服位置
  5. void setup()
  6. {
  7.   myservo.attach(2);  //舵机连接在引脚2(扩展板对应D9)
  8. }
  9. void loop()
  10. {
  11.   for(pos = 0; pos < 180; pos += 20)  
  12.   {                                 
  13.     myservo.write(pos);            
  14.     delay(3000);                     
  15.   }
  16.   for(pos = 180; pos>=1; pos-=20)  
  17.   {                                
  18.     myservo.write(pos);  
  19.     delay(3000);           
  20.   }
  21. }
复制代码

【开热点】
ESP32具有WIFI功能,以下示例使用ESP32创建了一个wifi服务器,使用客户端连接到该服务器,遥控LED的亮灭。
/*  WiFiAccessPoint.ino 创建了一个wifi热点并提供了一个web服务
Steps:  1. 连接到这个wifi "yourAp"  
2. 访问 http://192.168.4.1/H 来开灯或者访问http://192.168.4.1/L 来关灯
     OR     Run raw TCP "GET /H" and "GET /L" on PuTTY terminal with 192.168.4.1 as IP address and 80 as port
*/
  1. #include <WiFi.h>
  2. #include <WiFiClient.h>
  3. #include <WiFiAP.h>
  4. // 热点设置你的wifi与密码
  5. const char *ssid = "";
  6. const char *password = "";
  7. WiFiServer server(80);
  8. void setup() {
  9.   pinMode(LED_BUILTIN, OUTPUT);//将LED引脚设置为输出模式
  10.   Serial.begin(115200);
  11.   Serial.println();
  12.   Serial.println("Configuring access point...");
  13.   // 配置wifi以及获取IP地址.
  14.   WiFi.softAP(ssid, password);
  15.   IPAddress myIP = WiFi.softAPIP();
  16.   Serial.print("AP IP address: ");
  17.   Serial.println(myIP);
  18.   server.begin();
  19.   Serial.println("Server started");
  20. }
  21. void loop() {
  22.   WiFiClient client = server.available();   // listen for incoming clients
  23.   if (client) {                             // if you get a client,
  24.     Serial.println("New Client.");           // print a message out the serial port
  25.     String currentLine = "";                // make a String to hold incoming data from the client
  26.     while (client.connected()) {            // loop while the client's connected
  27.       if (client.available()) {             // if there's bytes to read from the client,
  28.         char c = client.read();             // read a byte, then
  29.         Serial.write(c);                    // print it out the serial monitor
  30.         if (c == '\n') {                    // if the byte is a newline character
  31.           // if the current line is blank, you got two newline characters in a row.
  32.           // that's the end of the client HTTP request, so send a response:
  33.           if (currentLine.length() == 0) {
  34.             // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
  35.             // and a content-type so the client knows what's coming, then a blank line:
  36.             client.println("HTTP/1.1 200 OK");
  37.             client.println("Content-type:text/html");
  38.             client.println();
  39.             // the content of the HTTP response follows the header:
  40.             client.print("Click <a href="/H">here</a> to turn ON the LED.<br>");
  41.             client.print("Click <a href="/L">here</a> to turn OFF the LED.<br>");
  42.             // The HTTP response ends with another blank line:
  43.             client.println();
  44.             // break out of the while loop:
  45.             break;
  46.           } else {    // if you got a newline, then clear currentLine:
  47.             currentLine = "";
  48.           }
  49.         } else if (c != '\r') {  // if you got anything else but a carriage return character,
  50.           currentLine += c;      // add it to the end of the currentLine
  51.         }
  52.         // Check to see if the client request was "GET /H" or "GET /L":
  53.         if (currentLine.endsWith("GET /H")) {
  54.           digitalWrite(LED_BUILTIN, HIGH);               // GET /H turns the LED on
  55.         }
  56.         if (currentLine.endsWith("GET /L")) {
  57.           digitalWrite(LED_BUILTIN, LOW);                // GET /L turns the LED off
  58.         }
  59.       }
  60.     }
  61.     // close the connection:
  62.     client.stop();
  63.     Serial.println("Client Disconnected.");
  64.   }
  65. }
复制代码

【手机控制】
将开热点程序与控制舵机程序相结合,并通过App Inventor2,编写手机端程序。
1、FireBeetle Board ESP32 E主板程序:
  1. #include <WiFi.h>
  2. #include <WiFiClient.h>
  3. #include <WiFiAP.h>
  4. #include <Servo.h>
  5. Servo myservo;
  6. // 热点设置你的wifi与密码
  7. const char *ssid = "";
  8. const char *password = "";
  9. WiFiServer server(80);
  10. void setup() {
  11.   myservo.attach(2);
  12.   pinMode(LED_BUILTIN, OUTPUT);//将LED引脚设置为输出模式
  13.   Serial.begin(115200);
  14.   Serial.println();
  15.   Serial.println("Configuring access point...");
  16.   // 配置wifi以及获取IP地址.
  17.   WiFi.softAP(ssid, password);
  18.   IPAddress myIP = WiFi.softAPIP();
  19.   Serial.print("AP IP address: ");
  20.   Serial.println(myIP);
  21.   server.begin();
  22.   Serial.println("Server started");
  23. }
  24. void loop() {
  25.   WiFiClient client = server.available();   // listen for incoming clients
  26.   if (client) {                             // if you get a client,
  27.     Serial.println("New Client.");           // print a message out the serial port
  28.     String currentLine = "";                // make a String to hold incoming data from the client
  29.     while (client.connected()) {            // loop while the client's connected
  30.       if (client.available()) {             // if there's bytes to read from the client,
  31.         char c = client.read();             // read a byte, then
  32.         Serial.write(c);                    // print it out the serial monitor
  33.         if (c == '\n') {                    // if the byte is a newline character
  34.           // if the current line is blank, you got two newline characters in a row.
  35.           // that's the end of the client HTTP request, so send a response:
  36.           if (currentLine.length() == 0) {
  37.             // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
  38.             // and a content-type so the client knows what's coming, then a blank line:
  39.             client.println("HTTP/1.1 200 OK");
  40.             client.println("Content-type:text/html");
  41.             client.println();
  42.             // the content of the HTTP response follows the header:
  43.             client.print("Click <a href="/H">here</a> to turn ON the LED.<br>");
  44.             client.print("Click <a href="/L">here</a> to turn OFF the LED.<br>");
  45.             // The HTTP response ends with another blank line:
  46.             client.println();
  47.             // break out of the while loop:
  48.             break;
  49.           } else {    // if you got a newline, then clear currentLine:
  50.             currentLine = "";
  51.           }
  52.         } else if (c != '\r') {  // if you got anything else but a carriage return character,
  53.           currentLine += c;      // add it to the end of the currentLine
  54.         }
  55.         // Check to see if the client request was "GET /H" or "GET /L":
  56.         if (currentLine.endsWith("GET /H")) {
  57.           digitalWrite(LED_BUILTIN, HIGH);               // GET /H turns the LED on
  58.            myservo.write(100);
  59.            delay(500);
  60.            myservo.write(60);
  61.         }
  62.         if (currentLine.endsWith("GET /L")) {
  63.           digitalWrite(LED_BUILTIN, LOW);                // GET /L turns the LED off
  64.            myservo.write(30);
  65.            delay(500);
  66.            myservo.write(60);
  67.         }
  68.       }
  69.     }
  70.     // close the connection:
  71.     client.stop();
  72.     Serial.println("Client Disconnected.");
  73.   }
  74. }
复制代码
2、手机app程序很简单,控件只使用“开关按钮”和“http客户端”。
代码:当开关状态发生改变时,判断开关是开是关,访问对应地址。

【组装硬件】
【智能开关】手机控灯(改造家用开关,不搞破坏)图2【智能开关】手机控灯(改造家用开关,不搞破坏)图1【智能开关】手机控灯(改造家用开关,不搞破坏)图3
【演示视频】

白凡  高级技师

发表于 2022-1-7 09:20:53

学到了!!!
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail