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

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

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

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

Q&A

解決済

2回答

10547閲覧

Arduino UNOで2組のスイッチを押すとLEDが点灯する回路があって、点灯を2秒間保持すると他のスイッチが反応しません。同時に点灯させたい

Q_1986-kt

総合スコア13

Arduino

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

0グッド

0クリップ

投稿2020/01/10 12:13

基本は、スイッチを押している時にだけLEDが点灯するスケッチです。このスイッチとLEDが2組あります。
スイッチ1を押すとLED1が点灯、スイッチがOFFになってもLEDを2秒点灯させます。
スイッチ2も同じように押すとLED2が2秒間点灯。2つのスイッチを押すタイミングは決まっていません。
どちらが先になるかはわかりません。2つ同時の場合もあります。

コード

int sw_state1 = 0; int sw_state2 = 0; void setup() { pinMode(3, INPUT); pinMode(4, INPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); } void loop() { sw_state1 = digitalRead(3); if (sw_state1 == HIGH) { digitalWrite(12, HIGH); delay(2000); } else { digitalWrite(12, LOW); } sw_state2 = digitalRead(4); if (sw_state2 == HIGH) { digitalWrite(13, HIGH); delay(2000); } else { digitalWrite(13, LOW); } }

dalay(200)ぐらいにすれば、スイッチとLEDの点灯はイメージ通りに反応します。
dalay(2000)にして2秒点灯させようとすると、先に点灯したLEDが消灯してからでないと
もう一方のスイッチが反応しません。
(時間は特に決まってはいませんが数秒点灯を保持したいということです)

一方のスイッチを押してLEDが点灯していても、
もう一方のスイッチを押したらもう1つのLEDを点灯させたいです。
2つのスイッチは同時に押される可能性もあります。

Arduinoの接続するピンの場所を変えてみたり、
スイッチを内臓プルアップにしてみたり、
ハード的な変更もしてみました。

プログラム初心者ですが、
このコードだと、dalayで遅らせている時間が過ぎないと次の行のコードを実行できないということでしょうか
2つのスイッチのコードを並列(この表現でいいのかわかりませんが)に書かないとだめということでしょうか
試しに書いてみたコードです。

void loop(){ sw_state1 = digitalRead(3); if (sw_state1 == HIGH) { sw1(); } else { digitalWrite(12, LOW); } sw_state2 = digitalRead(4); if (sw_state2 == HIGH) { sw2(); } else { digitalWrite(13, LOW); } } void sw1() { digitalWrite(12, HIGH); delay(2000); } void sw2() { digitalWrite(13, HIGH); delay(2000); }

結果は、同じでした。

何かアドバイスをお願いいたします。

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

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

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

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

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

guest

回答2

0

最初に聞いときますけど、こういう回路になっていると思っていいですか。
回路
R3/R4に相当する、スイッチがオープンの時に電位をLに固定する処置はしてありますね?
端子が何もつながっていない、というのは決してLOWという意味ではないです。動いていても「たまたま」と考える必要があります。
スイッチをON時HIGHで取得する人ってよくやっちゃってるので念の為。
(スイッチON時LOWにするのなら内蔵PULLUPが使えば外部に抵抗をつけなくてもいいのですが)

で。
長時間のdelayはダメダメだけど、短時間毎に区切ればdelayでも十分に対応可能。何の前提もなく"delayはダメ"だと思っているのならそれは違うから。

ちょっと「2つのLED」は忘れて、LEDひとつスイッチひとつで、スイッチを押したら点灯。スイッチを離したら2秒たって消灯、してみましょう。あなたの最初のプログラムと同様に作ると、

Arduino

1int sw_state1 = 0; 2 3void setup() { 4 pinMode(3, INPUT); 5 pinMode(12, OUTPUT); 6} 7 8void loop() { 9 sw_state1 = digitalRead(3); 10 if (sw_state1 == HIGH) { 11 digitalWrite(12, HIGH); 12 delay(2000); 13 } else { 14 digitalWrite(12, LOW); 15 } 16}

それを、こうしてみたらどうでしょう。

Arduino

1int sw_state1 = 0; 2int count1 = 0; 3const int DLY = 10; 4const int HOLD_TIME = 2000; 5 6void setup() { 7 pinMode(3, INPUT); 8 pinMode(12, OUTPUT); 9} 10 11void loop() { 12 int ledStat1 = LOW; 13 sw_state1 = digitalRead(3); 14 if ( count1 > 0) { //スイッチが押されてから指定時間が経ってない 15 count1--;//減算 16 ledStat1 = HIGH;//LEDは点灯 17 } else {//指定時間経過以降 18 if (sw_state1 == HIGH ) { //スイッチが押されている 19 ledStat1 = HIGH;//LED点灯 20 count1 = HOLD_TIME / DLY; //指定時間をセット 21 } else { 22 ledStat1 = LOW;//LED消灯 23 } 24 } 25 digitalWrite( 12, ledStat1 ); 26 delay(DLY); 27}

delay()は10msだけ。人間には遅れをほぼ検知出来ない周期でスイッチを調べていますが、しかし2秒間はLEDが点灯している、そういうプログラムになっています。
delay()以外の部分は「一瞬」で終わりますから、複数のスイッチで複数のLEDを処理したければ、同様の処理で変数を変えたものを並べれば人間にとっては「同時」に2つのLEDが制御されている(としか思えない)状況が作れます。ついでに、LED1はスイッチ1から2秒、LED2はスイッチ2から3秒で消える、なんていうのも簡単に出来ますね。

時間を測ってもいいですけど、delayがダメ、というわけでは必ずしもないので。

投稿2020/01/11 07:41

thkana

総合スコア7610

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

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

Q_1986-kt

2020/01/13 13:28

thkanaさん、とても丁寧な説明ありがとうございます。 とても参考になりました。 今、作っているコードにはタイマーの機能もついているので時間を測るとかなり複雑で面倒だなと思っていたので 時間を測らないこの方法は、シンプルでわかりやすく、実際に使っているコードに組み込んでちゃんと動くことも確認でき、希望通りの動きができました。本当にありがとうございました。
guest

0

ベストアンサー

そりゃDelayの間はただ待ってるだけで、他のことは全くしないのでスイッチ効きません。
Delayを使わないで実装しましょう
2秒経過するまで何もしないでスルーするようにすればそのあとスイッチの処理ができます

繰り返しますが、Delayは使ってはいけません

投稿2020/01/10 12:24

y_waiwai

総合スコア87719

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

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

Q_1986-kt

2020/01/10 13:59

やっぱり、そうですか。 時間を計測して、その時間が経過するまで点灯させるようにやってみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問