You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:49:17