ESP8266控制流水灯并使用按键中断和消抖
时间: 2023-06-13 18:03:24 浏览: 450
下面是一个基本的ESP8266控制流水灯并使用按键中断和消抖的示例代码:
```C++
#include <ESP8266WiFi.h>
#define LED_COUNT 4
#define LED_PIN D1
#define BTN_PIN D3
volatile bool buttonPressed = false;
void ICACHE_RAM_ATTR buttonInterrupt() {
static unsigned long lastInterruptTime = 0;
unsigned long interruptTime = millis();
if (interruptTime - lastInterruptTime > 200) {
buttonPressed = true;
}
lastInterruptTime = interruptTime;
}
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BTN_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BTN_PIN), buttonInterrupt, FALLING);
}
void loop() {
static int ledIndex = 0;
static unsigned long lastUpdateTime = 0;
if (buttonPressed) {
buttonPressed = false;
ledIndex = (ledIndex + 1) % LED_COUNT;
digitalWrite(LED_PIN, (ledIndex == 0) ? HIGH : LOW);
}
if (millis() - lastUpdateTime > 1000) {
lastUpdateTime = millis();
digitalWrite(LED_PIN, LOW);
delay(50);
for (int i = 0; i < LED_COUNT; i++) {
digitalWrite(LED_PIN, (i == ledIndex) ? HIGH : LOW);
delay(50);
}
}
}
```
这个示例代码使用 `attachInterrupt()` 函数将按键中断与 `buttonInterrupt()` 函数关联起来。当按键被按下时,`buttonInterrupt()` 函数会被调用并设置 `buttonPressed` 变量为 `true`。在 `loop()` 函数中,当 `buttonPressed` 变量为 `true` 时,它会切换当前流水灯的位置。另外,为了防止按键抖动,`buttonInterrupt()` 函数会对两次中断之间的时间进行检查,只有当两次中断之间的时间超过200毫秒时才将 `buttonPressed` 变量设置为 `true`。
关于流水灯部分,`loop()` 函数会每秒钟更新一次流水灯的位置,通过 `ledIndex` 变量来控制当前亮灯的位置,流水灯的移动是通过循环 `for` 语句实现的。在每次循环中,它会先将当前亮灯关闭,然后将 `ledIndex` 变量指定的灯亮起来,然后延时50毫秒,再将下一个灯亮起来,以此类推。