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

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

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

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

Q&A

2回答

6019閲覧

LEDと圧電ブザーで同時に進めたい

mijinnnko111

総合スコア1

Arduino

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

0グッド

0クリップ

投稿2020/09/25 06:09

前提・実現したいこと

人感センサーで人を検知したときにLEDと圧電ブザーを同時に知らせるようにしたいが、
このプログラムだとLEDが0.5秒点滅したらブザーが鳴るといった順番になってしまうのですが、
上から順番ではなくLEDとブザー同時になるようにするにはどうしたらいいのでしょうか?

該当のソースコード

#define LED_OUT 14 #define PIR_IN 13 #define BUZ_OUT 25 #define BEAT 200 #define LEDC_CHANNEL 0 // チャンネル #define LEDC_TIMER_BIT 13 #define LEDC_BASE_FREQ 5000 void setup() { pinMode(LED_OUT, OUTPUT); pinMode(PIR_IN, INPUT); //音を鳴らす準備 ledcSetup(LEDC_CHANNEL, LEDC_BASE_FREQ, LEDC_TIMER_BIT); ledcAttachPin(BUZ_OUT, LEDC_CHANNEL); } void loop() { digitalWrite(LED_OUT, HIGH); if (digitalRead(PIR_IN) == HIGH) { delay(100); } else { delay(1000); } digitalWrite(LED_OUT, LOW); if (digitalRead(PIR_IN) == HIGH) { delay(100); } else { delay(1000); } if (digitalRead(PIR_IN) == HIGH) { ledcWriteTone(LEDC_CHANNEL, 3136); // ソ delay(BEAT); ledcWriteTone(LEDC_CHANNEL, 2960); // ♯ファ delay(BEAT); ledcWriteTone(LEDC_CHANNEL, 2489); // ♯レ delay(BEAT); ledcWriteTone(LEDC_CHANNEL, 1760); // ラ delay(BEAT); ledcWriteTone(LEDC_CHANNEL, 1661); // ♯ソ delay(BEAT); ledcWriteTone(LEDC_CHANNEL, 2637); // ミ delay(BEAT); ledcWriteTone(LEDC_CHANNEL, 3322); // ♯ソ delay(BEAT); ledcWriteTone(LEDC_CHANNEL, 4186); // ド delay(BEAT); ledcWriteTone(LEDC_CHANNEL, 0); // 音を止める } }

補足情報(FW/ツールのバージョンなど)

ESP-WROOM-32D

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

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

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

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

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

guest

回答2

0

このプログラムだとLEDが0.5秒点滅したらブザーが鳴るといった順番になってしまうのですが

センサー反応無し→2s間隔の点滅
センサー反応あり→0.2s間隔の点滅とメロディ
になっていると思うのですけど?

まず、仕様として、
点滅間隔は本当は何秒にしたいのか?
センサーが反応している間はずっとループさせるのか?或いは1回なのか?
センサーが反応無しになったら即メロディ&点滅をを終了させるのか、メロディが終わるまでは続けるのか?
あたりをどうしようとしているのかが判らないと的はずれなアドバイスになるかもしれないけど、

例えば、

