首页 文章

如何在读取传感器时添加时间延迟 - arduino

提问于
浏览
0

我正在制作一个必须用LDR感应环境光的项目 . 这个想法是,当LDR的值低3秒时,led开启 . 此外,当LDR的值再次变高并且保持高电平3秒时,LED应该转为 . 这样我就可以避免只是一个 Cloud 或一个挥动在传感器上的人立即打开LED .

我知道我可以在这里使用mills()函数,就像在眨眼没有延迟教程 . 但它似乎不起作用....

到目前为止这是我的代码:

#define ledPin 2
#define ldrPin A0

int daylight = 430;
int night = 150;

int ledState = 0;
int lightState = 0;

const long timeOut = 2000;
unsigned long previousMillis = 0; 
unsigned long previousMillis2 = 0; 
unsigned long tNow = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT);
  pinMode(ldrPin, INPUT);

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  tNow = millis();
  int value = analogRead(ldrPin);

  switch (lightState) {
    case 0:
      ledState = 0;
      if (value <= 200 && (tNow - previousMillis) >= timeOut)
      {
        previousMillis = tNow;
        lightState = 1;
      }
      break;

    case 1:
      ledState = 1;
      if (value >= 300 && (tNow - previousMillis2) >= timeOut)
      {
        previousMillis2 = tNow;
        lightState = 0;
      }
      break;
  }

  switch (ledState) {
    case 0:
      digitalWrite(ledPin, LOW);
      break;

    case 1:
      digitalWrite(ledPin, HIGH);
      break;
  }

  Serial.println(value);
  Serial.println(ledState);


}

1 回答

  • 0

    您可以尝试使用平滑来读取传感器的运行平均值 . 这样你就可以获得平滑的平均值而不是立即值,所以如果你保持窗口足够长的话,短的尖峰(如手)就不会改变值 .

    有一个tutorial on the arduino website解释了如何做到这一点 . 基本上,您存储多个先前的值并跟踪平均值 .

相关问题