我正在制作一个必须用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 回答
您可以尝试使用平滑来读取传感器的运行平均值 . 这样你就可以获得平滑的平均值而不是立即值,所以如果你保持窗口足够长的话,短的尖峰(如手)就不会改变值 .
有一个tutorial on the arduino website解释了如何做到这一点 . 基本上,您存储多个先前的值并跟踪平均值 .