void myTone(word freq){ ledcWriteTone(LEDC_CHANNEL, freq); digitalWrite(LED_OUT, HIGH); delay(Beat/2); digitalWrite(LED_OUT, LOW); delay(Beat/2); } void loop() { if (digitalRead(PIR_IN) == HIGH) { myTone(3136); // ソ myTone(2960); // ♯ファ myTone(2489); // ♯レ myTone(1760); // ラ myTone(1661); // ♯ソ myTone(2637); // ミ myTone(3322); // ♯ソ myTone(4186); // ド myTone(0); // 音を止める myTone(0); myTone(0); }else{ digitalWrite(LED_OUT, HIGH); delay(1000); digitalWrite(LED_OUT, LOW); delay(1000); } }

とか。
まぁ、試行錯誤していれば、どんな仕様でもそのうち出来そうな気がしますけど。

投稿2020/09/25 14:34

nac_tnk

総合スコア494

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

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

mijinnnko111

2020/09/28 00:03

ありがとうございます。点滅間隔はリセットボタンを押すまでずっとなりっぱなしにする仕様ですが、まずは10秒ほどで人感センサーのスイッチは切るようにしたいところです。 センサーが反応したらLEDとメロディが同時に流れるようにし、人感センサーが反応している間はずっと流れるようにしたいです。人感センサーの反応がなくなったら即LOWにするようにしたいと思ってます。
nac_tnk

2020/09/28 15:51

スケッチを見る限りでは人感センサーを切る(コントロールする)仕様にはなっていないようですけど、 これは人感センサー側の出力時間延長設定の事ですか?それとも10秒経過したら、無視するようにプログラムするのでしょうか?
mijinnnko111

2020/10/07 02:47

今は人感センサーの検知時間が現在は5秒になっていますが、人感センサー側の検知時間の調整に合わせて人感センサーがLOWになったらLEDが消灯するようにしたいです。
nac_tnk

2020/10/07 04:16

反応なしの時は完全に消灯ですか? 例えば↓のようなのでも良さそうですけど。 word freq[9]= {3136,2960,2489,1760,1661,2637,3322,4186,0}; void loop{ static word cnt=0; if(digitalRead(PIR_IN)) { if(cnt%10==0 && cnt<90)ledcWriteTone(LEDC_CHANNEL, freq[cnt%10]); digitalWrite(LED_OUT, cnt%50<25); cnt=(cnt+1)%100;//100の部分は適当に調整 } else { cnt=0; digitalWrite(LED_OUT, LOW); ledcWriteTone(LEDC_CHANNEL, 0); } delay(20); }
mijinnnko111

2020/10/07 04:50

delay関数だと複数処理ができないと聞いたのですが、 上記のプログラムですと可能なのでしょうか?
nac_tnk

2020/10/07 05:55

長いdelayじゃなければ大丈夫です。 delayの間は操作出来ないですけど、短いdelayでタイミングをとるのは普通です。 この程度の処理(要件)なら、こっちの方が簡単です。 より正確な時間が必要ならタイマー割り込みによる処理になります。
guest

0

delay関数というのは、なにもしないで時間待ちをするだけの関数です
LEDをつけて時間待ちをすれば、その後の命令ってのは時間待ちのあとに実行されることになります
こういう場合は、delay関数は使ってはいけません。
時刻データを読んで、規定の時間経過した場合にのみLED操作をするといった処理を行います
また、ブザー鳴動も、鳴動命令の実行とともに規定の経過時刻を設定し、時間経過したときのみ次の処理を行うようにします。
このLED操作とブザー操作を順番にループを回す形で実行します。

繰り返しますが、delay関数は使いません

投稿2020/09/25 06:26

y_waiwai

総合スコア88042

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

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

mijinnnko111

2020/09/28 00:11

ありがとうございます。今まだ動作確認中と原因を調べていますが、以下のプログラムで動作の確認をしたところ ①最初はLEDはLOW状態 ②人感センサーが反応中はLチカ中 ③人感センサーの反応がなくなったらLEDはLOW状態になりますが、たまにLチカではなくHIGHになったままな現象になっています。 原因を調べてるところです。 #define LED_OUT 14 #define PIR_IN 13 int LedState = 0; unsigned long previousMillis = 0; void setup() { pinMode(LED_OUT, OUTPUT); pinMode(PIR_IN, INPUT); } void loop() { if(digitalRead(PIR_IN)==HIGH){ unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= 100) { if (LedState == 0) { digitalWrite(LED_OUT, HIGH); LedState = 1; } else { digitalWrite(LED_OUT, LOW); LedState = 0; } previousMillis = currentMillis; } } }
y_waiwai

2020/09/28 00:21

人感センサがOFFになったときは、タイマをリセットしてLEDをOFFにするという操作が必要ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問