質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

0回答

1326閲覧

arduinoでセンサを複数使用し、閾値を時間間隔で設定しその閾値内でセンサが反応したらその閾値内のセンサ値をすべて反応したことにするプログラムが書きたい

777333555

総合スコア4

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/08/26 13:55

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;
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/08/26 14:00

センサを反応させるとは? ちと意味不明です で、 このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
777333555

2021/08/26 14:12

投稿しなおします。よろしくお願いいたします。
thkana

2021/08/27 06:28

編集できるので「投稿しなおす」必要はありませんが、少なくともタイトルは「問題点」も明確に表すようにしてください。
nac_tnk

2021/08/28 16:58

> 閾値を時間間隔で設定しその閾値内でセンサが反応したらその閾値内のセンサ値をすべて反応したことにするプログラムを書いてみたのですが、実行するとセンサ1(state1)が反応したらセンサ1だけでなくすべてのセンサがHIGHになってしまいます。 質問文の意味が判りません。 自分で読んで判るのでしょうか? 私が読むと すべてを反応したことにするプログラムなのだから、1つのセンサが反応したら全てのセンサがHIGHになる、というのは正しい動作なのでは? と思うのですけど。 > ほかのセンサはHIGHにならずセンサ値を反応させるには このあたりも、「センサ値を反応させる」とはいったい何を意味しているのでしょうか? センサ値が反応するかどうかはセンサ自体の機能でしょ? プログラム内にある変数ならその変数名を利用して説明してください。 現状、スケッチを見ても何をしたいのか?が見えてきません。(悪そうなところは何となく解るが) なので、どのようにしたいのか、充分な日本語の説明が必要です。何も知らない他人が理解できるように書いて下さい。 ※新たな投稿では無く、編集して書き直してください。 ゴミスレを作る事になります。
nac_tnk

2021/08/28 17:21

あぁ、このスレ自体、既にゴミスレなのですね。 削除依頼を出してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問