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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

1849閲覧

Arduinoでデジタルセンサで値を取得した入力に対して、閾値内に出力がHIGHならその閾値内の出力をすべてHIGHにするプログラムを書きたい

777333555

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/18 03:05

Arduinoでデジタルセンサで値を取得した入力に対して、閾値内に出力がHIGHならその閾値内の出力をすべてHIGHにするプログラムを書きたい

arduinoでデジタル式のモーションセンサの作動を行っています。しかし、このセンサだと人がセンサの計測範囲内にいる場合でも人が動かなければセンサの値がLOWになってしまいます。そこで、配列を用いたプログラムを書きましたが、いまいち改善はしていない状況です。どのようにしたらよろしいでしょうか。

該当のソースコード

define PPR1 3
float time;
int ss[5][5];

void setup() {
pinMode(PPR1, INPUT);
Serial.begin(9600);
while (!Serial);
Serial.println ("センサが安定するまで少々お待ちください(30s)");
delay(30000);
}

void loop() {
int i;
int State1 = digitalRead(PPR1);
ss[5][5] = State1;
for(i=0;i<NULL;i++){
if(ss[i][i]==HIGH&&ss[i+8][i+9]==HIGH){
ss[i][i+1]==HIGH;
ss[i+1][i+2]==HIGH;
ss[i+2][i+3]==HIGH;
ss[i+3][i+4]==HIGH;
ss[i+4][i+5]==HIGH;
ss[i+5][i+6]==HIGH;
ss[i+6][i+7]==HIGH;
ss[i+7][i+8]==HIGH;
}
}

time = (millis() - 30000) * 0.001;

Serial.print(time, 1);
Serial.print(" ");
Serial.print(ss[5][5]);
Serial.println(" ");
}

試したこと

配列を用いてセンサ値を配列に格納し、条件文によって一つ目と10つ目の値に反応が見られたらその間のセンサ値をすべて反応している状態にするプログラムを書きました。

補足情報(FW/ツールのバージョンなど)

配列を使う方法でも構わないです。またチャタリングの原因もあるかと思いますのでそちらの改善方法も教えていただきたいです。よろしくお願いいたします。

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

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

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

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

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

jimbe

2021/08/18 06:11

arduino 特有の表現なのか分からないのですが、「閾値内に出力がHIGHならその閾値内の出力をすべてHIGHにする」の閾値内とは何のことでしょう。
guest

回答3

0

ベストアンサー

arduino をやったことが無いので、見つけたリファレンスを見ながら試しに書いてみました。
本当に書いただけでコンパイルも試していないのでエラーが多いかもしれません。スミマセン。
というか仕様が合っているのかさえ分からないのですが…。
setup 等は省略です。

c

1void loop() { 2 int state1 = digitalNoiselessRead(PPR1, 100, 5000); //PPR1 ピンが 0.1秒間 HIGH になっていたら,その後 5秒間 HIGH が返る 3 4 //表示 5 float t = (millis() - 30000) * 0.001; //loop開始からの経過秒 6 Serial.print(t,1); 7 Serial.print(" "); 8 Serial.println(state1); 9} 10 11int lastState = LOW; 12unsigned long risingEdgeTime = 0; 13int stage = 0; //0=初期, 1=監視期間, 2=HIGH期間 14 15// pin からの入力が, 立ち上がりから monitoringPeriod の間 HIGH になった場合のみ 16// highPeriod の間 強制的に HIGH を返す. 17// ( monitoringPeriod の間は LOW を返す. ) 18// パラメータ: 19// pin ピン番号 20// monitoringPeriod 監視期間[ms] 21// highPeriod HIGH期間[ms] 22// 返り値: 23// HIGH または LOW 24int digitalNoiselessRead(int pin, long monitoringPeriod, long highPeriod) { 25 26 int state = digitalRead(pin); 27 unsigned long now = millis(); 28 if(stage == 0 && lastState == LOW && state == HIGH) { //立ち上がり検出 29 risingEdgeTime = now; 30 stage = 1; //監視期間開始 31 } 32 lastState = state; 33 34 if(stage == 1) { //監視期間中 35 if(state == LOW) { //ノイズだった 36 stage = 0; 37 } else if(now-risingEdgeTime >= monitoringPeriod) { 38 stage = 2; //HIGH 期間へ移行 39 } else { 40 state = LOW; //監視期間中は LOW 41 } 42 } else if(stage == 2) { //HIGH期間中 43 if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 44 state = HIGH; //HIGH期間中は HIGH 45 } else { 46 stage = 0; //HIGH期間終了 47 } 48 } 49 return state; 50}

投稿2021/08/18 12:15

編集2021/08/18 12:29
jimbe

総合スコア13209

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

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

0

ソースを見るだけだと、具体的にどう処理しようとしてるのか見えてきません。
何をどうしたいコードなのか、コメントをつけてくださいね。
少なくとも、二次元配列ssの各行、各列がどういう意味になっているのか、for文の中身では何をどうしようとしているのか、その辺りのコメントが必要です。

あと、編集時にエディタのメニューに <code> があると思います。それを使って、コードを見やすいようにしてください。インデント等が消えているので大変に読みづらいです。

  • ssがセンサで得た情報なのかな?
  • ss[5][5] (<-これ範囲外じゃない?)にStateを代入することで配列内に全データ入れたことにしている?
  • for (i=0;i<NULL;i++){ <- 回らなくない?
  • if(ss[i][i]==HIGH&&ss[i+8][i+9]==HIGH){ これ、iが>=0でないと前半部で領域外参照、i<=-4でないと後半部で領域外参照してない?
  • ss[i][i+1]==HIGH; y_waiwaiさんの指摘通り

投稿2021/08/18 05:33

編集2021/08/18 09:25
WoodenHamlet

総合スコア306

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

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

WoodenHamlet

2021/08/18 07:11

チャタリングを考慮するなら、例えばハイアクティブのセンサなら、「**msのあいだHIGHを連続して検出したときをHIGHとする。それまではローとして扱う」みたいな処理が考えられますね
guest

0

ss[i][i+1]==HIGH;

これ、比較してるだけで代入してません

#=ひとつにしよう

投稿2021/08/18 03:10

y_waiwai

総合スコア88042

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

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

777333555

2021/08/18 03:18

ご回答、ありがとうございます。できれば閾値を指定するために時間間隔を指定してその時間間隔内にセンサの出力がHIGHになれば一定時間出力をHIGHにしたいです。配列使わなくてもできるならそちらのほうがありがたいのですが、やり方が分かりません。教えていたでけないでしょうか。
y_waiwai

2021/08/18 03:23

うーん、教えるより前に、C言語の基本的な文法をしっかりマスターしよう。 コードがむちゃむちゃですよ。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問