Привет. Пишу код для кнопки и светодиода. светодиод должен работать по типу гирлянды( то есть просто горит, мигает, плавно тухнет и загорается) Возникает ошибка в 15 строке где led_state = ++led_state % ALL_STATES; , не могу понять в чём дело. Помогите понять что не так, пожалуйста Код (C++): int led_pin = 3; int butt_pin = 5; enum State{LED_HIGH, LED_BLINK, LED_GLOW, ALL_STATES}; State led_state = LED_HIGH; bool butt_was_press = false; void setup(){ pinMode(led_pin, OUTPUT); pinMode(butt_pin, INPUT_PULLUP);} void loop(){ bool butt_is_press = digitalRead(butt_pin); if(butt_is_press && !butt_was_press){ led_state = ++led_state % ALL_STATES; delay(10);} butt_was_press = butt_is_press; if(led_state == LED_HIGH){ digitalWrite(led_pin, HIGH);} else if(led_state == LED_BLINK){ digitalWrite(led_pin, (millis()/2000)%2);} else if(led_state == LED_GLOW){ analogWrite(led_state, (millis()/5000)%256);} }
Сделал таким образом, но на будущее, как прописывать увеличение значения с enum? Код (C++): int led_pin = 3; int butt_pin = 5; #define LED_HIGH 1 #define LED_BLINK 2 #define LED_GLOW 3 #define ALL_STATES 4 int led_state = LED_HIGH; bool butt_was_press = false; void setup(){ pinMode(led_pin, OUTPUT); pinMode(butt_pin, INPUT_PULLUP);} void loop(){ bool butt_is_press = digitalRead(butt_pin); if(butt_is_press && !butt_was_press){ led_state = ++led_state % ALL_STATES; delay(10);} butt_was_press = butt_is_press; if(led_state == LED_HIGH){ digitalWrite(led_pin, HIGH);} else if(led_state == LED_BLINK){ digitalWrite(led_pin, (millis()/1000)%2);} else if(led_state == LED_GLOW){ analogWrite(led_state, (millis()/10000)%256);} }
Этот смотря как Вы хотите. Если по рабоче-крестянски, то Код (C++): led_state = led_state + 1; Вполне работает. Но будет предпреждение, как и на следующую строку тоже. А если по эстетски, то надо определить свой тип данных и для него вводить любые нужные операции, хоть ++, хоть чего Вам ещё захочется. Кстати, тогда можно ++ сразу сделать по модулю и следующая строка будет не нужна.
Код (C++): enum class TState :uint8_t { LED_HIGH = 0, LED_BLINK, LED_GLOW, ALL_STATES = 3 }; TState ledState = TState::LED_HIGH; TState& operator++(TState& AState) { const uint8_t MIN_VALUE = 0; const uint8_t MAX_VALUE = 3; uint8_t value = static_cast<uint8_t>(AState); if (++value > MAX_VALUE) value = MIN_VALUE; AState = static_cast<TState>(value); return AState; } ++ledState в коде циклически перебирает все значения.