arduinoを使用しnapion10m用のセンサと5m用のセンサと7m用のセンサの反応時間の変化からヒトの歩行速度を求めるプログラムを書いていますがブザーが鳴っていない状況です。もし改善点などが分かる方がいましたらアドバイスください。よろしくお願いします。
arduino
1#include <fastio.h> 2#include <MsTimer2.h> 3fastIoPin<3>PPR1; 4fastIoPin<4>PPR2; 5fastIoPin<5>PPR3; 6fastIoPin<6>PPR4; 7fastIoPin<7>PPR5; 8fastIoPin<10>LED_BLUE; 9fastIoPin<11>LED_GREEN; 10fastIoPin<12>LED_RED; 11#define buza 13 12unsigned int state1 = 0; 13unsigned int state2 = 0; 14unsigned int state3 = 0; 15unsigned int state4 = 0; 16unsigned int state5 = 0; 17float time_data = 0.0; 18void time_count(void); 19unsigned int lastState1 = LOW; 20unsigned int lastState2 = LOW; 21unsigned int lastState3 = LOW; 22unsigned int lastState4 = LOW; 23unsigned int lastState5 = LOW; 24unsigned long risingEdgeTime1 = 0; 25unsigned long risingEdgeTime2 = 0; 26unsigned long risingEdgeTime3 = 0; 27unsigned long risingEdgeTime4 = 0; 28unsigned long risingEdgeTime5 = 0; 29unsigned int stage1 = 0; //0=初期, 1=監視期間, 2=HIGH期間 30unsigned int stage2 = 0; //0=初期, 1=監視期間, 2=HIGH期間 31unsigned int stage3 = 0; //0=初期, 1=監視期間, 2=HIGH期間 32unsigned int stage4 = 0; //0=初期, 1=監視期間, 2=HIGH期間 33unsigned int stage5 = 0; //0=初期, 1=監視期間, 2=HIGH期間 34 35void setup() { 36 MsTimer2::set(10, value_count);//10ミリ秒ごとにtime_count関数を呼出 37 PPR1.pinMode(INPUT); 38 PPR2.pinMode(INPUT); 39 PPR3.pinMode(INPUT); 40 PPR4.pinMode(INPUT); 41 PPR5.pinMode(INPUT); 42 LED_BLUE.pinMode(OUTPUT); 43 LED_GREEN.pinMode(OUTPUT); 44 LED_RED.pinMode(OUTPUT); 45 pinMode(buza,OUTPUT); 46 Serial.begin(9600); 47 while (!Serial); 48 Serial.println ("センサが安定するまで少々お待ちください(30s)");//センサ安定起動時間 49 delay(30000); 50 MsTimer2::start(); 51} 52 53void value_count(void) { 54 state1 = digitalNoiselessRead1(3, 10, 3000); //PPR1 ピンが 0.01秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 55 state2 = digitalNoiselessRead2(4, 10, 3000); //PPR2 ピンが 0.01秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 56 state3 = digitalNoiselessRead3(5, 20, 3000); //PPR3 ピンが 0.02秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 57 state4 = digitalNoiselessRead4(6, 20, 3000); //PPR4 ピンが 0.02秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 58 state5 = digitalNoiselessRead5(7, 20, 3000); //PPR5 ピンが 0.1秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 59 float t = (millis() - 30000) * 0.001; //loop開始からの経過秒 60 Serial.print(t, 2); 61 Serial.print(" "); 62 Serial.print(state1); 63 Serial.print(" "); 64 Serial.print(state2); 65 Serial.print(" "); 66 Serial.print(state3); 67 Serial.print(" "); 68 Serial.print(state4); 69 Serial.print(" "); 70 Serial.println(state5); 71} 72 73unsigned int digitalNoiselessRead1(unsigned int pin1, long monitoringPeriod1, long highPeriod1) { 74 state1 = PPR1.digitalRead(); 75 unsigned long now = millis(); 76 if (stage1 == 0 && lastState1 == LOW && state1 == HIGH) { //立ち上がり検出 77 risingEdgeTime1 = now; 78 stage1 = 1; //監視期間開始 79 } 80 lastState1 = state1; 81 if (stage1 == 1) { //監視期間中 82 if (state1 == LOW) { //ノイズだった 83 stage1 = 0; 84 } else if (now - risingEdgeTime1 >= monitoringPeriod1) { 85 stage1 = 2; //HIGH 期間へ移行 86 } else { 87 state1 = LOW; //監視期間中は LOW 88 } 89 } else if (stage1 == 2) { //HIGH期間中 90 if (now - risingEdgeTime1 <= monitoringPeriod1 + highPeriod1) { 91 state1 = HIGH; //HIGH期間中は HIGH 92 } else { 93 stage1 = 0; //HIGH期間終了 94 } 95 } 96 return state1; 97} 98 99unsigned int digitalNoiselessRead2(unsigned int pin2, long monitoringPeriod2, long highPeriod2) { 100 state2 = PPR2.digitalRead(); 101 unsigned long now = millis(); 102 if (stage2 == 0 && lastState2 == LOW && state2 == HIGH) { //立ち上がり検出 103 risingEdgeTime2 = now; 104 stage2 = 1; //監視期間開始 105 } 106 lastState2 = state2; 107 108 if (stage2 == 1) { //監視期間中 109 if (state2 == LOW) { //ノイズだった 110 stage2 = 0; 111 } else if (now - risingEdgeTime2 >= monitoringPeriod2) { 112 stage2 = 2; //HIGH 期間へ移行 113 } else { 114 state2 = LOW; //監視期間中は LOW 115 } 116 } else if (stage2 == 2) { //HIGH期間中 117 if (now - risingEdgeTime2 <= monitoringPeriod2 + highPeriod2) { 118 state2 = HIGH; //HIGH期間中は HIGH 119 } else { 120 stage2 = 0; //HIGH期間終了 121 } 122 } 123 return state2; 124} 125 126unsigned int digitalNoiselessRead3(unsigned int pin3, long monitoringPeriod3, long highPeriod3) { 127 state3 = PPR3.digitalRead(); 128 unsigned long now = millis(); 129 if (stage3 == 0 && lastState3 == LOW && state3 == HIGH) { //立ち上がり検出 130 risingEdgeTime3 = now; 131 stage3 = 1; //監視期間開始 132 } 133 lastState3 = state3; 134 135 if (stage3 == 1) { //監視期間中 136 if (state3 == LOW) { //ノイズだった 137 stage3 = 0; 138 } else if (now - risingEdgeTime3 >= monitoringPeriod3) { 139 stage3 = 2; //HIGH 期間へ移行 140 } else { 141 state3 = LOW; //監視期間中は LOW 142 } 143 } else if (stage3 == 2) { //HIGH期間中 144 if (now - risingEdgeTime3 <= monitoringPeriod3 + highPeriod3) { 145 state3 = HIGH; //HIGH期間中は HIGH 146 } else { 147 stage3 = 0; //HIGH期間終了 148 } 149 } 150 return state3; 151} 152 153unsigned int digitalNoiselessRead4(unsigned int pin4, long monitoringPeriod4, long highPeriod4) { 154 state4 = PPR4.digitalRead(); 155 unsigned long now = millis(); 156 if (stage4 == 0 && lastState4 == LOW && state4 == HIGH) { //立ち上がり検出 157 risingEdgeTime4 = now; 158 stage4 = 1; //監視期間開始 159 } 160 lastState4 = state4; 161 162 if (stage4 == 1) { //監視期間中 163 if (state4 == LOW) { //ノイズだった 164 stage4 = 0; 165 } else if (now - risingEdgeTime4 >= monitoringPeriod4) { 166 stage4 = 2; //HIGH 期間へ移行 167 } else { 168 state4 = LOW; //監視期間中は LOW 169 } 170 } else if (stage4 == 2) { //HIGH期間中 171 if (now - risingEdgeTime4 <= monitoringPeriod4 + highPeriod4) { 172 state4 = HIGH; //HIGH期間中は HIGH 173 } else { 174 stage4 = 0; //HIGH期間終了 175 } 176 } 177 return state4; 178} 179 180unsigned int digitalNoiselessRead5(unsigned int pin5, long monitoringPeriod5, long highPeriod5) { 181 state5 = PPR5.digitalRead(); 182 unsigned long now = millis(); 183 if (stage5 == 0 && lastState5 == LOW && state5 == HIGH) { //立ち上がり検出 184 risingEdgeTime5 = now; 185 stage5 = 1; //監視期間開始 186 } 187 lastState5 = state5; 188 189 if (stage5 == 1) { //監視期間中 190 if (state5 == LOW) { //ノイズだった 191 stage5 = 0; 192 } else if (now - risingEdgeTime5 >= monitoringPeriod5) { 193 stage5 = 2; //HIGH 期間へ移行 194 } else { 195 state5 = LOW; //監視期間中は LOW 196 } 197 } else if (stage5 == 2) { //HIGH期間中 198 if (now - risingEdgeTime5 <= monitoringPeriod5 + highPeriod5) { 199 state5 = HIGH; //HIGH期間中は HIGH 200 } else { 201 stage5 = 0; //HIGH期間終了 202 } 203 } 204 return state5; 205} 206 207void loop() { 208 if (state1 == LOW && state2 == LOW && state3 == LOW && state4 == LOW && state5 == LOW) { //青 00000 209 LED_RED.digitalWrite(LOW); 210 LED_GREEN.digitalWrite(HIGH); 211 LED_BLUE.digitalWrite(LOW); //青 212 } 213 else if (state1 == HIGH && state2 == HIGH && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色11000 214 LED_RED.digitalWrite(HIGH); 215 LED_GREEN.digitalWrite(LOW); 216 LED_BLUE.digitalWrite(HIGH); //黄 217 } 218 else if (state1 == HIGH && state2 == LOW && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色 10000 219 LED_RED.digitalWrite(HIGH); 220 LED_GREEN.digitalWrite(LOW); 221 LED_BLUE.digitalWrite(HIGH); //黄 222 } 223 else if (state1 == LOW && state2 == HIGH && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色 01000 224 LED_RED.digitalWrite(HIGH); 225 LED_GREEN.digitalWrite(LOW); 226 LED_BLUE.digitalWrite(HIGH); //黄 227 } 228 else if (state1 == HIGH && state2 == HIGH && state3 == HIGH && state4 == HIGH && state5 == LOW) {//5m以内赤 11110 229 digitalWrite<13>(HIGH); 230 LED_RED.digitalWrite(HIGH); 231 LED_GREEN.digitalWrite(HIGH); 232 LED_BLUE.digitalWrite(HIGH); //赤 233 } 234 //その他点灯方法記載の省略 235} 236 237 238
あなた以外の人が同じシステムを組んで検証する可能性は殆どないのだから、あなたが現状の情報を提供しなきゃ。
ブザーが鳴らない
それはわかったけど「何をした時に」鳴らない? そもそも単純にブザーを鳴らすプログラムなら鳴ることは確認されている?
ほかには?
LEDもつないでいるみたいだけどその点灯状況は?
printなんかも仕込んでいるみたいだけれど、それらが「こういう入力の時に、こういう反応を示す」とかいう情報はないのかしら?
同じシステムを持っていない他人にデバッグさせようというのだから、持っている情報は全部出してください。
回答2件
あなたの回答
tips
プレビュー