2

私はarduino unoで光、温度、湿度を測定しており、ループを毎分実行するようにプログラムしています。シリアルモニターで値を監視します。

ただし、コードを一度実行して値を取得し、値の1つが変化するまで待機または一時停止してから、これをシリアルモニターに出力するコードが必要です。

ループが実行されるのを 1 分も待つのではなく、センサーの変化をすぐに知りたいのです。これを行う方法はありますか?

ありがとう。

では、次のコードに if/else 関数を追加する必要がありますか?

int lightPin = A5;

int lightok = 9;

int lighthigh = 10;

  void setup()

{
  Serial.begin(9600);
  pinMode(lightok,OUTPUT);
  pinMode(lighthigh,OUTPUT);
}

    void loop()
{
delay(600000);

   int lightlevel = analogRead(lightPin);

   lightlevel = map(lightlevel, 0, 1023, 0, 255);

   lightlevel = constrain(lightlevel, 0, 255);


   Serial.print("Lightlevel: ");

   Serial.println(lightlevel);

   //led control for light levels

   if (lightlevel < 15 || lightlevel > 125) {

       digitalWrite(lighthigh, HIGH);

       digitalWrite(lightok, LOW);

   }  else {

       digitalWrite(lighthigh, LOW);

       digitalWrite(lightok, HIGH);

   }
}
4

1 に答える 1

3

これを行うには次の方法が必要です。

  • 毎秒または0.5秒など、ループをより高速に実行し、値が前の値と異なる場合、または差が特定の値より大きい場合にのみ値をシリアルに出力できます
  • 何かが起こったときにのみ割り込み実行コードを設定できます。しかし、これをより具体的にするために、あなたが使用しているセンサーを知る必要があります.

お役に立てれば!:)

編集

さて、私はそのようなことをします:

int lightSensorPin = A5;
int lightOkPin = 9;
int lightHighPin = 10;

int currentLightLevel = 0;
int previousLightLevel = 0;
int delta = 0;
int deltaValue = 10; // needs to be changed to suit your needs

void setup() {

    Serial.begin(9600);
    pinMode(lightOkPin, OUTPUT);
    pinMode(lightHighPin, OUTPUT);

}
void loop() {

    currentLightLevel = analogRead(lightSensorPin); //read the sensor

    currentLightLevel = map(currentLightLevel, 0, 1023, 0, 255); // map the value
    currentLightLevel = constrain(currentLightLevel, 0, 255); // not sure this is useful

    delta = abs(previousLightLevel - currentLightLevel); // calculate the absolute value of the difference btw privous and current light value

    if (delta >= deltaValue) { // if the difference is higher than a threshold
        Serial.print("currentLightLevel: ");
        Serial.println(currentLightLevel);

        //led control for light levels
        if (currentLightLevel < 15 || currentLightLevel > 125) {
            digitalWrite(lightHighPin, HIGH);
            digitalWrite(lightOkPin, LOW);
        }
        else {
            digitalWrite(lightHighPin, LOW);
            digitalWrite(lightOkPin, HIGH);
        }
    }

    previousLightLevel = currentLightLevel;

    delay(1000);
}
于 2014-08-07T17:09:24.993 に答える