ページ 1 / 1
シリアルポート出力について
Posted: 2019年4月10日(水) 22:24
by norisu
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);
}
}
Re: シリアルポート出力について
Posted: 2019年4月11日(木) 06:09
by あたっしゅ
コード:
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 変数を追加してみました。こんな感じでどうでしょう。
Re: シリアルポート出力について
Posted: 2019年4月11日(木) 12:37
by norisu
お世話になります。
すみません。
flg立ててもdelayの度に出力されてしまいます…。
丸投げするつもりは無いのですがなんとかお力を拝借出来ないでしょうか…。
Re: シリアルポート出力について
Posted: 2019年4月11日(木) 15:33
by かずま
norisu さんが書きました: ↑5年前
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();
}
Re: シリアルポート出力について
Posted: 2019年4月11日(木) 18:50
by norisu
お世話になっております。
色々ありがとうございます。
トライしているのですが、
anonymous struct
の、エラーや
コンパイルできても確認すると、
シリアルモニタにバグった文字が出てくるばかりで…
⸮5]⸮Γ⸮㭌Η⸮⸮⸮⸮T⸮⸮ͅ⸮⸮c⸮
qm⸮Փ⸮{⸮⸮⸮⸮⸮⸮⸮⸮=⸮ь⸮⸮4ޮ7⸮}⸮ӌ⸮⸮⸮⸮⸮⸮P⸮⸮⸮⸮⸮]⸮⸮
Re: シリアルポート出力について
Posted: 2019年4月11日(木) 19:41
by かずま
norisu さんが書きました: ↑5年前
anonymous struct
の、エラーや
anonymous struct (匿名構造体) がエラーになるのなら、
struct T { ... } Serial; とでもすればよいのです。
でも、この構造体は、Visual C++ や gcc でコンパイル
できるように私が独自に用意したもので、
aruduino の開発環境があれば要らないのでしょう。
それから、関数 delay も不要でしょう。
norisu さんが書きました: ↑5年前
コンパイルできても確認すると、
どのようにして、コンパイルできるようにしたのかわかるように書いてください。
norisu さんが書きました: ↑5年前
シリアルモニタにバグった文字が出てくるばかりで…
Serial.println() は文字列だけでなく int の値も表示できるのでしょうか?
Serial.println(val); を次のように変えてみたらどうなりますか?
コード:
char buf[16];
sprintf(buf, "%d", val);
Serial.println(buf);
質問するばかりでなく、900 や 899 の問題など
こちらの質問にもちゃんと答えてください。
Re: シリアルポート出力について
Posted: 2019年4月11日(木) 20:09
by norisu
お世話になります。
struct { ... } Serial;
のSerial;を削除するとコンパイルは出来るようになります。
Serial.println() は文字列だけでなく int の値も表示できるのでしょうか?
Serial.println() で、値も表示できます。
値の問題ですが、900以上で"WORKING"
899以下で"STOP"とするつもりです。
analogreadから入力する値は暗ければ0近くとなり、
明るければ1100程度の値となります。差がはっきりとしているので深く考えておりませんでした。
よろしくお願いいたします。
Re: シリアルポート出力について
Posted: 2019年4月11日(木) 23:13
by norisu
何とかなりました。
大変ありがとうございます。
Re: シリアルポート出力について
Posted: 2019年4月12日(金) 00:41
by かずま
norisu さんが書きました: ↑5年前
何とかなりました。
大変ありがとうございます。
どこが悪かったのか、
どのように修正したのかを書いてください。
Re: シリアルポート出力について
Posted: 2019年4月24日(水) 23:11
by norisu
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);
}
}
"
"