Я использую библиотеку FastLED и библиотеку Keypad для запуска кода на моих лампах WS2812. Когда я использовал только базовую раскладку клавиатуры, чтобы распечатать, какая клавиша была нажата, этот код работал. Но теперь, когда я добавил методы для запуска кода с клавиатуры if, кажется, что он не работает. Ничего не происходит со светом, когда я нажимаю цифру на клавиатуре. В настоящее время код светодиода находится в методах. Раньше я просто использовал его в операторах if для самой клавиатуры. Я собираюсь сделать приведенный здесь код максимально кратким, чтобы не загромождать экран тем, что я считаю неуместным. Если у вас есть какие-либо вопросы, я могу предоставить соответствующие фрагменты остального кода.
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(32);
Serial.begin(9600);
}
void christmas() {
for(int i = 0; i < 6; i++){
for(int i = 0; i > 299; i++) {
leds[i] = CRGB (0, 128, 0); //green
FastLED.show();
leds[i+1] = CRGB (255, 0, 0); //red
FastLED.show();
delay(20);
}
//the second loop turns the first light red and the second light green starting at the end
for (int i = 299; i <= 0; i--) {
leds[i] = CRGB (255, 0, 0); //green
FastLED.show();
leds[i + 1] = CRGB (0, 128, 0); //red
FastLED.show();
delay(20);
}
}
}
void loop() {
char key = keypad.getKey(); //determines what key is pressed
if (key == '1'){
christmas();
}
if (key == '2'){
dot();
}
if (key == '3'){
mavericks();
}
if (key == '4'){
rainbow();
}
if (key == '5'){
blueBar();
}
if (key == '6'){
purple();
}
Чтобы было ясно, при запуске кода нет ошибки. Он работает нормально. Но он ничего не делает, когда нажимаются клавиши на клавиатуре, где, как я полагаю, он должен запускать вызываемые методы и соответствующим образом влиять на свет.
Изменить:
После реализации предложений Bobby Tables это работает до некоторой степени. За исключением того момента, когда я нажимаю 1, а это:
void christmas() {
delay(10);
for(int j = 0; j < 6; j++){
delay(10);
for(int i = 0; i > 299; i++) {
delay(10);
leds[i] = CRGB::Red; //green
FastLED.show();
leds[i+1] = CRGB::Green; //red
FastLED.show();
delay(20);
}
//the second loop turns the first light red and the second light green starting at the end
for (int i = 299; i >= 0; i--) {
leds[i] = CRGB::Green; //green
FastLED.show();
leds[i + 1] = CRGB::Red;
FastLED.show();
delay(20);
}
}
}
он запускается мгновенно, но если я нажму любую другую клавишу, он не будет работать полностью. Например, когда я нажимаю 5, что означает:
void blueBar() {
delay(10);
fill_solid(leds, NUM_LEDS, CRGB::White);
delay(10);
for(int j = 0; j < 6; j++) {
delay(10);
for(int i = 0; i < 299; i++) {
leds[i] = CRGB::Blue;
leds[i + 1] = CRGB::Blue;
leds[i + 2] = CRGB::Blue;
leds[i + 3] = CRGB::Blue;
leds[i + 4] = CRGB::Blue;
leds[i + 5] = CRGB::Blue;
FastLED.show();
delay(200);
leds[i] = CRGB::White;
FastLED.show();
}
}
}
Это ничего не делает. За исключением случаев, когда я нажимаю 5, а затем нажимаю 1. Он заполнит начальный сплошной белый цвет, но затем запустит Christmas().
switch
/case
. Это должно помочь вам упростить ваш код (если только несколько одновременных нажатий кнопок не являются законными). - person user4581301   schedule 10.12.2019