如果你希望在接收到数据后执行相应的操作(例如打开或关闭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;
}
}
代码说明:
保持 LED 开启:
- 在
turn
函数中,当接收到'o'
时,先将 LED 打开,然后使用delay(500)
保持打开状态 500 毫秒。 - 随后,将 LED 设置为低电平,关闭它。
- 在
关于
'x'
的处理:- 如果只需直接关闭 LED,则不需要延迟。如果希望同样也加入一个短暂的开灯显示,可以增加类似
'o'
的逻辑。
- 如果只需直接关闭 LED,则不需要延迟。如果希望同样也加入一个短暂的开灯显示,可以增加类似
注意事项:
- 使用
delay()
会阻塞程序的其他操作,因此在实际项目中,如果有多个功能需要同时进行(如监听串口、响应按钮等),最好使用非阻塞的方法,如基于定时器的实现。 - 如果不想影响其他循环中的任务,可以考虑改用
millis()
方法控制 LED 的开启和关闭,而不是使用delay()
。
内容由零声教学AI助手提供,问题来源于学员提问