помогите с антидребезгом

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

всем привет. В программировании по сути 0 :)

решаю следующий вопрос по антидребезгу, поправте пожалуйста что и как неверно:

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x50

long debouncedelay = 3000;



const int button = 2;



void setup() {
Serial.begin(112500);
pinMode(button, INPUT);
}

void loop {



if (button == HIGH)
{
    long currenttime = millis();
    if(millis() - currenttime >= debouncedelay){
        midicommand(midi_cc,midi_SW_CC1, midiON);
    }
}
}

void midicommand(int channel, int pitch, int velocity){
Serial.write(channel);
Serial.write(pitch);
Serial.write(velocity);
delay(20);
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

В Вашем коде кнопка не сработает, попробуйте так:

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x50

long debouncedelay = 50;

const int button = 2;

bool f_kn1 = 0;
unsigned long currenttime = 0;

void setup() {
  Serial.begin(112500);
  pinMode(button, INPUT);
}

void loop() {
  if (button == HIGH)
  {
    if (f_kn1 == 0) {
      currenttime = millis();
      f_kn1 = 1;
    }
    if (millis() - currenttime >= debouncedelay) {
      midicommand(midi_cc, midi_SW_CC1, midiON);
    }
  }
  else f_kn1 = 0;
}

void midicommand(int channel, int pitch, int velocity) {
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
  delay(20);
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Переменная button всегда будет HIGH, потому что она всегда = 2 (digitalRead() в скетче отсутствует).

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Araris пишет:

Переменная button всегда будет HIGH, потому что она всегда = 2 (digitalRead() в скетче отсутствует).

digitalRead есть в коде, просто не делал копи паст, пропустил по невнимательности.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

vosara пишет:

В Вашем коде кнопка не сработает, попробуйте так:

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x50

long debouncedelay = 50;

const int button = 2;

bool f_kn1 = 0;
unsigned long currenttime = 0;

void setup() {
  Serial.begin(112500);
  pinMode(button, INPUT);
}

void loop() {
  if (button == HIGH)
  {
    if (f_kn1 == 0) {
      currenttime = millis();
      f_kn1 = 1;
    }
    if (millis() - currenttime >= debouncedelay) {
      midicommand(midi_cc, midi_SW_CC1, midiON);
    }
  }
  else f_kn1 = 0;
}

void midicommand(int channel, int pitch, int velocity) {
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
  delay(20);
}

 

 

f_kn1 - это запоминание состояние кнопки?

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Код немного не правильно работает если выставить debouncedelay 3000. Я так понимаю, при нажатии кнопки(когда ножка поймала 1), должна происходить задержка исполнения команды до стабилизации кнопки. В данном коде выходит немного наоборот, то-есть, при коротком нажатии кнопки, ничего не происходит, команда запускается только при удержании кнопки по времени 3000мс и выше. При delay(3000) все правильно работает, коротко нажал, задержка на 3000мс -> выполнение команды. 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

115200......

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

не копи паст, показал просто общую картину кода. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Вообще-то даже если батон читается с пина и сравнивается с хай, приведенный код работать тоже не может. вы бы привели полноценный кусок кода копипастом, а то так гадать можно очень долго что там уже есть, а что надо ещё подправить ..

и сразу возникает вопрос: а почему бы не воспользоваться титановым лисапедом, прибитым сверху "гвоздиком"?

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Вот, немного обдумав, переписал(код прилагаю внизу). Обработка одиночного нажатия, плюс, анти-дребезг. Следующая проблема в том, что кнопка иногда не срабатывает, а иногда инвертирует действие, то-есть, включает на отжимание(отпускание) кнопки.

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46
#define midi_SW_CC2 0x47
#define midi_SW_CC3 0x48
#define midi_SW_CC4 0x49
#define midi_SW_CC5 0x4A
#define midi_SW_CC6 0x4B
#define midi_SW_CC7 0x4C
#define midi_SW_CC8 0x4D
#define midi_SW_CC9 0x4E
#define midi_SW_CC10 0x4F

int flag = 0;

int buttonpin7 = 7;

unsigned long timer = 0;

unsigned long debounce = 10;


void setup() 
{
  Serial.begin(31250);
  
  pinMode(buttonpin7, INPUT);
}
void loop() {

int buttonread7 = digitalRead(buttonpin7);


if (buttonread7 == HIGH && flag == 0)
 {
  if ((millis() - timer) >= debounce)
  {
    if(buttonread7 == HIGH ) 
    {
    midi_SN_CM(midi_cc, midi_SW_CC1, midiON);
    
    timer = millis();    
    flag = 1;
    }
   }
 } 

 if(buttonread7 == LOW) flag = 0;

}

void midi_SN_CM(int channel, int pitch, int velocity)
{
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ggreenpowerp, я тут как-то приводил осциллограммы дребезга. Основной дребез идёт не при нажатии на кнопку (в этот момент дребезга вообще зачастую не бывает), а в момент отпускания. И длиться он для среднестатической кнопки -около 0,5 мс. А вы как я понял боритесь с дребезгом именно в момент нажатия, отсюда и не получаете результат. Так что нужно полностью изменить логику.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

dimax пишет:

ggreenpowerp, я тут как-то приводил осциллограммы дребезга. Основной дребез идёт не при нажатии на кнопку (в этот момент дребезга вообще зачастую не бывает), а в момент отпускания. И длиться он для среднестатической кнопки -около 0,5 мс. А вы как я понял боритесь с дребезгом именно в момент нажатия, отсюда и не получаете результат. Так что нужно полностью изменить логику.

Попробую сегодня вечером поставить таймер на отпускание, где-то 10мс думаю хватит. На нажим тоже оставлю, где-то 3мс, думаю тоже хватит.

Спасибо за помощь.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

сделал антидребезг при отжимании(отпускании) кнопки. Результат тот же. Иногда работает через раз, плюс, иногда работает почему-то в инвертированном состоянии(отпускаешь кнопку - действие, нажимаешь - ничего). Не могу понять с чем связано. Код прилагаю.

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46
#define midi_SW_CC2 0x47
#define midi_SW_CC3 0x48
#define midi_SW_CC4 0x49
#define midi_SW_CC5 0x4A
#define midi_SW_CC6 0x4B
#define midi_SW_CC7 0x4C
#define midi_SW_CC8 0x4D
#define midi_SW_CC9 0x4E
#define midi_SW_CC10 0x4F

int flag = 0;

int buttonpin7 = 7;

unsigned long timer = 0;
unsigned long timer2 = 0;

unsigned long debounce = 3;


void setup() 
{
  Serial.begin(31250);
  
  pinMode(buttonpin7, INPUT);
}
void loop() {

int buttonread7 = digitalRead(buttonpin7);


if (buttonread7 == HIGH && flag == 0)
 {
  if ((millis() - timer) >= debounce)
  {
    if(buttonread7 == HIGH ) 
    {
    midi_SN_CM(midi_cc, midi_SW_CC1, midiON);
    
    timer = millis();    
    flag = 1;
    }
   }
 } 

 if(buttonread7 == LOW && flag == 1) 
 {
  if (millis() - timer2 >= 10)
  {
    if(buttonread7 == LOW)
    {
      flag = 0;
      timer2 = millis();
      }
    }
  }

}

void midi_SN_CM(int channel, int pitch, int velocity)
{
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
}

 

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

Я не понимаю , зачем бороться с антидрезезгом. Программы , как я думаю, должны что-то делать. Тем более вроде "принимать участие в жизни человека". Процессор все же считает очень быстро. Вот и вылезают проблемы, которые просто не зачем решать.

Разбейте время на 0,1 сек . Вот и раз в 0,1 сек обрашивайте клавишу и сохраняйте ее состояние в памяти, нажата/отжата. 

#define buttonPin 2 
boolean Button=0;
boolean Button1=0;

void setup() {
 // программирование выв.Arduino
 Serial.begin(9600);
pinMode(buttonPin, INPUT);
}

void loop() {
 delay(100);// пауза 0,1 сек на цикл
  Button1=Button;
  Button=digitalRead(buttonPin);
 if ((Button==0)&(Button1==1)) Serial.println("on ");
 }

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ggreenpowerp, вы удлинили скетч, но логику так и не изменили. Вот смотрите, условие сработало по HIGH, вы кнопку отпустили. Появился первый LOW - сразу вошли по условию 51 строки, затем сразу по условию  53 строки, и обработали всё до 58 строки. И тут пришёл дребезг после LOW. И по дребезгу мы опять влетаем на исполнение..

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015


Я понимаю что чужими трудами легко обойтись, но, поскольку я только учусь(полный нуб), думаю что понять, что да как, очень даже нужно. Надо понимать смысл работы элементарных вещей, а не сразу "master of puppets" :)

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:
Я понимаю что чужими трудами легко обойтись, но, поскольку я только учусь(полный нуб), думаю что понять, что да как, очень даже нужно. Надо понимать смысл работы элементарных вещей, а не сразу "master of puppets" :)

изучи простой код класс титановый велосипед StopWatch. и тебе станет всё понятно - остальное заморочки с условиями логических состояний булевых переменных.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

dimax пишет:

ggreenpowerp, вы удлинили скетч, но логику так и не изменили. Вот смотрите, условие сработало по HIGH, вы кнопку отпустили. Появился первый LOW - сразу вошли по условию 51 строки, затем сразу по условию  53 строки, и обработали всё до 58 строки. И тут пришёл дребезг после LOW. И по дребезгу мы опять влетаем на исполнение..


Если честно, я совсем не понимаю как решить все это другой логикой. Буду думать. Может сойдет на меня озарение :)

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:
Я понимаю что чужими трудами легко обойтись, но, поскольку я только учусь(полный нуб), думаю что понять, что да как, очень даже нужно. Надо понимать смысл работы элементарных вещей, а не сразу "master of puppets" :)

