質問するログイン新規登録

回答編集履歴

2

ソースの修正

2017/10/12 00:41

投稿

MasahikoHirata
MasahikoHirata

スコア3778

answer CHANGED
@@ -28,12 +28,12 @@
28
28
  attachInterrupt(0, function, FALLING);
29
29
  }
30
30
  void loop(){
31
- if(degitalRead(sw_a) == 0){ // ポーリングでAとBの個別処理
31
+ if(digitalRead(sw_a) == 0){ // ポーリングでAとBの個別処理
32
32
  digitalWrite(relay_1,HIGH);
33
33
  delay(30000);
34
34
  digitalWrite(relay_1,LOW);
35
35
  }
36
- if(degitalRead(sw_b) == 0){
36
+ if(digitalRead(sw_b) == 0){
37
37
  digitalWrite(relay_2,HIGH);
38
38
  delay(30000);
39
39
  digitalWrite(relay_2,LOW);

1

質問者要望によるソースの追加

2017/10/12 00:41

投稿

MasahikoHirata
MasahikoHirata

スコア3778

answer CHANGED
@@ -4,4 +4,42 @@
4
4
  さて貴殿の質問ではスイッチがpull upされているのか?それとも押下で0Vになるのかが不明です。(ハード、特に結線)が示されると的確な回答が可能かと思われます。
5
5
 
6
6
  前置きの説明と貴殿のソースの比較から説明します。
7
- 'loop'の中では”ポーリング”でAとBのスイッチの状態で’3秒’だけPinの8もしくは9がHighになる。(30秒の場合は引数が30000)。そしてこの間に割り込み処理をするとすれば前述の’attachInterrupt(interrupt, function, mode)’をsetup中で定義しその際に関数’function’に強制的にPin8及び9をLOWにする処理を書けば解決すると思われます。
7
+ 'loop'の中では”ポーリング”でAとBのスイッチの状態で’3秒’だけPinの8もしくは9がHighになる。(30秒の場合は引数が30000)。そしてこの間に割り込み処理をするとすれば前述の’attachInterrupt(interrupt, function, mode)’をsetup中で定義しその際に関数’function’に強制的にPin8及び9をLOWにする処理を書けば解決すると思われます。
8
+
9
+
10
+ 追記。私ならばのソースを追加。
11
+ arduino UNOでarduino IDEの場合。
12
+ ```arduino
13
+ #define relay_1 8
14
+ #define relay_2 9
15
+ #define sw_a 4 // optimaize.original as pin2
16
+ #define sw_b 3
17
+ #define sw_c 2
18
+ void function(void){
19
+ digitalWrite(relay_1,LOW);
20
+ digitalWrite(relay_2,LOW);
21
+ }
22
+ void setup(){
23
+ pinMode(relay_1,OUTPUT);
24
+ pinMode(relay_2,OUTPUT);
25
+ pinMode(sw_a,INPUT_PULLUP);
26
+ pinMode(sw_b,INPUT_PULLUP);
27
+ pinMode(sw_c,INPUT_PULLUP);
28
+ attachInterrupt(0, function, FALLING);
29
+ }
30
+ void loop(){
31
+ if(degitalRead(sw_a) == 0){ // ポーリングでAとBの個別処理
32
+ digitalWrite(relay_1,HIGH);
33
+ delay(30000);
34
+ digitalWrite(relay_1,LOW);
35
+ }
36
+ if(degitalRead(sw_b) == 0){
37
+ digitalWrite(relay_2,HIGH);
38
+ delay(30000);
39
+ digitalWrite(relay_2,LOW);
40
+ }
41
+
42
+
43
+ ```
44
+ ポーリングなのでAとBが同時の押された場合は先に検知した方が優先ですが。
45
+ 別々の30秒づつならばMsTimer2辺りのタイマー割り込みで処理が必要です。