シリアルポート出力について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
norisu
記事: 6
登録日時: 4ヶ月前

シリアルポート出力について

#1

投稿記事 by norisu » 4ヶ月前

arduinoを使用して光センサで読み取った値でWORKING・STOPを表示させたいと考えております。
入力された値が900以上であればWORKING
900以下であればSTOP
を表示させ、LOGデータを取りたいと考えており、表示だけはできたのですが、
Logデータがすぐいっぱいになってしまい、困っております。

WORKING状態が続いていれば、STOPの状態になるまで出力をしないようにできないでしょうか??
同じ出力が続く際に同条件であれば出力しない等の方法があればご教示頂けたら幸いです。

下記コードを何とか編集出来たらと考えております。
よろしくお願いいたします。

コード:

int val=0; //入力される値を格納する為の変数
void setup() {
Serial.begin(9600); //モニターに出力するための設定
}
void loop() {
//ANALOG INの0番ピンからデータを受け付ける


{
  val=analogRead(0);
  if(val>900){

Serial.print("初号機");
Serial.println("WORKING"); //入力された値をモニターに出力
  }
  else if(val<899){
Serial.print("初号機");
Serial.println("STOP"); //入力された値をモニターに出力
  }
delay(1000);
}

{
val=analogRead(1);
Serial.print("二号機]");
Serial.println(val/1); //入力された値をモニターに出力

delay(1000);
}
}

アバター
あたっしゅ
記事: 242
登録日時: 8年前
住所: 東京23区
連絡を取る:

Re: シリアルポート出力について

#2

投稿記事 by あたっしゅ » 4ヶ月前

コード:

int val=0; //入力される値を格納する為の変数
int flg = -1; 

void setup() {
  Serial.begin(9600); //モニターに出力するための設定
}

void loop() {
  {
    //ANALOG INの0番ピンからデータを受け付ける
    val=analogRead(0);

    if(val>900){
      Serial.print("初号機");

      if( flg != 0 ) {
        Serial.println("WORKING"); //入力された値をモニターに出力
        flg = 0;
      }
    } else if(val<899) {
      Serial.print("初号機");

      if( flg != 1 ) {
        Serial.println("STOP"); //入力された値をモニターに出力
        flg = 1;
      }
    }
    delay(1000);
  }

  {
    val=analogRead(1);
    Serial.print("二号機");
    Serial.println(val/1); //入力された値をモニターに出力

    delay(1000);
  }
}
flg 変数を追加してみました。こんな感じでどうでしょう。
手提鞄あたっしゅ、[MrAtassyu] http://atassyu.rosx.net/
2019(R01)-08-11(日・祝) コミックマーケット C96 日 西さ34a 手提鞄屋魚有店(てさげかばんやうおありてん)

norisu
記事: 6
登録日時: 4ヶ月前

Re: シリアルポート出力について

#3

投稿記事 by norisu » 4ヶ月前

お世話になります。
すみません。
flg立ててもdelayの度に出力されてしまいます…。
丸投げするつもりは無いのですがなんとかお力を拝借出来ないでしょうか…。

かずま

Re: シリアルポート出力について

#4

投稿記事 by かずま » 4ヶ月前

norisu さんが書きました:
4ヶ月前
arduinoを使用して光センサで読み取った値でWORKING・STOPを表示させたいと考えております。
入力された値が900以上であればWORKING
900以下であればSTOP
を表示させ、LOGデータを取りたいと考えており、表示だけはできたのですが、
900 の場合 WORKING も STOP も表示するんですか?
プログラムを見ると、900より大きい、すなわち 901以上で WORKING、
899より小さい、すなわち 898以下で STOP を表示するようになっています。
900 と 899 の場合、WORKING も STOP も表示しません。

また、整数値を 1 で割っても元の値のままなのに
val/1 としているのはなぜですか?

そこで問題を次のように改変したコード(C++)の例を示します。

・ANALOG IN の 0番ピンと 1番ピンから 0~999 の値が入力される
・0番ピンの値が 900以上の時、working状態でないなら、
 WORKING を表示し、内部状態を working にする。
・0番ピンの値が 900未満の時、working状態なら、
 STOP を表示し、内部状態を workingでないようにする。
・working状態なら、1番ピンの入力値を表示する。

コード:

#include <stdio.h>    // printf, puts, sprintf
#include <stdlib.h>   // rand

struct {
	void begin(int n) { }
	void print(const char *s) { printf("%s", s); }
	void println(const char *s) { puts(s); }
	void println(int val) {
		char buf[16];
		sprintf(buf, "%d", val);
		puts(buf);
	}
} Serial;

int analogRead(int i) { return rand() % 1000; }

void delay(int t) { }

void setup() { Serial.begin(9600); }

