值更改时运行循环 - Arduino

时间:2014-08-07 08:25:17

标签: loops arduino arduino-uno

我正在测量arduino uno上的光线,温度和湿度,并将循环编程为每分钟运行一次。监视串行监视器上的值。

但是,我想要的是运行一次以获取值,然后等待或暂停的代码,直到其中一个值发生变化,然后在串行监视器上输出。

我想立即获知传感器的变化,而不是等待一分钟才能运行循环。有没有办法做到这一点?

感谢。

所以我需要在以下代码中添加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);

   }
}

1 个答案:

答案 0 :(得分:3)

你必须这样做:

  • 你可以更快地运行你的循环,比如每秒或半秒,如果值与前一个值不同,或者差异大于特定值,则只输出一个值
  • 只有在出现问题时才能设置中断运行代码。但是我需要知道你正在使用的传感器更具体地说明这个传感器。

希望这有帮助! :)

修改

好的,我会做那样的事情:

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