изучи простой код класс титановый велосипед StopWatch. и тебе станет всё понятно - остальное заморочки с условиями логических состояний булевых переменных.


Спасибо. Постараюсь догнать все тонкости работы кода. Если что, можно в личку вам писать?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:
Спасибо. Постараюсь догнать все тонкости работы кода. Если что, можно в личку вам писать?

личка форуме отсутсвует - пиши в теме кода, который тебе не понятен.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:
Спасибо. Постараюсь догнать все тонкости работы кода. Если что, можно в личку вам писать?

личка форуме отсутсвует - пиши в теме кода, который тебе не понятен.


А слона я не заметил) ок. Буду писать в теме кода.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

dimax пишет:

ggreenpowerp, вы удлинили скетч, но логику так и не изменили. Вот смотрите, условие сработало по HIGH, вы кнопку отпустили. Появился первый LOW - сразу вошли по условию 51 строки, затем сразу по условию  53 строки, и обработали всё до 58 строки. И тут пришёл дребезг после LOW. И по дребезгу мы опять влетаем на исполнение..


Вопрос:
А как мог прийти дребезг, если я его вроде убрал, ну точнее, заморозил считывание на 10 мс до стабилизации состояния LOW?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ggreenpowerp, я уже сам запутался в вашем коде) На всякий случай -как кнопка включена, стягивающий резистор есть? Вы же ловите HIGH, значит вход должен быть притянут к gnd