void loop()
{
	static bool working = false;
	int val = 0;
	val = analogRead(0);
	if (val >= 900) {
		if (!working) {
			Serial.print("初号機");
			Serial.println("WORKING");
			working = true;
		}
	} else {
		if (working) {
			Serial.print("初号機");
			Serial.println("STOP");
			working = false;
		}
	}
	delay(1000);
	if (working) {
		val = analogRead(1);
		Serial.print("二号機]");
		Serial.println(val);	//入力された値をモニターに出力
		delay(1000);
	}
}

int main()
{
	for (int i = 0; i < 100; i++) loop();
}

norisu
記事: 6
登録日時: 4ヶ月前

Re: シリアルポート出力について

#5

投稿記事 by norisu » 4ヶ月前

お世話になっております。

色々ありがとうございます。

トライしているのですが、
anonymous struct
の、エラーや

コンパイルできても確認すると、
シリアルモニタにバグった文字が出てくるばかりで…
⸮5]⸮Γ⸮㭌Η⸮⸮⸮⸮T⸮⸮ͅ⸮⸮c⸮
qm⸮Փ⸮{⸮⸮⸮⸮⸮⸮⸮⸮=⸮ь⸮⸮4ޮ7⸮}⸮ӌ⸮⸮⸮⸮⸮⸮P⸮⸮⸮⸮⸮]⸮⸮

かずま

Re: シリアルポート出力について

#6

投稿記事 by かずま » 4ヶ月前

norisu さんが書きました:
4ヶ月前
anonymous struct
の、エラーや
anonymous struct (匿名構造体) がエラーになるのなら、
struct T { ... } Serial; とでもすればよいのです。
でも、この構造体は、Visual C++ や gcc でコンパイル
できるように私が独自に用意したもので、
aruduino の開発環境があれば要らないのでしょう。

それから、関数 delay も不要でしょう。
norisu さんが書きました:
4ヶ月前
コンパイルできても確認すると、
どのようにして、コンパイルできるようにしたのかわかるように書いてください。
norisu さんが書きました:
4ヶ月前
シリアルモニタにバグった文字が出てくるばかりで…
Serial.println() は文字列だけでなく int の値も表示できるのでしょうか?

Serial.println(val); を次のように変えてみたらどうなりますか?

コード:

	char buf[16];
	sprintf(buf, "%d", val);
	Serial.println(buf);
質問するばかりでなく、900 や 899 の問題など
こちらの質問にもちゃんと答えてください。

norisu
記事: 6
登録日時: 4ヶ月前

Re: シリアルポート出力について

#7

投稿記事 by norisu » 4ヶ月前

お世話になります。

struct { ... } Serial;
のSerial;を削除するとコンパイルは出来るようになります。

Serial.println() は文字列だけでなく int の値も表示できるのでしょうか?
Serial.println() で、値も表示できます。

値の問題ですが、900以上で"WORKING"
899以下で"STOP"とするつもりです。
analogreadから入力する値は暗ければ0近くとなり、
明るければ1100程度の値となります。差がはっきりとしているので深く考えておりませんでした。

よろしくお願いいたします。

norisu
記事: 6
登録日時: 4ヶ月前

Re: シリアルポート出力について

#8

投稿記事 by norisu » 4ヶ月前

何とかなりました。
大変ありがとうございます。

かずま

Re: シリアルポート出力について

#9

投稿記事 by かずま » 4ヶ月前

norisu さんが書きました:
4ヶ月前
何とかなりました。
大変ありがとうございます。
どこが悪かったのか、
どのように修正したのかを書いてください。

norisu
記事: 6
登録日時: 4ヶ月前

Re: シリアルポート出力について

#10

投稿記事 by norisu » 3ヶ月前

if(val>900){
Serial.print("初号機");

の部分を

if(val>900){
Serial.print("");

フラグを立てる前のSerial.printを削除することで何とかなりました。

"

コード:

"
int val=0; //入力される値を格納する為の変数
int flg = -1; 

void setup() {
  Serial.begin(9600); //モニターに出力するための設定
}

void loop() {
  {
    //ANALOG INの0番ピンからデータを受け付ける
    val=analogRead(0);

    if(val>900){
      Serial.print("");

      if( flg != 0 ) {
        Serial.println("WORKING"); //入力された値をモニターに出力
        flg = 0;
      }
    } else if(val<899) {
      Serial.print("初号機");

      if( flg != 1 ) {
        Serial.println("STOP"); //入力された値をモニターに出力
        flg = 1;
      }
    }
    delay(1000);
  }

  {
    val=analogRead(1);
    Serial.print("二号機");
    Serial.println(val/1); //入力された値をモニターに出力

    delay(1000);
  }
}

"
"

返信

“C言語何でも質問掲示板” へ戻る