19浏览
查看: 19|回复: 11

[项目] 【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

[复制链接]
【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图1

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图2

驴友花雕  中级技神
 楼主|

发表于 昨天 19:16

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图2

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:17

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

  【花雕学编程】239种传感器执行器系列实验(资料代码+仿真编程+图形编程)
   实验二百四十六:ESP8266串口wifi模块 NodeMCU Lua V3物联网开发板 CH340
   实验项目之十四:ESP8266 Web 服务器:从手机控制组件

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图2

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:22

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

来自百科,“Web 服务器是服务器软件或专门用于运行此软件的硬件,可以满足万维网上的客户端请求”。本例子中,使用ESP8266(NodeMCU V3)的功能来充当我们的 Web 服务器并托管我们的网站。在浏览器中键入 Web 服务器的地址发出“请求”,并收到了 html 标记形式的“响应”。NodeMCU ESP8266 Web 服务器接收此请求并使用 HTML 响应进行回复。它还处理我们组件的接口,因此它会检查来自 Web 浏览器的请求并采取相应的行动。ESP8266 芯片及其最新的 ESP32 芯片都是关于 wifi 和连接的。这使其非常适合我们的物联网 (IOT) 项目。

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:26

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

实验开源代码

  1. /*
  2.   【花雕学编程】239种传感器执行器系列实验(资料代码+仿真编程+图形编程)
  3.    实验二百四十六:ESP8266串口wifi模块 NodeMCU Lua V3物联网开发板 CH340
  4.    实验项目之十四:ESP8266 Web 服务器:从手机控制组件
  5. */
  6. #include <ESP8266WiFi.h> // 包含ESP8266WiFi库,用于WiFi连接
  7. #include <ESP8266WebServer.h> // 包含ESP8266WebServer库,用于创建Web服务器
  8. /********** 请修改以下内容 *************************/
  9. const char* ssid = "zhz3"; // 设置Wi-Fi名称
  10. const char* password = "z156721";  // 设置Wi-Fi密码
  11. ESP8266WebServer server(80);  // 创建一个Web服务器对象,监听80端口
  12. uint8_t LEDPin = D3;  // 定义LED连接的引脚
  13. bool LEDStatus = LOW;  // 定义LED的初始状态(低电平)
  14. uint8_t buzzerPin = D4;  // 定义蜂鸣器连接的引脚
  15. bool buzzerStatus = LOW;  // 定义蜂鸣器的初始状态(低电平)
  16. void setup() {
  17.   Serial.begin(115200);  // 初始化串口通信,波特率为115200
  18.   Serial.println(" ");
  19.   Serial.println("正在连接Wi-Fi网络...");
  20.   pinMode(LEDPin, OUTPUT);  // 设置LED引脚为输出模式
  21.   pinMode(buzzerPin, OUTPUT);  // 设置蜂鸣器引脚为输出模式
  22.   Serial.println("正在连接Wi-Fi网络...");
  23.   Serial.println(ssid);
  24.   // 连接到本地Wi-Fi网络
  25.   WiFi.begin(ssid, password);
  26.   // 检查Wi-Fi是否连接成功
  27.   while (WiFi.status() != WL_CONNECTED) {
  28.     delay(1000);
  29.     Serial.print(".");
  30.   }
  31.   Serial.println("");
  32.   Serial.println("Wi-Fi连接成功!");
  33.   Serial.print("获取到的IP地址: ");  
  34.   Serial.println(WiFi.localIP());  // 打印ESP8266的IP地址
  35.   // 设置Web服务器的路由和处理函数
  36.   server.on("/", handleRoot);  // 根路径的处理函数
  37.   server.on("/toggleLED", updateLED);  // 切换LED状态的处理函数
  38.   server.on("/toggleBuzzer", updateBuzzerSound);  // 切换蜂鸣器状态的处理函数
  39.   server.onNotFound(handleNotFound);  // 未找到路径的处理函数
  40.   server.begin();  // 启动Web服务器
  41.   Serial.println("HTTP服务器已启动");
  42. }
  43. void loop() {
  44.   server.handleClient();  // 处理客户端请求
  45. }
  46. // 处理根路径请求
  47. void handleRoot() {
  48.   server.send(200, "text/html", prepareHTML());  // 返回HTML页面
  49. }
  50. // 切换LED状态
  51. void updateLED() {
  52.   Serial.println("正在更新LED状态...");
  53.   LEDStatus = !LEDStatus;  // 切换LED状态
  54.   digitalWrite(LEDPin, LEDStatus);  // 更新LED引脚电平
  55.   server.send(200, "text/html", prepareHTML());  // 返回更新后的HTML页面
  56. }
  57. // 切换蜂鸣器状态
  58. void updateBuzzerSound() {
  59.   Serial.println("正在更新蜂鸣器状态...");
  60.   buzzerStatus = !buzzerStatus;  // 切换蜂鸣器状态
  61.   if (buzzerStatus)
  62.     tone(buzzerPin, 1200);  // 打开蜂鸣器,频率为1200Hz
  63.   else
  64.     noTone(buzzerPin);  // 关闭蜂鸣器
  65.   server.send(200, "text/html", prepareHTML());  // 返回更新后的HTML页面
  66. }
  67. // 处理未找到的路径
  68. void handleNotFound() {
  69.   server.send(404, "text/plain", "路径未找到");  // 返回404错误
  70. }
  71. // 生成HTML页面
  72. String prepareHTML() {
  73.   String html  = "<!DOCTYPE html>"
  74.                  "<html>"
  75.                  "<head>"
  76.                  "<meta charset="UTF-8">"
  77.                  "<meta name="viewport" content="width=device-width, initial-scale=1">"
  78.                  "<title>NodeMCU ESP8266 Web Server</title>"
  79.                  "<style>"
  80.                  "/* 样式代码省略 */"
  81.                  "</style>"
  82.                  "</head>"
  83.                  "<body>"
  84.                  "<nav class="nav" tabindex="-1" onclick="this.focus()">"
  85.                  "<div class="container">"
  86.                  "<a class="pagename current" href="#">wwww.ESP8266.com</a>"
  87.                  "</div>"
  88.                  "</nav>"
  89.                  ""
  90.                  "<div class="container">"
  91.                  "<div class="hero">"
  92.                  "<h1>NodeMCU ESP8266 Web Server</h1>"
  93.                  "<div class="flex-container">"
  94.                  "  <div class="flex-child magenta">"
  95.                  "<span class="component-label">LED</span>"
  96.                  "  </div>"
  97.                  "  <div class="flex-child green">"
  98.                  "<div class="grid-child green">"
  99.                  "<div style="display: inline">"
  100.                  "<div class="onoffswitch">";
  101.   if (LEDStatus)
  102.     html = html + "<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="ledSwitch" tabindex="0" checked onclick="window.location.href='toggleLED'">";
  103.   else
  104.     html = html + "<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="ledSwitch" tabindex="0" onclick="window.location.href='toggleLED'">";
  105.   html = html +
  106.          "<label class="onoffswitch-label" for="ledSwitch">"
  107.          "<span class="onoffswitch-inner"></span>"
  108.          "<span class="onoffswitch-switch"></span>"
  109.          "</label>"
  110.          "</div>"
  111.          "</div>"
  112.          "</div>"
  113.          "  </div>"
  114.          "</div>"
  115.          "<div class="flex-container">"
  116.          "  <div class="flex-child magenta">"
  117.          "<span class="component-label">蜂鸣器</span>"
  118.          "  </div>"
  119.          "  <div class="flex-child green">"
  120.          "<div class="grid-child green">"
  121.          "<div style="display: inline">"
  122.          "<div class="onoffswitch">";
  123.   if (buzzerStatus)
  124.     html = html + "<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="buzzerSwitch" tabindex="0" checked onclick="window.location.href='toggleBuzzer'">";
  125.   else
  126.     html = html + "<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="buzzerSwitch" tabindex="0" onclick="window.location.href='toggleBuzzer'">";
  127.   html = html +
  128.          "<label class="onoffswitch-label" for="buzzerSwitch">"
  129.          "<span class="onoffswitch-inner"></span>"
  130.          "<span class="onoffswitch-switch"></span>"
  131.          "</label>"
  132.          "</div>"
  133.          "</div>"
  134.          "</div>"
  135.          "  </div>"
  136.          "</div>"
  137.          "</div>"
  138.          "</div>"
  139.          "</body>"
  140.          "</html>";
  141.   return html;  // 返回生成的HTML页面
  142. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:33

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

以下是代码的详细注释,逐行解释每一部分的功能和作用:

1. 引入库

  1. #include <ESP8266WiFi.h>  // 引入ESP8266 Wi-Fi库,用于连接和管理Wi-Fi网络
  2. #include <ESP8266WebServer.h>  // 引入ESP8266 Web服务器库,用于创建HTTP服务器
复制代码


2. 定义Wi-Fi配置

  1. /********** 请修改以下内容 *************************/
  2. const char* ssid     = "<请输入您的Wi-Fi SSID>";  // 定义Wi-Fi名称(SSID)
  3. const char* password = "<请输入您的Wi-Fi密码>";  // 定义Wi-Fi密码
复制代码


3. 创建Web服务器对象

  1. ESP8266WebServer server(80);  // 创建一个Web服务器对象,监听80端口(HTTP默认端口)
复制代码


4. 定义引脚和状态变量

  1. uint8_t LEDPin = D3;  // 定义LED连接的引脚(D3)
  2. bool LEDStatus = LOW;  // 定义LED的初始状态(低电平,表示关闭)
  3. uint8_t buzzerPin = D4;  // 定义蜂鸣器连接的引脚(D4)
  4. bool buzzerStatus = LOW;  // 定义蜂鸣器的初始状态(低电平,表示关闭)
复制代码


5. setup() 函数
setup() 函数在设备启动时运行一次,用于初始化硬件和配置。

  1. void setup() {
  2.   Serial.begin(115200);  // 初始化串口通信,波特率为115200,用于调试信息输出
  3.   pinMode(LEDPin, OUTPUT);  // 设置LED引脚为输出模式
  4.   pinMode(buzzerPin, OUTPUT);  // 设置蜂鸣器引脚为输出模式
  5.   Serial.println("正在连接Wi-Fi网络...");
  6.   Serial.println(ssid);
  7.   // 连接到本地Wi-Fi网络
  8.   WiFi.begin(ssid, password);
  9.   // 检查Wi-Fi是否连接成功
  10.   while (WiFi.status() != WL_CONNECTED) {
  11.     delay(1000);  // 每隔1秒检查一次
  12.     Serial.print(".");  // 打印连接状态(...)
  13.   }
  14.   Serial.println("");
  15.   Serial.println("Wi-Fi连接成功!");
  16.   Serial.print("获取到的IP地址: ");  
  17.   Serial.println(WiFi.localIP());  // 打印ESP8266的IP地址,用于访问Web服务器
  18.   // 设置Web服务器的路由和处理函数
  19.   server.on("/", handleRoot);  // 根路径("/")的处理函数
  20.   server.on("/toggleLED", updateLED);  // 切换LED状态的路由("/toggleLED")的处理函数
  21.   server.on("/toggleBuzzer", updateBuzzerSound);  // 切换蜂鸣器状态的路由("/toggleBuzzer")的处理函数
  22.   server.onNotFound(handleNotFound);  // 未找到路径的处理函数
  23.   server.begin();  // 启动Web服务器
  24.   Serial.println("HTTP服务器已启动");
  25. }
复制代码


6. loop() 函数
loop() 函数在设备运行期间不断循环,用于处理客户端请求。

  1. void loop() {
  2.   server.handleClient();  // 处理客户端请求
  3. }
复制代码


7. 处理根路径请求
当用户访问根路径(/)时,返回一个HTML页面。

  1. void handleRoot() {
  2.   server.send(200, "text/html", prepareHTML());  // 返回HTTP状态码200和HTML页面
  3. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:38

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

8. 切换LED状态
当用户访问 /toggleLED 路径时,切换LED的状态。

  1. void updateLED() {
  2. Serial.println("正在更新LED状态...");
  3. LEDStatus = !LEDStatus; // 切换LED状态(开/关)
  4. digitalWrite(LEDPin, LEDStatus); // 更新LED引脚电平
  5. server.send(200, "text/html", prepareHTML()); // 返回更新后的HTML页面
  6. }
复制代码


9. 切换蜂鸣器状态
当用户访问 /toggleBuzzer 路径时,切换蜂鸣器的状态。

  1. void updateBuzzerSound() {
  2.   Serial.println("正在更新蜂鸣器状态...");
  3.   buzzerStatus = !buzzerStatus;  // 切换蜂鸣器状态(开/关)
  4.   if (buzzerStatus)
  5.     tone(buzzerPin, 1200);  // 打开蜂鸣器,频率为1200Hz
  6.   else
  7.     noTone(buzzerPin);  // 关闭蜂鸣器
  8.   server.send(200, "text/html", prepareHTML());  // 返回更新后的HTML页面
  9. }
复制代码

10. 处理未找到的路径
当用户访问未定义的路径时,返回404错误。

  1. void handleNotFound() {
  2.   server.send(404, "text/plain", "路径未找到");  // 返回HTTP状态码404和错误信息
  3. }
复制代码


11. 生成HTML页面
动态生成包含LED和蜂鸣器控制开关的HTML页面。

  1. String prepareHTML() {
  2.   String html  = "<!DOCTYPE html>"
  3.                  "<html>"
  4.                  "<head>"
  5.                  "<meta charset="UTF-8">"
  6.                  "<meta name="viewport" content="width=device-width, initial-scale=1">"
  7.                  "<title>NodeMCU ESP8266 Web Server</title>"
  8.                  "<style>"
  9.                  "/* 样式代码省略 */"
  10.                  "</style>"
  11.                  "</head>"
  12.                  "<body>"
  13.                  "<nav class="nav" tabindex="-1" onclick="this.focus()">"
  14.                  "<div class="container">"
  15.                  "<a class="pagename current" href="#">wwww.donskytech.com</a>"
  16.                  "</div>"
  17.                  "</nav>"
  18.                  ""
  19.                  "<div class="container">"
  20.                  "<div class="hero">"
  21.                  "<h1>NodeMCU ESP8266 Web Server</h1>"
  22.                  "<div class="flex-container">"
  23.                  "  <div class="flex-child magenta">"
  24.                  "<span class="component-label">LED</span>"
  25.                  "  </div>"
  26.                  "  <div class="flex-child green">"
  27.                  "<div class="grid-child green">"
  28.                  "<div style="display: inline">"
  29.                  "<div class="onoffswitch">";
  30.   if (LEDStatus)
  31.     html = html + "<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="ledSwitch" tabindex="0" checked onclick="window.location.href='toggleLED'">";
  32.   else
  33.     html = html + "<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="ledSwitch" tabindex="0" onclick="window.location.href='toggleLED'">";
  34.   html = html +
  35.          "<label class="onoffswitch-label" for="ledSwitch">"
  36.          "<span class="onoffswitch-inner"></span>"
  37.          "<span class="onoffswitch-switch"></span>"
  38.          "</label>"
  39.          "</div>"
  40.          "</div>"
  41.          "</div>"
  42.          "  </div>"
  43.          "</div>"
  44.          "<div class="flex-container">"
  45.          "  <div class="flex-child magenta">"
  46.          "<span class="component-label">蜂鸣器</span>"
  47.          "  </div>"
  48.          "  <div class="flex-child green">"
  49.          "<div class="grid-child green">"
  50.          "<div style="display: inline">"
  51.          "<div class="onoffswitch">";
  52.   if (buzzerStatus)
  53.     html = html + "<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="buzzerSwitch" tabindex="0" checked onclick="window.location.href='toggleBuzzer'">";
  54.   else
  55.     html = html + "<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="buzzerSwitch" tabindex="0" onclick="window.location.href='toggleBuzzer'">";
  56.   html = html +
  57.          "<label class="onoffswitch-label" for="buzzerSwitch">"
  58.          "<span class="onoffswitch-inner"></span>"
  59.          "<span class="onoffswitch-switch"></span>"
  60.          "</label>"
  61.          "</div>"
  62.          "</div>"
  63.          "</div>"
  64.          "  </div>"
  65.          "</div>"
  66.          "</div>"
  67.          "</div>"
  68.          "</body>"
  69.          "</html>";
  70.   return html;  // 返回生成的HTML页面
  71. }
复制代码


代码功能总结
Wi-Fi连接:ESP8266连接到指定的Wi-Fi网络。
Web服务器:创建一个Web服务器,监听HTTP请求。
LED控制:通过Web页面控制LED的开关状态。
蜂鸣器控制:通过Web页面控制蜂鸣器的开关状态。
HTML页面生成:动态生成包含LED和蜂鸣器控制开关的HTML页面。
路由处理:处理根路径、LED切换、蜂鸣器切换以及未找到路径的请求。

通过这段代码,用户可以通过浏览器访问ESP8266的IP地址,控制连接的LED和蜂鸣器。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:43

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

实验串口返回情况

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:45

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

在手机端打开浏览器,输入IP地址:192.168.28.40

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:48

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

控制LED和蜂鸣器后的实验串口返回情况

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图1


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:49

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

本帖最后由 驴友花雕 于 2025-1-15 19:54 编辑

实验场景图
【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图2

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件图1



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 20:18

【花雕学编程】Arduino动手做(246)---ESP8266 手机控制组件

实验记录视频(32秒)

【【花雕学编程】Arduino动手做(246)---ESP8266 Web 服务器:从手机控制组件】

https://www.bilibili.com/video/BV1CjcBezEKJ/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987






回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail