如果你想去掉延时并且确保在按钮按下时只发送一次字符 ‘x’,可以使用状态变量来跟踪按钮的状态。以下是修改后的代码示例:
示例代码
#include <SoftwareSerial.h>
#define LEDPIN 13
#define BUTTON_PIN 8
SoftwareSerial jdySerial(2, 3); // RX, TX
bool lastButtonState = HIGH; // 上一个按钮状态
void setup() {
Serial.begin(38400);
jdySerial.begin(38400);
pinMode(LEDPIN, OUTPUT);
digitalWrite(LEDPIN, LOW); // 默认关闭LED
pinMode(BUTTON_PIN, INPUT_PULLUP); // 设置按钮引脚为输入并启用内部上拉电阻
}
void loop() {
bool currentButtonState = digitalRead(BUTTON_PIN); // 获取当前按钮状态
if (currentButtonState == LOW && lastButtonState == HIGH) {
sendData('x'); // 按钮从未按下变为按下时发送 'x'
Serial.println("Sent: x"); // 在串口监视器中打印发送的数据
}
lastButtonState = currentButtonState; // 更新最后的按钮状态
}
void sendData(char data) {
jdySerial.print(data); // 向 JDY 串口发送数据
}
代码说明:
状态变量:
- 使用
lastButtonState
来存储上一个按钮的状态。
- 使用
无延时处理:
- 在
loop()
中,通过比较currentButtonState
和lastButtonState
来检测按钮的上升沿(即从未按下变为按下)。 - 当检测到这个变化时,就调用
sendData('x')
并打印信息。
- 在
更新状态:
- 最后,将
lastButtonState
更新为当前的按钮状态,以便下一次循环判断。
- 最后,将
这种方法避免了使用延时,同时确保在每次按下按钮时仅发送一次字符 ‘x’。
内容由零声教学AI助手提供,问题来源于学员提问