首页 文章

值更改时运行循环 - Arduino

提问于
浏览
2

我正在测量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 回答

  • 3

    你必须这样做:

    • 你可以更快地运行循环,比如每秒或半秒,如果值与前一个值不同或者差异大于特定值,则只输出一个值为serial

    • 只有在出现问题时才能设置中断运行代码 . 但我需要知道你正在使用的传感器在这一个上更具体 .

    希望这可以帮助! :)

    EDIT

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

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

相关问题