arduinoでセンサを複数使用し、閾値を時間間隔で設定しその閾値内でセンサが反応したらその閾値内のセンサ値をすべて反応したことにするプログラムを書いてみたのですが、実行するとセンサ1(state1)が反応したらセンサ1だけでなくすべてのセンサがHIGHになってしまいます。センサは5つ使っているのですが、例えば、センサ1だけが反応したときにほかのセンサはHIGHにならずセンサ値を反応させるにはどのようにすればできるでしょうか。また、センサ5が動かないのも気になっています。よろしくお願いします。
define PPR1 3 //センサpin番号
define PPR2 4
define PPR3 5
define PPR4 6
define PPR5 7
define buza_Pin 13 //ブザー
define LED_RED 12 //赤
define LED_GERRN 11 //緑
define LED_BLUE 10 //青
float time;
void setup() {
pinMode(PPR1, INPUT);
pinMode(PPR2, INPUT);
pinMode(PPR3, INPUT);
pinMode(PPR4, INPUT);
pinMode(PPR5, INPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600);
while (!Serial);
Serial.println ("センサが安定するまで少々お待ちください(30s)");//センサ安定起動時間
delay(30000);
}
void loop() {
int state1 = digitalNoiselessRead1(PPR1, 100, 1000); //PPR1 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る
int state2 = digitalNoiselessRead2(PPR2, 100, 1000); //PPR2 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る
int state3 = digitalNoiselessRead3(PPR3, 100, 1000); //PPR3 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る
int state4 = digitalNoiselessRead4(PPR4, 100, 1000); //PPR4 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る
int state5 = digitalNoiselessRead5(PPR5, 100, 1000); //PPR5 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る
//表示
float t = (millis() - 30000) * 0.001; //loop開始からの経過秒
Serial.print(t,1);
Serial.print(" ");
Serial.print(state1);
Serial.print(" ");
Serial.print(state2);
Serial.print(" ");
Serial.print(state3);
Serial.print(" ");
Serial.print(state4);
Serial.print(" ");
Serial.println(state5);
//LED
if (state5 == HIGH){//センサ5起動時
//tone(buza_Pin, 988);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, LOW); //LED白
}else if(state1 == HIGH || state2 == HIGH){//センサ1か2起動時
noTone(buza_Pin);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, HIGH); //LED黄
}else if(state3 == HIGH || state4 == HIGH){//センサ3か4起動時
// tone(buza_Pin, 988);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH); //LED赤
}else{//センサが反応しないとき
noTone(buza_Pin);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW); //LED青
}
delay(100);//0.1s待つ
}
int lastState = LOW;
unsigned long risingEdgeTime = 0;
int stage = 0; //0=初期, 1=監視期間, 2=HIGH期間
// pin からの入力が, 立ち上がりから monitoringPeriod の間 HIGH になった場合のみ
// highPeriod の間 強制的に HIGH を返す.
// ( monitoringPeriod の間は LOW を返す. )
// パラメータ:
// pin ピン番号
// monitoringPeriod 監視期間[ms]
// highPeriod HIGH期間[ms]
// 返り値:
// HIGH または LOW
int digitalNoiselessRead1(int pin1, long monitoringPeriod, long highPeriod) {
int state1 = digitalRead(pin1);
unsigned long now = millis();
if(stage == 0 && lastState == LOW && state1 == HIGH) { //立ち上がり検出
risingEdgeTime = now;
stage = 1; //監視期間開始
}
lastState = state1;
if(stage == 1) { //監視期間中
if(state1 == LOW) { //ノイズだった
stage = 0;
} else if(now-risingEdgeTime >= monitoringPeriod) {
stage = 2; //HIGH 期間へ移行
} else {
state1 = LOW; //監視期間中は LOW
}
} else if(stage == 2) { //HIGH期間中
if(now-risingEdgeTime <= monitoringPeriod+highPeriod) {
state1 = HIGH; //HIGH期間中は HIGH
} else {
stage = 0; //HIGH期間終了
}
}
return state1;
}
int digitalNoiselessRead2(int pin, long monitoringPeriod, long highPeriod) {
int state2 = digitalRead(pin);
unsigned long now = millis();
if(stage == 0 && lastState == LOW && state2 == HIGH) { //立ち上がり検出
risingEdgeTime = now;
stage = 1; //監視期間開始
}
lastState = state2;
if(stage == 1) { //監視期間中
if(state2 == LOW) { //ノイズだった
stage = 0;
} else if(now-risingEdgeTime >= monitoringPeriod) {
stage = 2; //HIGH 期間へ移行
} else {
state2 = LOW; //監視期間中は LOW
}
} else if(stage == 2) { //HIGH期間中
if(now-risingEdgeTime <= monitoringPeriod+highPeriod) {
state2 = HIGH; //HIGH期間中は HIGH
} else {
stage = 0; //HIGH期間終了
}
}
return state2;
}
int digitalNoiselessRead3(int pin, long monitoringPeriod, long highPeriod) {
int state3 = digitalRead(pin);
unsigned long now = millis();
if(stage == 0 && lastState == LOW && state3 == HIGH) { //立ち上がり検出
risingEdgeTime = now;
stage = 1; //監視期間開始
}
lastState = state3;
if(stage == 1) { //監視期間中
if(state3 == LOW) { //ノイズだった
stage = 0;
} else if(now-risingEdgeTime >= monitoringPeriod) {
stage = 2; //HIGH 期間へ移行
} else {
state3 = LOW; //監視期間中は LOW
}
} else if(stage == 2) { //HIGH期間中
if(now-risingEdgeTime <= monitoringPeriod+highPeriod) {
state3 = HIGH; //HIGH期間中は HIGH
} else {
stage = 0; //HIGH期間終了
}
}
return state3;
}
int digitalNoiselessRead4(int pin, long monitoringPeriod, long highPeriod) {
int state4 = digitalRead(pin);
unsigned long now = millis();
if(stage == 0 && lastState == LOW && state4 == HIGH) { //立ち上がり検出
risingEdgeTime = now;
stage = 1; //監視期間開始
}
lastState = state4;
if(stage == 1) { //監視期間中
if(state4 == LOW) { //ノイズだった
stage = 0;
} else if(now-risingEdgeTime >= monitoringPeriod) {
stage = 2; //HIGH 期間へ移行
} else {
state4 = LOW; //監視期間中は LOW
}
} else if(stage == 2) { //HIGH期間中
if(now-risingEdgeTime <= monitoringPeriod+highPeriod) {
state4 = HIGH; //HIGH期間中は HIGH
} else {
stage = 0; //HIGH期間終了
}
}
return state4;
}
int digitalNoiselessRead5(int pin, long monitoringPeriod, long highPeriod) {
int state5 = digitalRead(pin);
unsigned long now = millis();
if(stage == 0 && lastState == LOW && state5 == HIGH) { //立ち上がり検出
risingEdgeTime = now;
stage = 1; //監視期間開始
}
lastState = state5;
if(stage == 1) { //監視期間中
if(state5 == LOW) { //ノイズだった
stage = 0;
} else if(now-risingEdgeTime >= monitoringPeriod) {
stage = 2; //HIGH 期間へ移行
} else {
state5 = LOW; //監視期間中は LOW
}
} else if(stage == 2) { //HIGH期間中
if(now-risingEdgeTime <= monitoringPeriod+highPeriod) {
state5 = HIGH; //HIGH期間中は HIGH
} else {
stage = 0; //HIGH期間終了
}
}
return state5;
}
あなたの回答
tips
プレビュー