求教arduino ttp223長按調節ws2812燈光亮度?
```
#include <Adafruit_NeoPixel.h>
#define PIN_PIXEL 5 // WS2812控制引腳
#define NUM_PIXELS 30 // 燈珠數量
#define PIN_TOUCH 2 // TTP223觸摸模塊控制引腳
// WS2812對象
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_PIXELS, PIN_PIXEL, NEO_GRB + NEO_KHZ800);
// 亮度調節變量
int brightness = 255;
int step = 10;
// 開關燈標誌
bool isOn = true;
// 觸摸模塊狀態變量
bool isPressed = false;
unsigned long pressTime = 0;
unsigned long releaseTime = 0;
void setup() {
pixels.begin();
pinMode(PIN_TOUCH, INPUT_PULLUP);
}
void loop() {
// 判斷觸摸模塊狀態
bool touchState = digitalRead(PIN_TOUCH);
if (touchState != isPressed) {
isPressed = touchState;
if (isPressed) {
pressTime = millis();
} else {
releaseTime = millis();
if (releaseTime - pressTime < 1000) { // 按下時間不足1秒算單擊
if (isOn) {
pixels.clear(); // 滅燈
pixels.show();
isOn = false;
} else {
pixels.fill(pixels.Color(brightness, brightness, brightness)); // 亮燈
pixels.show();
isOn = true;
}
}
}
}
// 長按調節亮度
if (isPressed && (millis() - pressTime > 1000)) {
if (releaseTime == 0 || (millis() - releaseTime > 500)) { // 避免多次觸發
brightness += step;
if (brightness > 255) {
brightness = 255;
step = -step;
} else if (brightness < 0) {
brightness = 0;
step = -step;
}
pixels.setBrightness(brightness);
pixels.show();
releaseTime = millis();
}
}
}
```
代碼說明:
1. 定義了WS2812控制引腳、燈珠數量、TTP223觸摸模塊控制引腳等常量。
2. 在setup()函數中初始化WS2812對象和觸摸模塊引腳。
3. 在loop()函數中不斷檢測觸摸模塊狀態。如果觸摸模塊狀態發生改變,根據按下時間判斷是單擊還是長按。如果是單擊,則切換燈的開關狀態。如果是長按,則根據按壓時間調節燈的亮度。
4. 燈的亮度調節使用了壹個變量brightness和壹個變量step,brightness表示當前亮度,step表示亮度調節步長,每次長按時根據step加減brightness,當brightness超出範圍時翻轉step的方向。
5. 雙擊開關燈的效果實現比較簡單,直接通過判斷isOn變量的值來控制燈的開關即可。
需要註意的是,這只是壹個簡單的示例代碼,可能還有很多需要改進的地方,比如對按鍵按下的抖動進行濾波、對亮度調節的步長進行優化等。
麻煩給我反饋是否解決了妳的問題,謝謝妳,我很希望能夠給妳提供服務