実現したいこと
前提
arduino (seeedxiao)でビーコンを作りたくて
// IRコードを受信して1回目の受信は通常点灯、2回目は点滅、3回目は消灯 を行いたい。
発生している問題・エラーメッセージ
点滅がうまく行えません。
delayを使えば簡単なのですが、そのようにすれば3回目にボタンを押したときに消灯が行えないので
millisを使っています。
1週目の点滅では点灯し続け、2周目はずっと消灯しています。
エラーメッセージ
なし
該当のソースコード
C言語
// 1回目は通常点灯、2回目は点滅、3回目は消灯 を作りたい
#include <IRremote.h>
int RECV_PIN = 2; // 受信ピン
int LED_PIN_R = 3; // LEDの接続ピンR
int LED_PIN_G = 4; // LEDの接続ピンG
int LED_PIN_B = 5; // LEDの接続ピンB
//ボタンの押しすぎを検知
int buttonPressCount = 0; // ボタンの押下回数
unsigned long lastButtonPressTime = 0; // 最後にボタンが押された時間
//点滅でのdelay
unsigned long lastMillis = 0; // 終了時刻
int interval = 3000; // 点滅間隔(ミリ秒)
static bool state = false; //LEDの状態
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
pinMode(LED_PIN_R, OUTPUT);
pinMode(LED_PIN_G, OUTPUT);
pinMode(LED_PIN_B, OUTPUT);
Serial.begin(115200);
irrecv.enableIRIn();
}
void setColor(int red, int green, int blue) {
analogWrite(LED_PIN_R, red);
analogWrite(LED_PIN_G, green);
analogWrite(LED_PIN_B, blue);
}
void loop() {
unsigned long currentTime = millis(); //ボタンを監視
unsigned long currentMillis = millis(); //点滅の監視
if (irrecv.decode(&results)) {
if (currentTime - lastButtonPressTime > 500) { // 前回のボタン押下から500ms以上経過していれば処理
Serial.println(results.value, HEX); // デコード用serial
if (results.value == 0x66B47) { // リモコンの信号を受信 buttonPressCount++; //受信時にボタンをカウント if (buttonPressCount == 1) { Serial.println("1st 点灯を開始します"); setColor(0, 0, 255); // 青色 } else if (buttonPressCount == 2) { Serial.println("2nd 点滅を開始します"); if (currentMillis - lastMillis >= interval) { lastMillis = currentMillis; Serial.println("時間経過"); //debug // LEDの状態を切り替える state = !state; Serial.println("状態を切り替えます");//debug // LEDを点灯または消灯する analogWrite(LED_PIN_B, state ? 255 : 0); Serial.println("状態変更完了"); //bebug } } else if (buttonPressCount == 3) { setColor(0, 0, 0); // 全ての色をオフ buttonPressCount = 0; // リセット Serial.println("3rd 動作を終了します"); } } lastButtonPressTime = currentTime; // ボタンが押された時間を更新 } irrecv.resume(); // 次の信号を待つ
}
}
試したこと
debugでいろいろ試したのですが、
///////////////////////
66B47
1st 点灯を開始します
66B47
2nd 点滅を開始します
時間経過
状態を切り替えます
状態変更完了
///////////////////////
まですぐに出てくる時と
///////////////////////
1st 点灯を開始します
66B47
2nd 点滅を開始します
///////////////////////
までしか出ないときがあります。
補足情報(FW/ツールのバージョンなど)
IRremoteを使用

回答1件
あなたの回答
tips
プレビュー