2019-09-25 09:59:07 C++

- 25行目 好みの問題かもですが、これだと最初0だったkが1から始まってしまうので29行目よ

Copy Copied! Full
const int humanSensor = 2; const int trigPin = 3; // Trigger Pin const int echoPin = 4; //Echo Pin const int ledPin = 13; int k = 0; int int_arr[60] = {}; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(trigPin, OUTPUT); pinMode(humanSensor, INPUT_PULLUP); // Inputモードでプルアップ抵抗を有効に } void loop(){ delay(1000); bool humanSensorState = readHumanSensor(); double distance = readDistanceSensor(); bool gyouretsuMode = readGyouretsuMode(humanSensorState, distance); k ++; int h = 0; if (humanSensorState){h = 1;} int_arr[k % 60] = h; int i; int sum=0; for(i=0; i<=59; i++){ sum=sum+int_arr[i];} double average = sum /60; // 60個(=1分間)のhumanSensorStateを平均化 bool superhs = average >= 0.8; // 0.8以上なら人感センサーは通行人ではなく行列に反応 Serial.print("L: "); Serial.print(gyouretsuMode); Serial.print("\tD: "); Serial.println(distance); } bool readHumanSensor() { bool state = !digitalRead(humanSensor); digitalWrite(ledPin, state == HIGH); // 人が感知されている時、ピンの値はLOW return state; } double readDistanceSensor() { digitalWrite(trigPin, LOW); delayMicroseconds(2000000); digitalWrite( trigPin, HIGH ); //超音波を出力 delayMicroseconds( 100000000 ); // digitalWrite( trigPin, LOW ); double duration = pulseIn( echoPin, HIGH ); //センサからの入力 double distance = 0; if (duration > 0 && duration < 24000) { distance = duration / 29 / 2; } return distance; } bool readGyouretsuMode(bool superhs, double distance) { bool gyouretsu = superhs || (distance > 0 && distance < 300); return gyouretsu; }
- 25行目
   好みの問題かもですが、これだと最初0だったkが1から始まってしまうので29行目より後に持ってくる方がいいです
- 26-29行目
  ここはbool型をint型に変換すれば0と1になります。 `int_arr[k % 60] = (int)humanSensorState;`
- 31, 33行目
  最近のCやC++では、インデックスを外で宣言せずに `for (int i=0;...` のように書けます
- 35行目
式の右側がどちらも整数なので、小数以下が消えてしまってそうです。型変換して `(double)sum / 60;`なら大丈夫
RECOMMEND