Как добавить задержку при считывании показаний датчика — arduino

Я делаю проект, который должен воспринимать окружающий свет с помощью LDR. Идея состоит в том, что когда значение LDR низкое в течение 3 секунд, включается светодиод. Также, когда значение этого LDR снова становится выше и остается высоким в течение 3 секунд, светодиод должен загореться. Это сделано для того, чтобы я мог избежать того, что просто облако или кто-то, машущий рукой над датчиком, немедленно включит светодиод.

Я знаю, что здесь можно использовать функцию 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);


}

person Skip Geldens    schedule 21.03.2016    source источник


Ответы (1)


Вы можете попробовать использовать сглаживание для считывания среднего значения с датчика. Таким образом, у вас будет сглаженное среднее значение вместо мгновенного значения, поэтому короткий всплеск (например, рука) не изменит значение, если вы будете держать окно достаточно длинным.

На веб-сайте arduino есть руководство, объясняющее, как это сделать. В основном вы сохраняете несколько предыдущих значений и отслеживаете среднее значение.

person Sentri    schedule 21.03.2016