You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET MVC项目与搭载ESP8266的Arduino通信方案求助

嘿,刚好我之前做过类似的Arduino+ESP8266智能家居项目,给你一步步拆解怎么实现网页通过ESP8266给Arduino发数据:

硬件连接准备

这一步是基础,ESP8266和Arduino最常用的是串口通信,接线如下:

  • ESP8266的 TX 引脚 → Arduino的 RX 引脚(交叉连接,因为TX发对应RX收)
  • ESP8266的 RX 引脚 → Arduino的 TX 引脚
  • ESP8266的 GND → Arduino的 GND(必须共地,否则串口通信会乱码)
  • ESP8266的 VCC 接3.3V电源(可以用Arduino的3.3V输出,或者单独的3.3V电源模块,千万不要接5V,会烧坏ESP8266!

如果你的Arduino需要同时用串口和电脑通信(比如调试),可以改用软串口(SoftwareSerial库),把ESP8266接到Arduino的其他GPIO引脚,避免占用硬串口。

Arduino端代码(处理串口指令)

Arduino需要监听串口,接收ESP8266发来的指令,然后执行对应的操作。下面是一个控制内置LED的示例代码,你可以改成控制你的智能家居设备:

void setup() {
  Serial.begin(9600); // 波特率要和ESP8266的保持一致
  pinMode(LED_BUILTIN, OUTPUT); // 初始化LED引脚为输出模式
}

void loop() {
  // 检查串口是否有数据到来
  if (Serial.available() > 0) {
    String command = Serial.readStringUntil('\n');
    command.trim(); // 去掉字符串两端的换行、空格等冗余字符
    
    // 根据指令执行操作
    if (command == "LED_ON") {
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println("LED_ON_ACK"); // 可选:给ESP8266回传确认信号,方便调试
    } else if (command == "LED_OFF") {
      digitalWrite(LED_BUILTIN, LOW);
      Serial.println("LED_OFF_ACK");
    }
    // 这里可以加更多指令,比如控制继电器、传感器读取等
  }
}
ESP8266端代码(WiFi服务器+串口转发)

ESP8266需要作为WiFi服务器,接收你MVC网页的请求,然后把指令通过串口转发给Arduino。示例代码如下:

#include <ESP8266WiFi.h>

// 替换成你的WiFi名称和密码
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";

WiFiServer server(80); // 创建HTTP服务器,端口80

void setup() {
  Serial.begin(9600); // 和Arduino的波特率保持一致
  delay(10);

  // 连接WiFi
  Serial.print("连接WiFi中...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi连接成功!");
  Serial.println("ESP8266的IP地址: ");
  Serial.println(WiFi.localIP()); // 记下这个IP,网页要用到

  server.begin(); // 启动服务器
}

void loop() {
  WiFiClient client = server.available(); // 等待客户端(你的网页)连接
  if (!client) {
    return;
  }

  // 等待客户端发送请求数据
  while(!client.available()){
    delay(1);
  }

  // 读取网页发来的HTTP请求
  String request = client.readStringUntil('\r');
  client.flush();

  // 解析请求中的指令,转发给Arduino
  if (request.indexOf("/LED_ON") != -1) {
    Serial.println("LED_ON"); // 把指令发给Arduino
    // 给网页返回响应
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println(""); // HTTP头部和内容之间必须有空行
    client.println("<h3>指令已发送:开启LED</h3>");
  } else if (request.indexOf("/LED_OFF") != -1) {
    Serial.println("LED_OFF"); // 转发指令给Arduino
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("");
    client.println("<h3>指令已发送:关闭LED</h3>");
  } else {
    // 如果是访问根路径,返回一个简单的控制页面(也可以跳转到你的MVC网页)
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("");
    client.println("<html><body style='text-align:center; margin-top:50px;'>");
    client.println("<h1>智能家居控制</h1>");
    client.println("<a href='/LED_ON' style='font-size:20px; margin-right:20px;'>开启LED</a>");
    client.println("<a href='/LED_OFF' style='font-size:20px;'>关闭LED</a>");
    client.println("</body></html>");
  }

  delay(1);
  client.stop(); // 关闭客户端连接
}
你的MVC网页如何对接

你的MVC网页只需要给ESP8266的IP地址发送HTTP请求即可。比如在网页上做按钮,点击时发送GET请求到对应的路径:

  • 开启设备:http://[ESP8266_IP]/LED_ON
  • 关闭设备:http://[ESP8266_IP]/LED_OFF

如果是用JavaScript实现异步请求(不用刷新页面),可以用fetch API,示例代码:

// 假设按钮的ID是ledOnBtn和ledOffBtn
document.getElementById('ledOnBtn').addEventListener('click', async () => {
  try {
    const response = await fetch('http://192.168.1.100/LED_ON'); // 替换成你的ESP8266 IP
    const result = await response.text();
    console.log(result); // 可以把结果显示在网页上
  } catch (error) {
    console.error('请求失败:', error);
  }
});

document.getElementById('ledOffBtn').addEventListener('click', async () => {
  try {
    const response = await fetch('http://192.168.1.100/LED_OFF');
    const result = await response.text();
    console.log(result);
  } catch (error) {
    console.error('请求失败:', error);
  }
});
调试小技巧
  • 先单独测试ESP8266:上传代码后,打开串口监视器,看是否成功连接WiFi并输出IP,用浏览器访问这个IP,点击按钮看串口监视器是否输出指令。
  • 再测试串口通信:把Arduino和ESP8266连接好,Arduino上传代码后,打开Arduino的串口监视器,发送LED_ON,看LED是否点亮;然后用ESP8266的网页发送指令,看Arduino是否响应。
  • 波特率必须一致:Arduino和ESP8266的Serial.begin()参数要相同,比如都是9600,否则会出现乱码。
  • 上传Arduino代码时,建议断开ESP8266的TX/RX引脚,避免干扰串口上传,上传完成后再接回去。

内容的提问来源于stack exchange,提问作者Yasin Akca

火山引擎 最新活动