Проблема переключения режимов

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016

Доброго времени суток!

Прошу помощи в следующем вопросе. Ваяю Midi контроллер для гитарного эффекта Whammy 5.

Три кнопки: одна листает пресеты вперёд, другая назад, третья переключает режимы.

Один режим: пресеты листаются с включенным эффектом, второй режим пресеты листаются с выключенным эффектом.

Это определяется номером Programm Change.

С 0 по 20 с вкл эффектом.

C 21 по 41 пресеты листаются с выкл эффектом.

Только вот при переключение режима при пролистывании пресетов в любом из состояний (вкл/выкл) переключение не происходит до тех пор пока не будет достигнуто крайнее значение (0 или 20 или 21или 41)

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

Спасибо!

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

int regim=1;
int flag=0;
int progNo = 0;
int upLastTime, downLastTime, upNow, downNow;

 void setup(){
  pinMode(5,INPUT);
  pinMode(6,INPUT);
  pinMode(10,OUTPUT);//светодиод сигнализирующий о переключении режима
  Serial.begin(31250);
  MIDI.begin(MIDI_CHANNEL_OMNI);
  digitalWrite(5, HIGH); // включаем внутреннюю подтяжку
  digitalWrite(6, HIGH);
  upLastTime = digitalRead(6);
  downLastTime = digitalRead(5);
 }

 void loop(){
    upNow = digitalRead(5);
    downNow = digitalRead(6);
    if(digitalRead(3)== HIGH && flag==0)//если кнопка нажата
     // и перемення flag равна 0 , то ...
     {
       regim++;
       flag=1;

        if(regim>2)//ограничим количество режимов
        {
          regim=1;
        }
     }

      if(digitalRead(3)==LOW&&flag==1)//если кнопка НЕ нажата
     //и переменная flag равна - 1 ,то ...
     {
       flag=0;//обнуляем переменную 
     }

    if(regim==1)//первый режим
    {
     Fx0();
     digitalWrite(10, LOW);
    }
    if(regim == 2)//второй режим
    {    
     Fx1();
     digitalWrite(10, HIGH);//загорается сетодиод сигнализирующий переключение режима
    }
}   
 
 void Fx0() {
      if (upNow == LOW && upLastTime == HIGH) {
     progNo++; // increment program change
     if(progNo > 41) progNo = 21; // stop it going too high
     MIDI.sendProgramChange((progNo), 1);
     delay(10); // bit of debounce delay
     
  } 
    
  if (downNow == LOW && downLastTime == HIGH) {
     progNo--; // decrement program change
     if(progNo < 21) progNo = 41; // stop it going too low
     MIDI.sendProgramChange((progNo), 1);
     delay(10); // bit of debounce delay
  }
     upLastTime = upNow;
     downLastTime = downNow;
     delay(10);  
  }

   void Fx1() {
      if (upNow == LOW && upLastTime == HIGH) {
     progNo++; // increment program change
     if(progNo > 20) progNo = 0; // stop it going too high
     MIDI.sendProgramChange((progNo), 1);
     delay(10); // bit of debounce delay
  } 
    
  if (downNow == LOW && downLastTime == HIGH) {
     progNo--; // decrement program change
     if(progNo < 0) progNo = 20; // stop it going too low
     MIDI.sendProgramChange((progNo), 1);
     delay(10); // bit of debounce delay
     
  }
     upLastTime = upNow;
     downLastTime = downNow;
     delay(10);
   }

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

В 28 строку  - Serial.println(regim); 
И так по всем сомнительным. 

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016

Спасибо за совет. Добавил в 28 строку и далее в меру своего понимания.

При пролистывании в первом режиме (эффект выкл) теперь переключается во второй режим (эффект вкл)и из любого пресета сразу на первый.

