arduinoでデジタルセンサを複数使用し、閾値を時間間隔で設定しその閾値内でセンサが反応したらその閾値内のセンサ値をすべて反応したこと(HIGH)にするプログラムを書いてみたのですが、実行するとセンサ1(state1)が反応したらセンサ1だけでなくすべてのセンサがHIGHになってしまいます。センサは5つ使っているのですが、例えば、センサ1だけが反応したときにほかのセンサはHIGHにならずセンサ値を反応させるにはどのようにすればできるでしょうか。また、センサ5が動かないのも気になっています。よろしくお願いします。
例えば、センサ1だけが反応した時センサ1だけがHIGHを出力させたいですが、センサ1から5まですべてHIGHになってしまいます。また、センサ5は反応しない状況です…
出力例
7.8 0 0 0 0 0
8.0 0 0 0 0 0
8.1 0 0 0 0 0
8.2 0 0 0 0 0
8.3 0 0 0 0 0
8.4 0 0 0 0 0
8.5 0 0 0 0 0
8.6 0 0 0 0 0
8.7 0 0 0 0 0
8.8 0 0 0 0 0
8.9 0 0 0 0 0
9.0 0 0 0 0 0
9.1 1 1 1 1 1
9.2 1 1 1 1 1
9.3 1 1 1 1 1
9.4 1 1 1 1 1
9.5 1 1 1 1 1
9.6 1 1 1 1 1
9.7 1 1 1 1 1
9.8 1 1 1 1 1
9.9 1 1 1 1 1
10.0 1 1 1 1 1
10.1 1 0 0 0 0
10.2 1 1 1 1 1
10.3 1 1 1 1 1
10.4 1 1 1 1 1
10.5 1 1 1 1 1
10.6 1 1 1 1 1
10.7 1 1 1 1 1
10.8 1 1 1 1 1
10.9 1 1 1 1 1
11.0 1 1 1 1 1
11.1 1 1 1 1 1
11.2 1 0 0 0 0
11.3 1 1 1 1 1
11.4 1 1 1 1 1
11.5 1 1 1 1 1
11.6 1 1 1 1 1
11.7 1 1 1 1 1
11.8 1 1 1 1 1
11.9 1 1 1 1 1
12.0 1 1 1 1 1
12.1 1 1 1 1 1
12.2 1 1 1 1 1
12.3 1 0 0 0 0
12.4 1 1 1 1 1
12.5 1 1 1 1 1
12.6 1 1 1 1 1
12.7 1 1 1 1 1
12.8 1 1 1 1 1
12.9 1 1 1 1 1
13.0 1 1 1 1 1
13.1 1 1 1 1 1
13.2 1 1 1 1 1
13.3 1 1 1 1 1
13.4 1 0 0 0 0
13.5 0 0 0 0 0
13.6 0 0 0 0 0
arduino
1define PPR1 3 //センサpin番号 2define PPR2 4 3define PPR3 5 4define PPR4 6 5define PPR5 7 6define buza_Pin 13 //ブザー 7define LED_RED 12 //赤 8define LED_GERRN 11 //緑 9define LED_BLUE 10 //青 10float time; 11 12void setup() { 13pinMode(PPR1, INPUT); 14pinMode(PPR2, INPUT); 15pinMode(PPR3, INPUT); 16pinMode(PPR4, INPUT); 17pinMode(PPR5, INPUT); 18pinMode(13, OUTPUT); 19pinMode(12, OUTPUT); 20pinMode(11, OUTPUT); 21pinMode(10, OUTPUT); 22Serial.begin(9600); 23while (!Serial); 24Serial.println ("センサが安定するまで少々お待ちください(30s)");//センサ安定起動時間 25delay(30000); 26} 27 28void loop() { 29int state1 = digitalNoiselessRead1(PPR1, 100, 1000); //PPR1 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 30int state2 = digitalNoiselessRead2(PPR2, 100, 1000); //PPR2 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 31int state3 = digitalNoiselessRead3(PPR3, 100, 1000); //PPR3 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 32int state4 = digitalNoiselessRead4(PPR4, 100, 1000); //PPR4 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 33int state5 = digitalNoiselessRead5(PPR5, 100, 1000); //PPR5 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 34//表示 35float t = (millis() - 30000) * 0.001; //loop開始からの経過秒 36Serial.print(t,1); 37Serial.print(" "); 38Serial.print(state1); 39Serial.print(" "); 40Serial.print(state2); 41Serial.print(" "); 42Serial.print(state3); 43Serial.print(" "); 44Serial.print(state4); 45Serial.print(" "); 46Serial.println(state5); 47//LED 48if (state5 == HIGH){//センサ5起動時 49//tone(buza_Pin, 988); 50digitalWrite(12, HIGH); 51digitalWrite(11, LOW); 52digitalWrite(10, LOW); //LED白 53}else if(state1 == HIGH || state2 == HIGH){//センサ1か2起動時 54noTone(buza_Pin); 55digitalWrite(12, HIGH); 56digitalWrite(11, LOW); 57digitalWrite(10, HIGH); //LED黄 58}else if(state3 == HIGH || state4 == HIGH){//センサ3か4起動時 59// tone(buza_Pin, 988); 60digitalWrite(12, HIGH); 61digitalWrite(11, HIGH); 62digitalWrite(10, HIGH); //LED赤 63}else{//センサが反応しないとき 64noTone(buza_Pin); 65digitalWrite(12, LOW); 66digitalWrite(11, HIGH); 67digitalWrite(10, LOW); //LED青 68} 69delay(100);//0.1s待つ 70} 71 72int lastState = LOW; 73unsigned long risingEdgeTime = 0; 74int stage = 0; //0=初期, 1=監視期間, 2=HIGH期間 75 76// pin からの入力が, 立ち上がりから monitoringPeriod の間 HIGH になった場合のみ 77// highPeriod の間 強制的に HIGH を返す. 78// ( monitoringPeriod の間は LOW を返す. ) 79// パラメータ: 80// pin ピン番号 81// monitoringPeriod 監視期間[ms] 82// highPeriod HIGH期間[ms] 83// 返り値: 84// HIGH または LOW 85int digitalNoiselessRead1(int pin1, long monitoringPeriod, long highPeriod) { 86 87int state1 = digitalRead(pin1); 88unsigned long now = millis(); 89if(stage == 0 && lastState == LOW && state1 == HIGH) { //立ち上がり検出 90risingEdgeTime = now; 91stage = 1; //監視期間開始 92} 93lastState = state1; 94 95if(stage == 1) { //監視期間中 96if(state1 == LOW) { //ノイズだった 97stage = 0; 98} else if(now-risingEdgeTime >= monitoringPeriod) { 99stage = 2; //HIGH 期間へ移行 100} else { 101state1 = LOW; //監視期間中は LOW 102} 103} else if(stage == 2) { //HIGH期間中 104if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 105state1 = HIGH; //HIGH期間中は HIGH 106} else { 107stage = 0; //HIGH期間終了 108} 109} 110return state1; 111} 112 113int digitalNoiselessRead2(int pin, long monitoringPeriod, long highPeriod) { 114 115int state2 = digitalRead(pin); 116unsigned long now = millis(); 117if(stage == 0 && lastState == LOW && state2 == HIGH) { //立ち上がり検出 118risingEdgeTime = now; 119stage = 1; //監視期間開始 120} 121lastState = state2; 122 123if(stage == 1) { //監視期間中 124if(state2 == LOW) { //ノイズだった 125stage = 0; 126} else if(now-risingEdgeTime >= monitoringPeriod) { 127stage = 2; //HIGH 期間へ移行 128} else { 129state2 = LOW; //監視期間中は LOW 130} 131} else if(stage == 2) { //HIGH期間中 132if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 133state2 = HIGH; //HIGH期間中は HIGH 134} else { 135stage = 0; //HIGH期間終了 136} 137} 138return state2; 139} 140 141int digitalNoiselessRead3(int pin, long monitoringPeriod, long highPeriod) { 142 143int state3 = digitalRead(pin); 144unsigned long now = millis(); 145if(stage == 0 && lastState == LOW && state3 == HIGH) { //立ち上がり検出 146risingEdgeTime = now; 147stage = 1; //監視期間開始 148} 149lastState = state3; 150 151if(stage == 1) { //監視期間中 152if(state3 == LOW) { //ノイズだった 153stage = 0; 154} else if(now-risingEdgeTime >= monitoringPeriod) { 155stage = 2; //HIGH 期間へ移行 156} else { 157state3 = LOW; //監視期間中は LOW 158} 159} else if(stage == 2) { //HIGH期間中 160if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 161state3 = HIGH; //HIGH期間中は HIGH 162} else { 163stage = 0; //HIGH期間終了 164} 165} 166return state3; 167} 168 169int digitalNoiselessRead4(int pin, long monitoringPeriod, long highPeriod) { 170 171int state4 = digitalRead(pin); 172unsigned long now = millis(); 173if(stage == 0 && lastState == LOW && state4 == HIGH) { //立ち上がり検出 174risingEdgeTime = now; 175stage = 1; //監視期間開始 176} 177lastState = state4; 178 179if(stage == 1) { //監視期間中 180if(state4 == LOW) { //ノイズだった 181stage = 0; 182} else if(now-risingEdgeTime >= monitoringPeriod) { 183stage = 2; //HIGH 期間へ移行 184} else { 185state4 = LOW; //監視期間中は LOW 186} 187} else if(stage == 2) { //HIGH期間中 188if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 189state4 = HIGH; //HIGH期間中は HIGH 190} else { 191stage = 0; //HIGH期間終了 192} 193} 194return state4; 195} 196 197int digitalNoiselessRead5(int pin, long monitoringPeriod, long highPeriod) { 198 199int state5 = digitalRead(pin); 200unsigned long now = millis(); 201if(stage == 0 && lastState == LOW && state5 == HIGH) { //立ち上がり検出 202risingEdgeTime = now; 203stage = 1; //監視期間開始 204} 205lastState = state5; 206 207if(stage == 1) { //監視期間中 208if(state5 == LOW) { //ノイズだった 209stage = 0; 210} else if(now-risingEdgeTime >= monitoringPeriod) { 211stage = 2; //HIGH 期間へ移行 212} else { 213state5 = LOW; //監視期間中は LOW 214} 215} else if(stage == 2) { //HIGH期間中 216if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 217state5 = HIGH; //HIGH期間中は HIGH 218} else { 219stage = 0; //HIGH期間終了 220} 221} 222return state5; 223}
回答1件
あなたの回答
tips
プレビュー