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