Помогите исправить функцию

br0lviv
Offline
Зарегистрирован: 11.06.2018

Здраствуйте. Клавиши управления задают значения переменным, но проблема в том, что значение которое доходит до 0 перескакивает снова на большее, а вот от большого до 0 это уже не происходит, в чем проблема? Если код для обеих клавиш написан одинаково. благодарю за помощь.

if(POMP_mode_SET){
//  Если нажата кнопка UP
    if(digitalRead(PIN_button_UP)){
      while(digitalRead(PIN_button_UP)){delay(50);}              // ждём пока мы не отпустим кнопку UP
     switch (POMP_mode_SET){                                     // инкремент (увеличение) устанавливаемого значения
      case 1: set_value((first_hour==0?23:first_hour+1),          -1, -1, -1, -1, -1); break;
      case 2: set_value(-1, (first_minutes==0?59:first_minutes+1),    -1, -1, -1, -1); break;
      case 3: set_value(-1, -1, (end_hour==0?23:end_hour+1),              -1, -1, -1); break;
      case 4: set_value(-1, -1, -1, (end_minutes==0?59:end_minutes+1),        -1, -1); break;
      case 5: set_value(-1, -1, -1, -1, (rain_hours1==0?23:rain_hours1+1),        -1); break;
      case 6: set_value(-1, -1, -1, -1, -1, (rain_hours2==0?23:rain_hours2+1) );       break;
      }
    }
//  Если нажата кнопка DOWN
    if(digitalRead(PIN_button_DOWN)){
      while(digitalRead(PIN_button_DOWN)){delay(50);}            // ждём пока мы её не отпустим
       switch (POMP_mode_SET){                                     // декремент (уменьшение) устанавливаемого значения
      case 1: set_value((first_hour==0?23:first_hour-1),            -1, -1, -1, -1, -1); break;
      case 2: set_value(-1, (first_minutes==0?59:first_minutes-1),      -1, -1, -1, -1); break;
      case 3: set_value(-1, -1, (end_hour==0?23:end_hour-1),            -1, -1, -1); break;
      case 4: set_value(-1, -1, -1, (end_minutes==0?59:end_minutes-1),      -1, -1); break;
     case 5: set_value(-1, -1, -1, -1, (rain_hours1==0?23:rain_hours1-1),      -1); break;
      case 6: set_value(-1, -1, -1, -1, -1, (rain_hours2==0?23:rain_hours2-1) ); break;
      }
    }
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
     while(digitalRead(PIN_button_SET)){                        // ждём пока мы её не отпустим
        delay(10);
        if(i<85){i++;}else{
      }
      }
            if(i<85){                                                 // если кнопка SET удерживалась меньше 2 секунд
        if(VAR_mode_SHOW==3){
        POMP_mode_SET++;                                          // переходим к следующему устанавливаемому параметру
        if(VAR_mode_SHOW==3 && POMP_mode_SET>6){POMP_mode_SET=1;}
        }
        }else{                                                     // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени 
        POMP_mode_SET=0;// выходим из режима установки даты/времени
        settings = true;
      }
    }
  }

void  set_value (int i1, int i2, int i3, int i4, int i5, int i6){        //  
      if(i1<=23 && i1>=0){first_hour=i1;}      
      if(i2<=59 && i2>=0){first_minutes=i2;}       
      if(i3<=23 && i3>=0){end_hour=i3;}       
      if(i4<=59 && i4>=0){end_minutes=i4;}     
      if(i5<=23 && i5>=0){rain_hours1=i5;}      
      if(i6<=23 && i6>=0){rain_hours2=i6;}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

br0lviv пишет:

проблема в том, что значение которое доходит до 0 перескакивает снова на большее, а вот от большого до 0 это уже не происходит,

Значение ЧЕГО? Какой переменной? Вы нам ребус предлагаете?

br0lviv
Offline
Зарегистрирован: 11.06.2018

ЕвгенийП пишет:

Значение ЧЕГО? Какой переменной? Вы нам ребус предлагаете?

Почему ребус? Значение это простые цифры которые задаются клавишами вверх, вниз. А переменных там несколько first_hour, first_minutes, end_hour...и т.д. которые и приобретают эти значения при переключении вверх вниз. А уже дальше в коде эти значения я использую для других целей, хотя это сейчас не имеет значения. Но я зашел в тупик и прошу вашей помощи. Когда значение переменной клавишами сбрасываю к 0, для удобства перескакивает, в случае first_hour сразу на 23. с другой же стороны, если поднять до 23 уже на 0 не переходит. Помогите разобраться в ошибке.. Ну не получается изменить код( Спасибо

Densl
Offline
Зарегистрирован: 28.11.2018

Здравствуйте. Проблема в том, что у вас код для обоих клавиш написан практически одинаково. Вам нужно переосмыслить логику при нажатии кнопки вверх и кнопки вниз и сравнить с тем, что есть сейчас.

sadman41
Offline
Зарегистрирован: 19.10.2016

Как Вы понимаете условие в строке #6?

br0lviv
Offline
Зарегистрирован: 11.06.2018

Densl пишет:

Здравствуйте. Проблема в том, что у вас код для обоих клавиш написан практически одинаково. Вам нужно переосмыслить логику при нажатии кнопки вверх и кнопки вниз и сравнить с тем, что есть сейчас.

Думал об этом и скорее всего так и сделаю, спасибо. Но это не один switch, в программе их много. То есть, кнопки вверх, вниз в различных режимах выполняют свои функции + - но для разных событий. И переписывать придется много, все таки интересно почему не работает, если в одну сторону перебрасывает, а в другую нет. Ладно буду решать другим путем. Спасибо.

nik182
Offline
Зарегистрирован: 04.05.2015

В строках 6-11 условия переключения неправильно заданы. Должны быть противоположны строкам 18-23. 

br0lviv
Offline
Зарегистрирован: 11.06.2018

sadman41 пишет:

Как Вы понимаете условие в строке #6?

своего рода проверка, где-то когда-то подсмотрел, иногда использую. либо так show_page=show_page==1?2:1;

А что, не стоит?

br0lviv
Offline
Зарегистрирован: 11.06.2018

nik182 пишет:

В строках 6-11 условия переключения неправильно заданы. Должны быть противоположны строкам 18-23. 

Помогайте, как их нужно исправлять? Мои проверки> границ сбрасывают значение в 0, но дальше не хочет с 0 ++ 

sadman41
Offline
Зарегистрирован: 19.10.2016

br0lviv пишет:

sadman41 пишет:

Как Вы понимаете условие в строке #6?

своего рода проверка, где-то когда-то подсмотрел, иногда использую. либо так show_page=show_page==1?2:1;

А что, не стоит?

Проверка чего? Просто напишите русским словами, как оно действует (в вашем понимании).

nik182
Offline
Зарегистрирован: 04.05.2015

У вас поднимается значение до 24 или 60. Почему вы сравниваете с 0? Должны установить 0, а устанавливаете 23 или 59.  

br0lviv
Offline
Зарегистрирован: 11.06.2018

nik182 пишет:

У вас поднимается значение до 24 или 60. Почему вы сравниваете с 0? Должны установить 0, а устанавливаете 23 или 59.  

Ааа, и так просто? намек понял. Все исправил) работает. Спасибо)

br0lviv
Offline
Зарегистрирован: 11.06.2018

sadman41 пишет:

Проверка чего? Просто напишите русским словами, как оно действует (в вашем понимании).

я не могу развернуто вам ответить так до конца действительно не понимал принцип. Но кажется сейчас все стоит на своем месте. и вас благодарю.