Возникает ошибка no match for "operator++"

Тема в разделе "Arduino & Shields", создана пользователем Ard14, 6 окт 2022.

  1. Ard14

    Ard14 Нуб

    Привет. Пишу код для кнопки и светодиода. светодиод должен работать по типу гирлянды( то есть просто горит, мигает, плавно тухнет и загорается)
    Возникает ошибка в 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);}
     
    }
     
    Последнее редактирование: 6 окт 2022
  2. fogary

    fogary Гик

    Наверное, по тому, что для типа "enum" не определен оператор "++".
     
  3. Ard14

    Ard14 Нуб

    Сделал таким образом, но на будущее, как прописывать увеличение значения с 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);}
       
    }
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Этот смотря как Вы хотите. Если по рабоче-крестянски, то

    Код (C++):
    led_state = led_state + 1;
    Вполне работает. Но будет предпреждение, как и на следующую строку тоже.

    А если по эстетски, то надо определить свой тип данных и для него вводить любые нужные операции, хоть ++, хоть чего Вам ещё захочется. Кстати, тогда можно ++ сразу сделать по модулю и следующая строка будет не нужна.
     
  5. DetSimen

    DetSimen Гуру

    Код (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 в коде циклически перебирает все значения.
     
    Последнее редактирование: 7 окт 2022
  6. Asper Daffy

    Asper Daffy Иксперд

    Дед решил "по эстетски" :)

    А чё MAX_VALUE не через ALL_STATES определена?
     
    DetSimen нравится это.
  7. DetSimen

    DetSimen Гуру

    Да лень, ТС-у всё равно уже это не надо. Впрочем, умный догадаеца, а дураку и не нужно.