我正在尝试创建一个运动控制的灯,除非它是黑暗的,否则它不会打开。
我希望在检测到动作时用pwm慢慢打开和关闭灯光。现在我的代码可以工作,并且几乎可以完成我想要的所有内容。
问题是我正在使用延迟功能在达到全亮度后保持灯亮。因此,如果在灯亮时检测到运动,则不会重置计时器。一旦延迟计时器用完并检测到运动,亮度就会下降然后再恢复。
我想让运动检测器重置计时器,使计时器保持开启但无法使其工作。
我看过这些:
http://playground.arduino.cc/Code/AvoidDelay
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
但由于我对arduino代码的理解有限,我无法让它工作。我真的很感激任何帮助。
解决
下面的工作代码:
const byte MotionPin = 4; // Motionsensor
int LightSensorPin = 2; // Lightsensor
const byte LedPin = 11; // LED
unsigned long MotionDetectedMillis; // When motion was detected
unsigned long ledTurnedOnAt; // when led was turned on
unsigned long turnOnDelay = 50; // wait to turn on LED
unsigned long turnOffDelay = 5000; // turn off LED after this time
bool ledReady = false; // Has motion been detected
bool ledState = false; // Led on or off
int LightSensorState = 0;
int fadeAmount = 5; // How much to fade in a loop
byte brightness = 0;
void setup() {
pinMode(MotionPin, INPUT);
pinMode(LightSensorPin, INPUT);
pinMode(LedPin, OUTPUT);
digitalWrite(LedPin, LOW);
}
void loop() {
// get the time at the start of this loop()
unsigned long currentMillis = millis();
if (digitalRead(MotionPin) == HIGH && digitalRead(LightSensorPin)== HIGH)
{
MotionDetectedMillis = millis();
ledReady = true;
}
if (ledReady)
{
if ((unsigned long)(currentMillis - MotionDetectedMillis) >= turnOnDelay)
{
while (brightness < 255)
{
brightness = brightness + fadeAmount;
analogWrite(LedPin, brightness);
delay(30);
}
// setup our next "state"
ledState = true;
// save when the LED turned on
ledTurnedOnAt = currentMillis;
ledReady = false;
}
}
// see if we are watching for the time to turn off LED
if (ledState)
{
if ((unsigned long)(currentMillis - ledTurnedOnAt) >= turnOffDelay)
{
while (brightness >0)
{
brightness = brightness - fadeAmount;
analogWrite(LedPin, brightness);
delay(30);
}
ledState = false;
}
}
}
答案 0 :(得分:1)
你想要的是一台状态机;你必须跟踪你当前所处状态的循环以及触发下一状态的条件是什么;因为只有当某些事情发生触发新状态时,你的循环才会执行一个动作,而不是使用延迟(),你会使用等待超时的时间。状态(记住要知道下一个状态是什么)。
如果这让您感到困惑,请将每个州视为说明手册中的步骤; 打开led 1,等待x,再打开led 1,等y等等。 并且因为你没有更多的延迟,在管理正常流程之前或之后#34;在状态中,您可以添加一些特殊情况,例如&#34;如果输入2为高且当前状态为X或Y,则将当前状态设置为Z&#34;。
答案 1 :(得分:0)
所以,您想要的内容可以通过中断轻松归档,但是通过这样的简单项目,只需删除delay(OnTime)
函数即可获得相同的结果。
如果您想了解更多有关Arduino UNO使用的atmega328的中断,请转到here