ЗЫ: вроде понял -у  вас два ограничителя времени первый по HIGH , второй про LOW. Но пока вы держите кнопку -10 мс первого ограничения уже пройдут, и команда выполниться повторно от дребезга как только вы отпустите кнопку.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

dimax пишет:

ggreenpowerp, я уже сам запутался в вашем коде) На всякий случай -как кнопка включена, стягивающий резистор есть? Вы же ловите HIGH, значит вход должен быть притянут к gnd

ЗЫ: вроде понял -у  вас два ограничителя времени первый по HIGH , второй про LOW. Но пока вы держите кнопку -10 мс первого ограничения уже пройдут, и команда выполниться повторно от дребезга как только вы отпустите кнопку.


Да, подтягивающий резистор на землю( 10ком) есть. Переменная "flag" для того, чтобы считать одиночное нажатие, а не бесконечное по удержанию.
Точно, этого не учел. Действительно, пока удерживаю, 10 мс проходит, далее начинаются карусели. Буду думать как изменить. Нужно только одно считывание на один клик.

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

 

[/quote]  Действительно, пока удерживаю, 10 мс проходит, далее начинаются карусели. Буду думать как изменить. Нужно только одно считывание на один клик.[/quote]

Процессор он перепад не ловит. Он ловит состояние, 0 или 1, нажата или отпущено. Так что програмно надо ловить перепад, когда кнопку нажимают 1-> 0 или отжимают 0->1 . Тогда  у вас одно нажатие - оно выполнение этой программы.  Но есть влияние дребезга , когда процессор может одно нажатие посчитать множественым. Вот для этого есть принцип 1 измерение , пауза больше чем время дребезга и еще измерение.  

