SkySwitch 云控灯

一、小剧场

准备阶段

  • ESP8266 开发板(带 Wi-Fi 功能)、SG90 舵机、杜邦线若干、电源(5V 锂电池,可配合 Arduino/STM 使用)、Linux 公网服务器
  • Arduino IDE(代码编写与上传)
  • 友善串口调试工具

终极目标

  • 通过 公网 IP:8089 ,实现对 ESP8266 部署页面 的远程访问,点击页面开关灯按钮,控制舵机转动角度,控制开关灯。

二、ESP8266 编程,开关灯功能实现

  1. 硬件连接 将舵机与开发板正确连接。连接成功后,舵机会自动转动一下,发出轻微声音,这是正常现象。
  2. ESP8266 只支持 2.4GHz Wi-Fi,不支持 5GHz。所以Wi-Fi不能选用5G的,否则会出现链接不上
arduino 复制代码
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Servo.h>

// ==== 用户配置 WiFi ====
const char* ssid = "XXX";
const char* password = "XXX";

// ==== 对象实例 ====
Servo myServo;
ESP8266WebServer server(80);

// ==== 全局变量 ====
int currentAngle = 90;  // 初始角度

// ==== HTML 页面 ====
const char* htmlPage = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>舵机灯光控制</title>
  <style>
    body { font-family: Arial; text-align: center; margin-top: 50px; }
    button { padding: 20px; font-size: 20px; margin: 20px; }
  </style>
</head>
<body>
  <h1>💡 舵机灯光控制</h1>
  <button onclick="fetch('/servo?cmd=on')">开灯</button>
  <button onclick="fetch('/servo?cmd=off')">关灯</button>
</body>
</html>
)rawliteral";

// ==== 初始化 ====
void setup() {
  Serial.begin(9600);
  myServo.attach(2);  // GPIO2 (D4)
  myServo.write(currentAngle);

  // WiFi 连接
  WiFi.begin(ssid, password);
  Serial.print("连接 WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500); Serial.print(".");
  }
  Serial.println("\nWiFi已连接");
  Serial.print("IP地址: "); Serial.println(WiFi.localIP());

  // 设置 Web 路由
  server.on("/", []() {
    server.send(200, "text/html", htmlPage);
  });

  server.on("/servo", []() {
    if (server.hasArg("cmd")) {
      String cmd = server.arg("cmd");

      if (cmd == "on") {
        myServo.write(0);          // 开灯动作
        delay(1000);
        myServo.write(90);         // 复位
        currentAngle = 90;
      } 
      else if (cmd == "off") {
        myServo.write(180);        // 关灯动作
        delay(1000);
        myServo.write(90);         // 复位
        currentAngle = 90;
      }

      server.send(200, "text/plain", "OK");
    } else {
      server.send(400, "text/plain", "缺少参数");
    }
  });

  server.begin();
}

// ==== 主循环 ====
void loop() {
  server.handleClient();  // 处理网页请求
}

三、内网穿透

在公网服务器上运行 FRP (Fast Reverse Proxy)作为中转,实现内网设备的远程访问。不仅需要在安全组中配置规则,还需要手动放行7000,8089 端口, sudo firewall-cmd --zone=public --add-port=8089/tcp --permanent

  1. FRPS(服务器端)配置示例

    ini 复制代码
    ini
    复制编辑
    [common]
    bind_port = 7000
    token = mytoken123
  2. FRPC(客户端)配置示例

    ini 复制代码
    ini
    复制编辑
    [common]
    server_addr = 1.2.3.4       # 你的公网服务器 IP
    server_port = 7000
    token = mytoken123
    
    [esp8266_tcp]
    type = tcp
    local_ip = 192.168.1.50
    local_port = 80
    remote_port = 8089
  3. 访问方式

    部署完成后,可通过 http://公网IP:8089 直接访问 ESP8266 提供的 Web 控制页面


相关推荐
大力yy3 小时前
从零到一:VS Code 扩展开发全流程简介(含 Webview 与 React 集成)
前端·javascript·react.js
Deepsleep.3 小时前
前端常见安全问题 + 防御方法 + 面试回答
前端·安全·面试
IT小农工3 小时前
windows系统edge浏览器退出账户后还能免密登录
前端·edge
柯南95273 小时前
Chrome浏览器插件(Extensions)的原理
前端·chrome
小妖6663 小时前
如何去除edge浏览器的灰色边框
前端·edge
猪哥帅过吴彦祖3 小时前
JavaScript Set 和 Map:现代 JavaScript 的数据结构双雄
前端·javascript·面试
用户0304805912633 小时前
null 与 undefined 的区别
前端
朱程3 小时前
写给自己的 LangChain 开发教程(四):RAG(1)
前端·人工智能
alphardex3 小时前
现代 Web 的视觉组件探索
前端·html·web components