乐鑫技术交流
直播中

陈霞

7年用户 960经验值
私信 关注
[问答]

如何使用NodeMCU Lilin v3制作遥控车?

我正在尝试使用 NodeMCU Lilin v3 制作遥控车。现在我已经能够使用网络服务器功能来实现它。我什至使用 DDNS 服务器 (DuckDNS) 能够通过蜂窝路由器(创建 WiFi 热点)提供的蜂窝网络从互联网远程访问它。
通常我使用手机访问 NodeMCU Web 服务器。
但是当由于某种原因手机失去连接时,我想让 NodeMCU 意识到这一点,这样它就会停止遥控车。
类似于故障保护机制。
我已经尝试实现 Ping 功能,但它不会通过蜂窝网络公共 IP。

回帖(1)

Petc

2024-5-15 18:01:28
要实现故障保护机制,你可以在程序中使用心跳检测功能。这意味着在每次手机与 NodeMCU 建立连接时,NodeMCU 将发送一个心跳包给手机,如果手机不回复,则 NodeMCU 将认为手机已经断开连接,并停止遥控车的运行。

以下是一种实现方法:

1. 在 NodeMCU 的程序中添加一个计时器和一个计时器中断处理函数。计时器可以定时触发中断,以便在没有收到心跳包的情况下停止车辆的运行。

2. 当手机访问 NodeMCU Web 服务器时,NodeMCU 会发送一个心跳包给手机。手机应该回复该心跳包,以确认已经与 NodeMCU 建立了连接。

3. 如果 NodeMCU 在指定时间内没有收到心跳包,则中断处理函数将会被触发,车辆的运动将会停止。

关于 Ping 功能的问题,因为蜂窝网络的 IP 地址是不稳定的,建议你使用 UDP 包来实现心跳检测。这样可以避免因为 IP 地址变化而导致的问题。以下是一些使用 UDP 包实现心跳检测的代码示例:

发送心跳包的代码:

``` C
#include
#include

WiFiUDP udp;
IPAddress serverIP(192, 168, 1, 100); // 服务器的 IP 地址
unsigned int serverPort = 8888;  // 服务器接收的 UDP 端口

void sendHeartBeat()
{
  udp.beginPacket(serverIP, serverPort);
  udp.write("hello");
  udp.endPacket();
}
```

接收心跳包的代码:

``` C
#include
#include

WiFiUDP udp;
unsigned int localPort = 8888;  // 本地的 UDP 端口

void setup()
{
  udp.begin(localPort);
}

void loop()
{
  int packetSize = udp.parsePacket();
  if(packetSize)
  {
    char packetBuffer[255];
    int len = udp.read(packetBuffer, 255);
    if(len > 0)
    {
      packetBuffer[len] = 0;
      if(strcmp(packetBuffer, "hello") == 0)
      {
        // 收到心跳包,回复确认包
        udp.beginPacket(udp.remoteIP(), udp.remotePort());
        udp.write("world");
        udp.endPacket();
      }
    }
  }
}
```

这样,NodeMCU 就可以通过发送 UDP 包进行心跳检测,以实现故障保护机制。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分