То есть банально разнести события измерения уровня опроса клавиши.  Конечно тогда возникает погрешность измерения временного интервала. Временем нажатия считать 1 измерение или 2 измерение.  Немного отвлекаясь если у вас есть линейка с шагом в 1 мм, то измерить длину с точностью 0,1 мм у вас хрен получится. Так и с кнопками. Если у вас дребезжащая кнопка, то точность + - дребезг. Или берите кнопку без дребега- на датчиках Холла.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

qwone пишет:

 

 Действительно, пока удерживаю, 10 мс проходит, далее начинаются карусели. Буду думать как изменить. Нужно только одно считывание на один клик

Процессор он перепад не ловит. Он ловит состояние, 0 или 1, нажата или отпущено. Так что програмно надо ловить перепад, когда кнопку нажимают 1-> 0 или отжимают 0->1 . Тогда  у вас одно нажатие - оно выполнение этой программы.  Но есть влияние дребезга , когда процессор может одно нажатие посчитать множественым. Вот для этого есть принцип 1 измерение , пауза больше чем время дребезга и еще измерение.  

То есть банально разнести события измерения уровня опроса клавиши.  Конечно тогда возникает погрешность измерения временного интервала. Временем нажатия считать 1 измерение или 2 измерение.  Немного отвлекаясь если у вас есть линейка с шагом в 1 мм, то измерить длину с точностью 0,1 мм у вас хрен получится. Так и с кнопками. Если у вас дребезжащая кнопка, то точность + - дребезг. Или берите кнопку без дребега- на датчиках Холла.

[/quote]
То есть, вы имеете ввиду, что имея дребезжащую кнопку то, как бы я не старался убрать дребезг программным способом, все равно дребезг будет, в той или иной степени, и избавиться от него полностью программным методом не получиться?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ggreenpowerp, сложно бороться с врагом не видя его в лицо :) Вот примеры дребезга.

Левая картинка полный импульс от кнопки, -правая увеличенный восходящий фронт этого-же импульса. Как видно дребезг длится 1 мс.

Тут левая картинка тоже полный импульс от кнопки, правая картинка -увеличенный нисходящий фронт импульса. Дребезг длиться 2 мс.

Теперь можно написать  упрощённый алгоритм обработки кнопки:

int x;
void setup() {
Serial.begin(9600);
}
void loop() {
 if (digitalRead(A1)==HIGH) { //если нажато
    x++; Serial.println(x); // выполняем команду
    delay(10); //ждём пока подребезжит с запасом
    while(digitalRead(A1)==HIGH); //ждём отпускания кнопки
    delay(10); //ждём снова пока подребезжит
     } //теперь знаем что кнопка отпущена и дребезга не будет
}

Убедиться что всё идеально работает, и наконец  всё переделать на  функцию нетормозящую Loop. Или плюнуть, и воспользоваться готовой библиотекой  :-)))

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

[/quote] То есть, вы имеете ввиду, что имея дребезжащую кнопку то, как бы я не старался убрать дребезг программным способом, все равно дребезг будет, в той или иной степени, и избавиться от него полностью программным методом не получиться?[/quote]

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

