我正在研究这个项目,应该是车棚的灯。有两种方法可以通过运动传感器或开关来打开灯。 LED灯条开始依次点亮一个LED。它会保持一段时间,然后开始反转动画,并将所有LED变成黑色。我正在为此动画使用一个for循环(这与FastLed在第一个灯光示例中使用的循环相同)。仅当运动传感器被激活并且for循环正在运行时,该错误才会出现。对不起,整数名称错误,可能会造成混淆。非常感谢!
以下是代码:(如果您听不懂德语,-Bewegungsmelder =运动传感器-Schalter =切换
// für die Leds
#define NUMfront_LEDS 150 //150 Leds
#define NUMinner_LEDS 35 //35 Leds
#define rightPIN 6 //Pin 6
#define leftPIN 5
#define innerrightPIN 8
#define innerleftPIN 7
#define CLOCK_PIN 13
// für die Schalter
#define schalter 2 //Pin 2
#define Bewegungsmelder 4 //Pin 4
int schalterval = 0;
int Bewegungsval = 0;
long Time = 0;
long Wait = 900000;
int On = 0;
CRGB leftLeds[NUMfront_LEDS];
CRGB rightLeds[NUMfront_LEDS];
CRGB innerleftLeds[NUMinner_LEDS];
CRGB innerrightLeds[NUMinner_LEDS];
void setup() {
// sanity check delay - allows reprogramming if accidently blowing power w/leds
Serial.begin(115200);
delay(2000);
FastLED.addLeds<WS2812B, rightPIN, RGB>(rightLeds, NUMfront_LEDS); // GRB ordering is typical
FastLED.addLeds<WS2812B, leftPIN, RGB>(leftLeds, NUMfront_LEDS);
FastLED.addLeds<WS2812B, innerrightPIN, RGB>(innerrightLeds, NUMinner_LEDS);
FastLED.addLeds<WS2812B, innerleftPIN, RGB>(innerleftLeds, NUMinner_LEDS);
Time = millis();
}
void loop() {
Serial.println("----------------------------------------------");
Serial.print(Wait);
Serial.print("----");
Serial.print(millis());
Bewegungsval = digitalRead(Bewegungsmelder);
schalterval = digitalRead(schalter);
Serial.println(Bewegungsval);
Serial.println(schalterval);
Serial.println("Space");
Schalter:
if (digitalRead(schalter) == 1) {
On = 0;
for (int blackLed = NUMfront_LEDS; blackLed > -1; blackLed = blackLed - 1) {
leftLeds[blackLed] = CRGB::White;
rightLeds[blackLed] = CRGB::White;
delay(19);
FastLED.show();
}
// Carport innen
fill_solid( innerrightLeds, NUMinner_LEDS, CRGB::White);
fill_solid( innerleftLeds, NUMinner_LEDS, CRGB::White);
//Leds aus
//Carport aussen
while (digitalRead(schalter) == 1) {
}
for (int whiteLed = 0; whiteLed < NUMfront_LEDS; whiteLed = whiteLed + 1) {
leftLeds[whiteLed] = CRGB::Black;
rightLeds[whiteLed] = CRGB::Black;
delay(19);
FastLED.show();
}
// Carport innen
fill_solid( innerrightLeds, NUMinner_LEDS, CRGB::Black);
fill_solid( innerleftLeds, NUMinner_LEDS, CRGB::Black);
FastLED.show();
}
else if (Bewegungsval == 1) {
//Carport aussen
if (On == 1) {
goto Skip;
}
for (int blackLed = NUMfront_LEDS; blackLed > -1; blackLed = blackLed - 1) {
leftLeds[blackLed] = CRGB::White;
rightLeds[blackLed] = CRGB::White;
delay(19);
FastLED.show();
}
// Carport innen
fill_solid( innerrightLeds, NUMinner_LEDS, CRGB::White);
fill_solid( innerleftLeds, NUMinner_LEDS, CRGB::White);
FastLED.show();
//Leds aus
On = 1;
Skip:
Time = millis();
Wait = Time + 10000; // + 5min. 300000
Bewegungsval = digitalRead(Bewegungsmelder);
goto Schalter;
}
Time = millis();
if (Time >= Wait) {
On = 0;
for (int whiteLed = 0; whiteLed < NUMfront_LEDS; whiteLed = whiteLed + 1) {
leftLeds[whiteLed] = CRGB::Black;
rightLeds[whiteLed] = CRGB::Black;
delay(19);
FastLED.show();
}
// Carport innen
fill_solid( innerrightLeds, NUMinner_LEDS, CRGB::Black);
fill_solid( innerleftLeds, NUMinner_LEDS, CRGB::Black);
}
}```
尽管德语流利,但程序结构仍然有点混乱。由于我们使用的是C ++
因此,请使用以下结构清理代码:
的后两个结合的if语句中,否则将意味着lightIsON == false在第二个这里没有意义,因为我们仅将它们按时间区分为状态。请不要在面向对象的程序设计中使用goto,它会使您的代码难以读取和追踪。重写程序,如果有“新”问题,请在此处编辑或打开新问题unsigned long startTime = 0; unsigned long myTimer = 10000;// 10 sec bool lightIsOn = false; setup(){....} loop(){ .... // We check wether switch or IR are triggerd AND we are not already in a light sequence if ((digitalRead(schalter) == 1 || Bewegungsval == 1) && lightIsOn == false) { lightIsOn = true; // change state so we know that a light sequence is running startTime = millis(); // reset the timer } // this part runs as long lighIsOn == true and time is not up if(millis() - startTime <= myTimer && lighIsOn == true){ // Carport aussen your light sequence ..... } // Here we run the time is up sequence if(millis() - startTime > myTimer && lighIsOn == true) { // rollover safe light sequence for time is up ........ lightIsOn = false; // change state so we know that a light sequence is over } }
此技术称为有限状态机,不会通过goto进行“跳跃”。如果您需要更多状态,则只需扩展序列-没有别的,因为例如在我们检查lightIsON == true ==>