ZBLOG

#include char serial_data; #define ledpin 13 SoftwareSerial jdySerial(2, 3); // RX, TX unsigned long lastReadTime = 0; // 上一次读取的时间 const unsigned long debounceDelay = 1; // 去抖动延迟,单位毫秒 void setup() { Serial.begin(38400); ...

如果你希望在接收到数据后执行相应的操作(例如打开或关闭LED),然后立即恢复到之前的状态,你可以在 turn 函数中执行相应的操作,然后使用 delay 来控制恢复状态的时间。以下是修改后的代码示例:

修改后的代码

#include <SoftwareSerial.h>

char serial_data;
#define ledpin 13

SoftwareSerial jdySerial(2, 3); // RX, TX
unsigned long lastReadTime = 0;  // 上一次读取的时间
const unsigned long debounceDelay = 1; // 去抖动延迟,单位毫秒

void setup() {
    Serial.begin(38400);
    jdySerial.begin(38400);
    pinMode(ledpin, OUTPUT);
    digitalWrite(ledpin, LOW); // 默认关闭LED
}

void loop() {
    if (jdySerial.available()) {
        char receivedChar = jdySerial.read();
        Serial.print("Received: ");
        Serial.println(receivedChar);

        if (millis() - lastReadTime > debounceDelay) { 
            turn(receivedChar); // 调用 turn 函数处理接收到的数据
            lastReadTime = millis(); // 更新最后读取时间
        }
    }
}

void turn(char data) {  
    switch (data) {  
        case 'o': 
            digitalWrite(ledpin, HIGH); // 打开LED
            delay(500);                  // 保持500毫秒
            digitalWrite(ledpin, LOW);   // 然后关闭LED
            break;

        case 'x': 
            digitalWrite(ledpin, LOW);   // 直接关闭LED(如果需要)
            break;
    }        
}

代码说明:

  1. 保持 LED 开启

    • turn 函数中,当接收到 'o' 时,先将 LED 打开,然后使用 delay(500) 保持打开状态 500 毫秒。
    • 随后,将 LED 设置为低电平,关闭它。
  2. 关于 'x' 的处理

    • 如果只需直接关闭 LED,则不需要延迟。如果希望同样也加入一个短暂的开灯显示,可以增加类似 'o' 的逻辑。

注意事项:

  • 使用 delay() 会阻塞程序的其他操作,因此在实际项目中,如果有多个功能需要同时进行(如监听串口、响应按钮等),最好使用非阻塞的方法,如基于定时器的实现。
  • 如果不想影响其他循环中的任务,可以考虑改用 millis() 方法控制 LED 的开启和关闭,而不是使用 delay()


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20313

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?