http://nauchebe.net/2011/04/knopki-pereklyuchateli-v-sxemax-na-mk/

Вот еще. Скорее всего вам не нужна идеальная кнопка для вашего проекта.

 Да и еще. вариант. Подцепить кнопку на аналоговый вход и снимать аналоговый сингнал. Сделать некий аналоговый корпоратор программным путем.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Ну что ж.

Думал думал, и додумал до библиотеки "BOUNCE2". :D

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

код конечно прилагаю:

#include <Bounce2.h>



#define BUTTON1 7
#define led 2

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46
#define midi_SW_CC2 0x47
#define midi_SW_CC3 0x48
#define midi_SW_CC4 0x49
#define midi_SW_CC5 0x4A
#define midi_SW_CC6 0x4B
#define midi_SW_CC7 0x4C
#define midi_SW_CC8 0x4D
#define midi_SW_CC9 0x4E
#define midi_SW_CC10 0x4F

int flag = 0;

Bounce debouncer = Bounce();


void setup() 
{
  Serial.begin(31250);
  pinMode(led, OUTPUT);
  pinMode(BUTTON1, INPUT);
  debouncer.attach(BUTTON1);
  debouncer.interval(10);
}
void loop() 
{
  
  if (debouncer.update() && debouncer.read() == HIGH)
{
  midi_SN_CM(midi_cc, midi_SW_CC1, midiOFF);
digitalWrite(led, !digitalRead(led));
  }    
 
}
void midi_SN_CM(int channel, int pitch, int velocity)
{
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
 
} 

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:

Думал думал, и додумал до библиотеки "BOUNCE2". :D

Вылез следующий не понятный момент.

слушай, ну уже прямо скучно смотреть на твоё путешествие по граблям - реализуй свой проект на том, что не глючит и интуитивно понятно.

затем, разбирайся с персональными тараканами.


#include <class_BUTTON.h>

BUTTON BUTTON_01( 3); // объявляем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину 3.
// BUTTON BUTTON_02(**);
// BUTTON BUTTON_03(**);
// BUTTON BUTTON_04(**);
// BUTTON BUTTON_05(**);
// BUTTON BUTTON_06(**);
// BUTTON BUTTON_07(**);
// BUTTON BUTTON_08(**);
// BUTTON BUTTON_09(**);
// BUTTON BUTTON_10(**);

void setup() {}

void loop() {

BUTTON_01.read(); // обновляем состояние переменных кнопки BUTTON_01.
// BUTTON_02.read();
// BUTTON_03.read();
// BUTTON_04.read();
// BUTTON_05.read();
// BUTTON_06.read();
// BUTTON_07.read();
// BUTTON_08.read();
// BUTTON_09.read();
// BUTTON_10.read();

//~~~~~~~~~~~~~~~~~~
// if (BUTTON_**.click_down) {}
// if (BUTTON_**.click_up) {}
// if (BUTTON_**.doubleclick) {}
// if (BUTTON_**.timer) {}
// if (BUTTON_**.retention) {}
//~~~~~~~~~~~~~~~~~~
if (BUTTON_01.click_down) {} // что-то делаем при нажатии кнопки BUTTON_01.
// if (BUTTON_02.click_down) {}
// if (BUTTON_03.click_down) {}
// if (BUTTON_04.click_down) {}
// if (BUTTON_05.click_down) {}
// if (BUTTON_06.click_down) {}
// if (BUTTON_07.click_down) {}
// if (BUTTON_08.click_down) {}
// if (BUTTON_09.click_down) {}
// if (BUTTON_10.click_down) {}

}

 

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:

Думал думал, и додумал до библиотеки "BOUNCE2". :D

Вылез следующий не понятный момент.

слушай, ну уже прямо скучно смотреть на твоё путешествие по граблям - реализуй свой проект на том, что не глючит и интуитивно понятно.

затем, разбирайся с персональными тараканами.


#include <class_BUTTON.h>