А вот при переключении обратно всё так же приходится пролистать все 20 пресетов чтоб перешло в первый режим (эффект выкл)

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016
 void loop(){
    upNow = digitalRead(5);
    downNow = digitalRead(6);
    if(digitalRead(3)== HIGH && flag==0)//если кнопка нажата
     // и перемення flag равна 0 , то ...
     {
       regim++;
       flag=1;
       Serial.println(regim); 
        if(regim>2)//ограничим количество режимов
        {
          regim=1;
        }
     }

      if(digitalRead(3)==LOW&&flag==1)//если кнопка НЕ нажата
     //и переменная flag равна - 1 ,то ...
     {
       flag=0;//обнуляем переменную 
     }

    if(regim==1)//первый режим
    {
     Serial.println(regim=1);   
     Fx0();
     digitalWrite(10, LOW);
    }
    if(regim == 2)//второй режим
    {
     Serial.println(regim=2);       
     Fx1();
     digitalWrite(10, HIGH);//загорается сетодиод сигнализирующий переключение режима
    }
}  

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Van пишет:
А вот при переключении обратно всё так же приходится пролистать все 20 пресетов чтоб перешло в первый режим (эффект выкл)
Ну  если нет желание глубоко изучать программирование, то и не на такие извращения приходится идти.

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016

Желание есть. Я новичок. Прошу не судите строго. Я несколько дней искал нужную информацию, прежде чем сюда обратится. 

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016

Видимо замахнулся на то что мне пока не по зубам.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Van пишет:

Видимо замахнулся на то что мне пока не по зубам.

Ну да , видно что вы еще ребенок и не можете думать по взрослому.

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016

Благодарю за конструктивную критику.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Van пишет:
Благодарю за конструктивную критику.
Не за что. Просто песня "я новичек и не бейте меня дяденько сильно" это инфантилизм. Взрослый если надо пытается научится этому или заплатить если понимает что это ему по зубам. Если вы взрослый, то вы наверно наблюдали , что сложнве изделия собираются из узлов, а не из росыпи деталей. А особосложные росыпь- мелкие узлы-крупные узлы- изделие. Вот вам надо научится сборке из росыпи узлов , а из узлов собирать уже изделие. Один из инструментов классы, иногода библиотеки, чаще всего написаные самим или же отработы тоже самим.

b707
Offline
Зарегистрирован: 26.05.2017

van - зачем так много условий в loop ? Зачем нужна переменная flag? - она ж нигде не используется

Я бы все сократил буквально до двух строк: если кнопка выбора режима нажата - режим 1, если отпущена - режим 2.

И ВСЕ.

bwn
Offline
Зарегистрирован: 25.08.2014

Van пишет:

Спасибо за совет. Добавил в 28 строку и далее в меру своего понимания.

При пролистывании в первом режиме (эффект выкл) теперь переключается во второй режим (эффект вкл)и из любого пресета сразу на первый.

А вот при переключении обратно всё так же приходится пролистать все 20 пресетов чтоб перешло в первый режим (эффект выкл)

Я вам вообще-то советовал посмотреть как изменяются переменные в динамике и соответствует ли это задуманному.((((

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016

b707 пишет:

van - зачем так много условий в loop ? Зачем нужна переменная flag? - она ж нигде не используется

Я бы все сократил буквально до двух строк: если кнопка выбора режима нажата - режим 1, если отпущена - режим 2.

И ВСЕ.

Для того чтоб нажать и отпустить кнопку - режим сменился. Это ж гитарная педаль. Не удобно стоять удерживая кнопку.

Увы даже при условии двух строк, режим не переключается пока цикл пресетов не пролистаешь.

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016

bwn пишет:

Van пишет:

Спасибо за совет. Добавил в 28 строку и далее в меру своего понимания.

При пролистывании в первом режиме (эффект выкл) теперь переключается во второй режим (эффект вкл)и из любого пресета сразу на первый.

А вот при переключении обратно всё так же приходится пролистать все 20 пресетов чтоб перешло в первый режим (эффект выкл)

Я вам вообще-то советовал посмотреть как изменяются переменные в динамике и соответствует ли это задуманному.((((

Я это понял позже. Ночь не спал, туго уже соображал)