質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

1回答

228閲覧

アルディーノでスイッチを離したときにLEDテープが光ってしまう

CHINJAOH

総合スコア0

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2024/10/02 16:32

編集2024/10/03 01:31

実現したいこと

アルディーノでスイッチを離したときに光らないようにしたい。

現在、アルディーノにてスイッチを押している間は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
三和電子押しボタン

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nac_tnk

2024/10/03 00:46

プログラムは良く見ていないけど、Arduino_UNOって、R3?それともR4? R3ならネオピクセル500個は無理。 色情報(だけ)で1個4バイト*500個=2kBのメモリが必要。 一方、R3のメモリは2kBだから、プログラムを入れた残りが2kBある筈が無い。 400個?ぐらいなら動くんじゃないの? R4なら、そのライブラリは、「Compilation」ではPASSになっているけど、「Hardware Test」でFAILになっている。 つまり、R4には未対応という事。
CHINJAOH

2024/10/03 01:34

ArduinoはR3を使用しています! 500と書きましたが、実際に動かしているのは少ないため発光自体は問題なく行えています。
nac_tnk

2024/10/03 01:47

いいえ。500と書けば500個分のデータを作り、500個分のデータを送信します。 何故、500と書いたのに、繋げた数のデータしか作らないと思った?
CHINJAOH

2024/10/03 02:00

すみません。実際に繋げた際に問題なく発光していたので勘違いしてしまいました。修正させていただきます。
y_waiwai

2024/10/03 02:52

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答1

0

スイッチを離した際にも光るようになってしまいました。

そもそも、回路が悪いのでは?プルダウン抵抗は付けていますか?

スイッチを押して1を送信する際にシリアル通信の処理が重くなってしまいます。

ボタンを読み取るタイミングが悪ければ(loop関数の先頭に来なければ)ボタンを読みませんから、
ループ関数の回る頻度が少ないのでは?

あと

if (Serial == 1) {

は何をしたいのでしょうか?

投稿2024/10/03 02:09

nac_tnk

総合スコア494

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問