BUTTON BUTTON_01( 3); // объявляем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину 3.
// BUTTON BUTTON_02(**);
// BUTTON BUTTON_03(**);
// BUTTON BUTTON_04(**);
// BUTTON BUTTON_05(**);
// BUTTON BUTTON_06(**);
// BUTTON BUTTON_07(**);
// BUTTON BUTTON_08(**);
// BUTTON BUTTON_09(**);
// BUTTON BUTTON_10(**);

void setup() {}

void loop() {

BUTTON_01.read(); // обновляем состояние переменных кнопки BUTTON_01.
// BUTTON_02.read();
// BUTTON_03.read();
// BUTTON_04.read();
// BUTTON_05.read();
// BUTTON_06.read();
// BUTTON_07.read();
// BUTTON_08.read();
// BUTTON_09.read();
// BUTTON_10.read();

//~~~~~~~~~~~~~~~~~~
// if (BUTTON_**.click_down) {}
// if (BUTTON_**.click_up) {}
// if (BUTTON_**.doubleclick) {}
// if (BUTTON_**.timer) {}
// if (BUTTON_**.retention) {}
//~~~~~~~~~~~~~~~~~~
if (BUTTON_01.click_down) {} // что-то делаем при нажатии кнопки BUTTON_01.
// if (BUTTON_02.click_down) {}
// if (BUTTON_03.click_down) {}
// if (BUTTON_04.click_down) {}
// if (BUTTON_05.click_down) {}
// if (BUTTON_06.click_down) {}
// if (BUTTON_07.click_down) {}
// if (BUTTON_08.click_down) {}
// if (BUTTON_09.click_down) {}
// if (BUTTON_10.click_down) {}

}

 

Придется тащить все моменты библиотеками, так как по сути вообще ни.рена не понимаю:) Буду сегодня изучать ваш «клас титановый велосипед“.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:
Буду сегодня изучать ваш «клас титановый велосипед“.

нечего там изучать - брать и юзать.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:
Буду сегодня изучать ваш «клас титановый велосипед“.

нечего там изучать - брать и юзать.

 

Ну что ж. Прикрутил "клас титановый велосипед". Работает точно так же как и "BOUNCE2". Светодиод загорается на первый клик, а команда midi_SW_CC1 только каждый третий. 
код:

#include <class_BUTTON.h>


#define led 2

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46
#define midi_SW_CC2 0x47
#define midi_SW_CC3 0x48
#define midi_SW_CC4 0x49
#define midi_SW_CC5 0x4A
#define midi_SW_CC6 0x4B
#define midi_SW_CC7 0x4C
#define midi_SW_CC8 0x4D
#define midi_SW_CC9 0x4E
#define midi_SW_CC10 0x4F

int flag = 0;
BUTTON BUTTON_01(7);

void setup() 
{
  Serial.begin(31250);
  pinMode(led, OUTPUT);

 
}
void loop() 
{
  
  BUTTON_01.read(); 
  
 if (BUTTON_01.click_down) {
  midi_SN_CM(midi_cc, midi_SW_CC1, midiON);
  digitalWrite(led, !digitalRead(led));
 }
}
void midi_SN_CM(int channel, int pitch, int velocity)
{
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
 
}

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:

Светодиод загорается на первый клик, а команда midi_SW_CC1 только каждый третий. 

ну, и кто в этом виноват? - светодиод или команда МИДИ и КРЕВЕТКА?

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:

Светодиод загорается на первый клик, а команда midi_SW_CC1 только каждый третий. 

ну, и кто в этом виноват? - светодиод или команда МИДИ и КРЕВЕТКА?

 

в том то и дело что я вообще не знаю кто(что) в этом виноват(то), по-этому и пишу сюда. Знал бы - не писал бы.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:

в том то и дело что я вообще не знаю кто(что) в этом виноват(то), по-этому и пишу сюда. Знал бы - не писал бы.

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

void loop() {

BUTTON_01.read();
static unsigned int b = 0;
if (BUTTON_01.click_down) {++b; Serial.println(b);}

}

*про что у тебя тема? про дребезг или про шмиди?

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:

в том то и дело что я вообще не знаю кто(что) в этом виноват(то), по-этому и пишу сюда. Знал бы - не писал бы.

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

void loop() {

BUTTON_01.read();
static unsigned int b = 0;
if (BUTTON_01.click_down) {++b; Serial.println(b);}

}

*про что у тебя тема? про дребезг или про шмиди?

 

дребезга нет! Библиотеки "Bounce2" и "титановый велосипед " справились отлично. Спасибо за помощь. 

На счет "Шмиди". Просто не хочу создавать новую тему, дабы не нагружать и не засирать форум, одними и теми же вопросами. По этому, если кому не лень, напишите почему команда проходит на третий клик.

Основная тема закрыта(решено). Всем спасибо.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ты бы для начала объяснил, что это вообще такое?

midi_SN_CM(midi_cc, midi_SW_CC1, midiON);

void midi_SN_CM(int channel, int pitch, int velocity)

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ты бы для начала объяснил, что это вообще такое?

midi_SN_CM(midi_cc, midi_SW_CC1, midiON);

void midi_SN_CM(int channel, int pitch, int velocity)

 

отправляет в звуковую карту по миди каналу команду.

midi_SN(send)_CM(command)    

channel(номер канала на каком работает миди. В данном случае 1(первый(из 16 возможных) 0xB0.

pitch(высота ноты, но, в данном случае команда номер 70(из 127 возможных)) 0x46.

velocity(с какой силой нажата клавиша, но в данном случае или команда 70 вкл или выкл. 0-64 выкл. 65-127 вкл. 0x7F)

 

итог. Должно одновременно в миди отправить три значения по этому порядку: channel, pitch, velocity. 

ну как то так :)

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

не совсем понятно, где у тебя МИДИ-фейс? МИДИ по сериалу подключено?

а, так, что происходит? - тоже с третьего раза?


#include <class_BUTTON.h>

#define led 2

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46
#define midi_SW_CC2 0x47
#define midi_SW_CC3 0x48
#define midi_SW_CC4 0x49
#define midi_SW_CC5 0x4A
#define midi_SW_CC6 0x4B
#define midi_SW_CC7 0x4C
#define midi_SW_CC8 0x4D
#define midi_SW_CC9 0x4E
#define midi_SW_CC10 0x4F

// int flag = 0; // а, это что за нах?
BUTTON BUTTON_01(7);

void setup() {
Serial.begin(31250);
pinMode(led, OUTPUT);
}

void loop() {
BUTTON_01.read(); 
if (BUTTON_01.click_down) {
Serial.write(midi_cc);
Serial.write(midi_SW_CC1);
Serial.write(midiON);
digitalWrite(led, !digitalRead(led));
}
}

 

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

не совсем понятно, где у тебя МИДИ-фейс? МИДИ по сериалу подключено?

а, так, что происходит? - тоже с третьего раза?


#include <class_BUTTON.h>

#define led 2

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46
#define midi_SW_CC2 0x47
#define midi_SW_CC3 0x48
#define midi_SW_CC4 0x49
#define midi_SW_CC5 0x4A
#define midi_SW_CC6 0x4B
#define midi_SW_CC7 0x4C
#define midi_SW_CC8 0x4D
#define midi_SW_CC9 0x4E
#define midi_SW_CC10 0x4F

// int flag = 0; // а, это что за нах?
BUTTON BUTTON_01(7);

void setup() {
Serial.begin(31250);
pinMode(led, OUTPUT);
}

void loop() {
BUTTON_01.read(); 
if (BUTTON_01.click_down) {
Serial.write(midi_cc);
Serial.write(midi_SW_CC1);
Serial.write(midiON);
digitalWrite(led, !digitalRead(led));
}
}

 

Да, так тоже пробовал, тоже с третьего раза. Следующий момент. Пакетно три команды отправляет только через if millis()-...... Если антидребезг сделать через delay, то только с третьего раза. Даже не знаю с чем связано.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:

Следующий момент. Пакетно три команды отправляет только через if millis()-...... Если антидребезг сделать через delay, то только с третьего раза.

перефразируй - существует ли хоть один вариант, когда работает сразу?

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:

Следующий момент. Пакетно три команды отправляет только через if millis()-...... Если антидребезг сделать через delay, то только с третьего раза.

перефразируй - существует ли хоть один вариант, когда работает сразу?

сразу отправляет на первый клик, только так:

#define button 7

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46




unsigned long time = 0;
unsigned long interval = 25;


void setup()
{
Serial.begin(31250);
pinMode(button, INPUT);

}

void loop()
    {

int bread = digitalRead(button);

if(bread == HIGH)
 {   
if(millis() - time >= interval)
 {       
   if(bread == HIGH)
   {    
midi_SN_CM(midi_cc, midi_SW_CC1, midiON);
time = millis();
}  
}   
}    
}
void midi_SN_CM(int channel, int pitch, int velocity)
{
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
 
}

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

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:

сразу отправляет на первый клик, только так:

ты сам себе на слово веришь? - убедись, что это не так:



#define button 7

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46




unsigned long time = 0;
unsigned long interval = 25;


void setup()
{
Serial.begin(31250);
pinMode(button, INPUT);

}

void loop()
    {

int bread = digitalRead(button);

if(bread == HIGH)
 {   
if(millis() - time >= interval)
 {       
   if(bread == HIGH)
   {    
midi_SN_CM(midi_cc, midi_SW_CC1, midiON);
time = millis();

// я туплю и не понимаю, что мой код шлёт больше одного клика.
static unsigned int b = 0;
++b;
Serial.println(b);
// 

}  
}   
}    
}
void midi_SN_CM(int channel, int pitch, int velocity)
{
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
}

 

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:

сразу отправляет на первый клик, только так:

ты сам себе на слово веришь? - убедись, что это не так:



#define button 7

#define midi_cc 0xB0
#define midiOFF 0x00
#define midiON 0x7F

#define midi_SW_CC1 0x46




unsigned long time = 0;
unsigned long interval = 25;


void setup()
{
Serial.begin(31250);
pinMode(button, INPUT);

}

void loop()
    {

int bread = digitalRead(button);

if(bread == HIGH)
 {   
if(millis() - time >= interval)
 {       
   if(bread == HIGH)
   {    
midi_SN_CM(midi_cc, midi_SW_CC1, midiON);
time = millis();

// я туплю и не понимаю, что мой код шлёт больше одного клика.
static unsigned int b = 0;
++b;
Serial.println(b);
// 

}  
}   
}    
}
void midi_SN_CM(int channel, int pitch, int velocity)
{
  Serial.write(channel);
  Serial.write(pitch);
  Serial.write(velocity);
}

 

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ggreenpowerp, а в этом скетче у вас через 25мс держания кнопки сработает повторно. Так что скорее всего тут тоже с третьего раза, просто тут вы не контролируете ситуацию. Видимо сериал не успевает отправить все три команды подряд, попробуйте команду serial.flush() после каждого байта отсылки.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:

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

слушай, твой тупняк уже утомил - твоя шмиди не работает с одного клика.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Клапауций 232 пишет:

ggreenpowerp пишет:

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

слушай, твой тупняк уже утомил - твоя шмиди не работает с одного клика.

прилагаю тебе гифку которую только что снял:https://drive.google.com/open?id=0B-keRyLxrrvheHhzTGxFLTFXZVE

Три нажатия: светодиод загорелся, потух, загорелся. На третий клик команда миди на экране.

Я понимаю что достал мой тупняк, так не помогай.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

dimax пишет:

ggreenpowerp, а в этом скетче у вас через 25мс держания кнопки сработает повторно. Так что скорее всего тут тоже с третьего раза, просто тут вы не контролируете ситуацию. Видимо сериал не успевает отправить все три команды подряд, попробуйте команду serial.flush() после каждого байта отсылки.

К сожалению не помогло. Спасибо.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ggreenpowerp пишет:

На третий клик команда миди на экране.

ну? и, кто виноват, если твоя миди с третьего пинка работает?

я должен читать мануалы к твоей миди?