能否通过WiFi实现Windows窗体应用控制NodeMCU ESP8266继电器?
当然可以!完全不用再依赖USB串口连接,只要给NodeMCU接上独立电源,确保它和你的电脑在同一个局域网,你的Windows窗体应用就能轻松实现无线控制继电器的功能。下面给你一步步讲清楚怎么改:
第一步:修改NodeMCU的Arduino代码(实现WiFi服务器)
我们要把原来的串口监听逻辑改成WiFi TCP服务器,让NodeMCU在局域网里等待Windows应用的指令。代码逻辑和你原来的串口控制几乎一致,只是把数据来源从串口换成了WiFi客户端:
#include <ESP8266WiFi.h> // 继电器引脚定义(和你原来的一致) int Module1 = 0; int Module2 = 2; // WiFi账号密码(替换成你的局域网WiFi信息) const char* ssid = "Android"; const char* password = "password"; // 创建WiFi服务器,监听端口8080(端口可以自定义,只要不和其他服务冲突) WiFiServer server(8080); void setup() { Serial.begin(9600); // 设置继电器引脚为输出模式 pinMode(Module1, OUTPUT); pinMode(Module2, OUTPUT); // 连接WiFi网络 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi连接成功!"); Serial.println("NodeMCU的局域网IP地址:"); Serial.println(WiFi.localIP()); // 一定要记下这个IP,后面Windows应用要用到 // 启动WiFi服务器 server.begin(); } void loop() { // 检查是否有Windows客户端连接进来 WiFiClient client = server.available(); if (client) { Serial.println("新客户端连接"); // 持续读取客户端发来的指令 while (client.connected()) { if (client.available()) { char data = client.read(); Serial.print("收到指令:"); Serial.println(data); // 和你原来的控制逻辑完全一致,根据指令控制继电器 switch (data){ case '1' : digitalWrite(Module1, HIGH); break; case '2' : digitalWrite(Module2, HIGH); break; case '3' : digitalWrite(Module1, LOW); break; case '4' : digitalWrite(Module2, LOW); break; } } } // 客户端断开连接后清理资源 client.stop(); Serial.println("客户端断开连接"); } }
第二步:修改Windows窗体应用(实现WiFi客户端)
原来的代码用SerialPort类,现在我们换成.NET自带的TcpClient类,通过TCP协议给NodeMCU发送指令。下面是C#的示例代码(假设你用的是WinForms):
using System; using System.Net.Sockets; using System.Text; using System.Windows.Forms; namespace RelayWiFiControl { public partial class MainForm : Form { private TcpClient _tcpClient; private NetworkStream _networkStream; public MainForm() { InitializeComponent(); } // 连接NodeMCU的按钮点击事件 private void btnConnect_Click(object sender, EventArgs e) { try { // 替换成你刚才记下的NodeMCU局域网IP,端口要和Arduino代码里的8080一致 _tcpClient = new TcpClient("192.168.xxx.xxx", 8080); _networkStream = _tcpClient.GetStream(); MessageBox.Show("连接设备成功!"); } catch (Exception ex) { MessageBox.Show($"连接失败:{ex.Message}"); } } // 继电器1开启按钮 private void btnModule1On_Click(object sender, EventArgs e) { SendControlCommand('1'); } // 继电器1关闭按钮 private void btnModule1Off_Click(object sender, EventArgs e) { SendControlCommand('3'); } // 继电器2开启按钮 private void btnModule2On_Click(object sender, EventArgs e) { SendControlCommand('2'); } // 继电器2关闭按钮 private void btnModule2Off_Click(object sender, EventArgs e) { SendControlCommand('4'); } // 通用发送指令方法 private void SendControlCommand(char command) { if (_tcpClient == null || !_tcpClient.Connected) { MessageBox.Show("请先连接设备!"); return; } try { byte[] commandBytes = Encoding.ASCII.GetBytes(new[] { command }); _networkStream.Write(commandBytes, 0, commandBytes.Length); } catch (Exception ex) { MessageBox.Show($"发送指令失败:{ex.Message}"); } } // 窗体关闭时断开连接 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { _networkStream?.Close(); _tcpClient?.Close(); } } }
几个注意事项
- 确保NodeMCU和电脑在同一个WiFi局域网内,WiFi账号密码要填对
- 一定要记下NodeMCU串口打印的IP地址,Windows应用里必须填这个IP才能连接
- 如果端口8080被其他程序占用,可以改成其他未被使用的端口(比如9000),但Arduino代码和Windows代码的端口要保持一致
- 可以给NodeMCU设置静态IP,避免每次重启设备IP变化,不用反复修改Windows应用的连接地址
内容的提问来源于stack exchange,提问作者Deividas Zemkus
相关产品推荐
相关产品推荐

