Хорошо, у меня одна проблема с этим кодом. Счетчик pushCounterz
(именуемый только z, чтобы исключить конфликтующую переменную) будет начинаться с правильного счетчика (1 или 0 или в зависимости от того), и при нажатии кнопки произойдет одно из следующих событий:
- ничего не делает
- правильно переключает светодиод, но счетчик работает не по одному из двух способов
- переместится на -255, затем при втором нажатии сбрасывается на 1 и переворачивается при каждом нажатии от 1 до -255
- Счетчик не будет увеличиваться
#include <FastLED.h>
#define AnalogIn A0
#define SwIn 2
#define LED_Out 12
#define NUM_LEDS 100
int pushCounterz = 0;
int buttonState;
int lastButtonState; // the previous reading from the input pin
int ledPin = 13;
int ledState = HIGH;
CRGB leds[NUM_LEDS];
void setup() {
// put your setup code here, to run once:
FastLED.addLeds<WS2812, LED_Out, GRB>(leds, NUM_LEDS);
//pinMode(SwIn, INPUT);
pinMode(LED_Out, OUTPUT);
pinMode(ledPin, OUTPUT);
//Turn Off strip
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i] = CRGB ( 255, 0, 0 );
FastLED.show();
}
digitalWrite(ledPin, ledState);
Serial.begin(115200);
Serial.println(pushCounterz);
lastButtonState = digitalRead(SwIn); // Set the button state to the startup state
}
void loop() {
buttonState = digitalRead(SwIn);
if (buttonState == LOW && buttonState != lastButtonState) {
ledState = !ledState;
}
if (buttonState == LOW && buttonState != lastButtonState) {
if (pushCounterz > 3) {
Serial.println("Reset to 0: ");
pushCounterz = 0;
} else {
pushCounterz = pushCounterz + 1;
Serial.println("Incerment");
}
Serial.println(pushCounterz);
switch (pushCounterz) {
case 0:
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i] = CRGB (255, 0, 0);
}
break;
case 1:
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i] = CRGB ( 0, 255, 0);
}
break;
case 2:
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i] = CRGB ( 0, 0, 255);
}
break;
case 3:
// theaterChaseRainbow(1,50);
break;
default:
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
break;
}
}
FastLED.show();
digitalWrite(ledPin, ledState);
lastButtonState = buttonState;
}
Однако, если я отключаю кодовый блок переключателя, все работает безупречно. Я подозреваю, что это ошибка в библиотеке FastLED, однако я хотел бы спросить здесь, поскольку я неплохо знаком с программированием на Arduino.
РЕДАКТИРОВАТЬ: Код выше исправил одну проблему с кнопкой. Я изменил схему на HIGH и отбросил LOW, однако не изменил код. ОДНАКО состояние остается непоследовательным, иногда работает, а иногда переворачивается между 1 и -255 (тем более, последний). Сводка изменений:
void setup() {
...
lastButtonState = digitalRead(SwIn); // Set the button state to the startup state
}
*/
buttonState = digitalRead(SwIn);
if (buttonState == LOW && buttonState != lastButtonState) {
ledState = !ledState;
}
if (buttonState == LOW && buttonState != lastButtonState) {
РЕДАКТИРОВАТЬ: Последовательный вывод, чтобы показать текущее сумасшествие (с примечаниями) после редактирования выше:
0 <- initial startup correct
Incerment <- button push
1 <- correct increment
Incerment <- 2nd button push
-255 <- 1 + 1 does NOT equal -255
Incerment <- 3rd button push
1 <- ??? Assuming -255 +1 = 1?
Incerment
-255