回答編集履歴

2

ソースの修正

2017/10/12 00:41

投稿

MasahikoHirata
MasahikoHirata

スコア3747

test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
  void loop(){
60
60
 
61
- if(degitalRead(sw_a) == 0){ // ポーリングでAとBの個別処理
61
+ if(digitalRead(sw_a) == 0){ // ポーリングでAとBの個別処理
62
62
 
63
63
  digitalWrite(relay_1,HIGH);
64
64
 
@@ -68,7 +68,7 @@
68
68
 
69
69
  }
70
70
 
71
- if(degitalRead(sw_b) == 0){
71
+ if(digitalRead(sw_b) == 0){
72
72
 
73
73
  digitalWrite(relay_2,HIGH);
74
74
 

1

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

2017/10/12 00:41

投稿

MasahikoHirata
MasahikoHirata

スコア3747

test CHANGED
@@ -11,3 +11,79 @@
11
11
  前置きの説明と貴殿のソースの比較から説明します。
12
12
 
13
13
  'loop'の中では”ポーリング”でAとBのスイッチの状態で’3秒’だけPinの8もしくは9がHighになる。(30秒の場合は引数が30000)。そしてこの間に割り込み処理をするとすれば前述の’attachInterrupt(interrupt, function, mode)’をsetup中で定義しその際に関数’function’に強制的にPin8及び9をLOWにする処理を書けば解決すると思われます。
14
+
15
+
16
+
17
+
18
+
19
+ 追記。私ならばのソースを追加。
20
+
21
+ arduino UNOでarduino IDEの場合。
22
+
23
+ ```arduino
24
+
25
+ #define relay_1 8
26
+
27
+ #define relay_2 9
28
+
29
+ #define sw_a 4 // optimaize.original as pin2
30
+
31
+ #define sw_b 3
32
+
33
+ #define sw_c 2
34
+
35
+ void function(void){
36
+
37
+ digitalWrite(relay_1,LOW);
38
+
39
+ digitalWrite(relay_2,LOW);
40
+
41
+ }
42
+
43
+ void setup(){
44
+
45
+ pinMode(relay_1,OUTPUT);
46
+
47
+ pinMode(relay_2,OUTPUT);
48
+
49
+ pinMode(sw_a,INPUT_PULLUP);
50
+
51
+ pinMode(sw_b,INPUT_PULLUP);
52
+
53
+ pinMode(sw_c,INPUT_PULLUP);
54
+
55
+ attachInterrupt(0, function, FALLING);
56
+
57
+ }
58
+
59
+ void loop(){
60
+
61
+ if(degitalRead(sw_a) == 0){ // ポーリングでAとBの個別処理
62
+
63
+ digitalWrite(relay_1,HIGH);
64
+
65
+ delay(30000);
66
+
67
+ digitalWrite(relay_1,LOW);
68
+
69
+ }
70
+
71
+ if(degitalRead(sw_b) == 0){
72
+
73
+ digitalWrite(relay_2,HIGH);
74
+
75
+ delay(30000);
76
+
77
+ digitalWrite(relay_2,LOW);
78
+
79
+ }
80
+
81
+
82
+
83
+
84
+
85
+ ```
86
+
87
+ ポーリングなのでAとBが同時の押された場合は先に検知した方が優先ですが。
88
+
89
+ 別々の30秒づつならばMsTimer2辺りのタイマー割り込みで処理が必要です。