質問: Serial.read(); //0~255 } } ``` おそらくこうすれば解決できると考えています. 1. 1個前の値を比較する(new - old) 2. 正だった場合digitalWriteでLOWをHIGHに.負であればHIGHをLOWにという処理を1回おこない,次に正負が逆転するまではなにもしない. 回答宜しくお願い致します.
回答: 以下のコードでどうでしょう。 動作はボード上のLEDで確認してます。 増加・減少の変化を判定するための考え方は(A1)にコメントとして記述しました。 ``` int oldDelta = 0; // 前回の差分(増加:正/減少:負) int oldValue = 0; // 前回の値 int sw = HIGH; void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); /* * 始めは増加・減少のどちらの方向か不明なので出力を決め打ちする。 */ digitalWrite(LED_BUILTIN, sw); } void loop() { if (Serial.available() > 0) { int value = Serial.read(); /* * (A1) * 前回の差分と、今回の差分の積を求めると、 * 同一方向に増減している場合、正×正、負×負となり必ず正となる。 * 差分の積が負となったら、増加・減少が切り替わった事になる。 * * 前回の差分の初期値は0なので、(oldDelta=0) × deltaとなり必ず0となる。 * また、今回の差分が0の場合も、olddelta * (delta=0)となり必ず0となる。 * 最初の変化や、増減が停止した場合は、HIGH/LOWの切り替えをしない。 */ int delta = oldValue - value; if ((oldDelta * delta) < 0) { sw = (sw == HIGH) ? LOW : HIGH; digitalWrite(LED_BUILTIN, sw); } /* * 差分に変化があった場合のみ前回の差分を更新する。 */ if (delta != 0) { oldDelta = delta; } oldValue = value; } } ```