実現したいこと
アルディーノでスイッチを離したときに光らないようにしたい。
現在、アルディーノにてスイッチを押している間は1を送信し続けてLEDテープがフェードで発光するよう書いていたのですが、なぜかスイッチを離した際にも光るようになってしまいました。また、スイッチを押して1を送信する際にシリアル通信の処理が重くなってしまいます。
該当のソースコード
#include <Adafruit_NeoPixel.h>
#define LED_PIN 6 // LEDテープのデータ入力ピン
#define NUM_LEDS 400 // LEDテープのLED数
#define BUTTON_PIN 2 // ボタンの接続ピン
#define DEBOUNCE_DELAY 50 // ボタンのデバウンス遅延
#define FADE_TIME_MS 800 // フェードイン・フェードアウトの合計時間(ミリ秒)
#define INITIAL_POSITION 0 // 発光開始の初期位置
#define LED_ON_COUNT 1 // 発光させるLEDの数
#define LED_OFF_COUNT 4 // 隙間のLED数
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
int buttonState = 0; // 現在のボタンの状態
int lastButtonState = 0; // 前回のボタンの状態
unsigned long lastDebounceTime = 0; // 最後のデバウンス時間
void setup() {
strip.begin();
strip.show(); // 初期状態の表示
Serial.begin(9600); // シリアル通信を開始
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
if (buttonState == HIGH) {
// ボタンが押されたときの処理
Serial.println("1");
delay(100);
}
else if(buttonState == LOW) {
Serial.println("0"); // シリアル通信で初期状態の「0」を送信
delay(100);
}
//if (reading != lastButtonState) {
//lastDebounceTime = millis(); // 状態が変わったら時刻を記録
//}
//if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) {
if (reading != buttonState) {
buttonState = reading;
if (Serial == 1) { // フェード時間の設定 unsigned long startTime = millis(); unsigned long fadeDuration = FADE_TIME_MS; // フェード時間 unsigned long fadeEndTime = startTime + fadeDuration; while (millis() < fadeEndTime) { // 現在の経過時間 unsigned long currentTime = millis(); float progress = float(currentTime - startTime) / fadeDuration; // フェードイン・フェードアウトの明るさを計算 uint8_t brightness = 255 * (progress < 0.5 ? 2 * progress : 2 - 2 * progress); // 発光するLEDの位置を固定し、明るさを設定 setPatternBrightness(INITIAL_POSITION, LED_ON_COUNT, LED_OFF_COUNT, brightness); delay(10); // 更新速度を調整 } // フェードが完了した後にLEDを消灯 turnOffLEDs(); // ボタンの再入力を防ぐための遅延 delay(100); // この遅延がないとボタンが再度押されても反応しない可能性があります } }
//}
lastButtonState = reading;
}
// 固定位置のLEDの明るさを設定する関数
void setPatternBrightness(int start, int onCount, int offCount, uint8_t brightness) {
for (int i = 0; i < NUM_LEDS; i++) {
// 現在の位置からフェード発光部分と消灯部分を設定
int patternPos = (i - start) % (onCount + offCount);
if (patternPos >= 0 && patternPos < onCount) {
// 発光中のLEDは指定した明るさで
uint32_t color = strip.Color(100, 100, 255); // 白色
uint8_t r = (color >> 16) & 0xFF;
uint8_t g = (color >> 8) & 0xFF;
uint8_t b = color & 0xFF;
strip.setPixelColor(i, strip.Color(r * brightness / 255, g * brightness / 255, b * brightness / 255));
} else {
// 消灯中のLEDは完全に消灯
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
}
strip.show();
}
// 全てのLEDを消灯する関数
void turnOffLEDs() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0)); // 全てのLEDを消灯
}
strip.show();
}
試したこと
個人的に、buttonStateが問題なのでは無いかと感じ、HIGHの時にフェードするように変えたりしたのですが、離しても光らなくなったがシリアル通信が行われない。シリアル通信の処理が重くなるのはdelayが原因だと思ったのですが、数値を変更してもうまくいかず手詰まりの状態です。
補足情報(FW/ツールのバージョンなど)
使用機材
Arduino_UNO R3
ws2812b
三和電子押しボタン