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 控制页面


相关推荐
拆房老料23 分钟前
ONLYOFFICE也能像Microsoft Word和WPS一样分别设置中西文字体
前端·html·word·开源软件·wps
Solis程序员39 分钟前
Stripe 幂等表:把「不确定的重试」变成「查表返回」
前端·安全·bootstrap·php·agent
李纲明1 小时前
WordPress 站点变慢:按 TTFB → 缓存 → 查询 → 前端 分层排查(含配置注意)
前端·缓存·性能优化·wordpress·后端开发
程序人生8881 小时前
PDF 转 Word 版式错乱、表格丢失?DocConverter Web 格式互转引擎的保真实践
前端·人工智能·opencv·机器学习·pdf·word
粥里有勺糖2 小时前
安利一下最近用的桌面“Agent” | T3 Code
前端·github·ai编程
xy34532 小时前
Axure 9.0 动态面板基本操作
前端·ui·html·axure·原型·产品设计
不停喝水2 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
一水鉴天3 小时前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
栖凤3 小时前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
粥里有勺糖3 小时前
视野修炼第136期 | 前端小恐龙"Deno"被收购
前端·github·ai编程