Показать сообщение отдельно
Старый 29.11.2015, 12:31   #49
TransF
Старший Пользователь
 
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 131
TransF is on a distinguished road
По умолчанию

Цитата:
Сообщение от ali_vlad Посмотреть сообщение
Дребезг контактов надо подавлять. Или аппаратно или программно. На мой взгляд самый простой способ - использование библиотеки bounce. А иначе глюки будут всегда.
Так же не забыаайте про "подтяжку" кнопок по питанию. Или к плюсу или к земле. На столе может работать идеально, а в машине может глючить.
(С дребезгом всё норм, по крайней мере на столе. аппаратно он заглушен 104 конденсаторам. Глюков НЕТ.) всё изменилось((

не смог реализовать переключения треков, нашел скетч, вот отсюда https://www.drive2.ru/c/2347322/
он к сожалению далек от идеала, и появился бешенный зребезг

поскажите пожалуйста как в этом скетче реализовать подавление дребезга библиотекой bounce
Код HTML:
int analogPin=0;
int data;
unsigned long currentTime;
unsigned long loopTime;
const int pin_enc_A = 8; /// звук
const int pin_enc_B = 9; /// звук
const int pin_enc_C = 5; /// переключение
const int pin_enc_D = 4; /// переключение

unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
unsigned char encoder_C;
unsigned char encoder_D;
unsigned char encoder_C_prev=0;
void setup() {             

Keyboard.begin(); 
Serial.begin(9600);
pinMode(pin_enc_A, INPUT_PULLUP); // encoder 1
pinMode(pin_enc_B, INPUT_PULLUP); // encoder 2
pinMode(pin_enc_C, INPUT_PULLUP); // encoder 1
pinMode(pin_enc_D, INPUT_PULLUP); // encoder 2
currentTime = millis();
loopTime = currentTime;
///attachInterrupt(4, key_mute, FALLING);

} 
void loop() {
 currentTime = millis();
 if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_C = digitalRead(pin_enc_C); // считываем состояние выхода А энкодера
encoder_D = digitalRead(pin_enc_D); // считываем состояние выхода А энкодера
if((!encoder_C) && (encoder_C_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_D)
{
// выход В в полож. сост., значит вращение по часовой стрелке
Remote.next();
delay(10);
Remote.clear();
}
else {
Remote.previous();
delay(10);
Remote.clear();
}
} encoder_C_prev = encoder_C;

}

////энкодер 2

currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_enc_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_enc_B); // считываем состояние выхода А энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
// выход В в полож. сост., значит вращение по часовой стрелке
Remote.increase();
delay(5);
Remote.clear();
}
else {
Remote.decrease();
delay(5);
Remote.clear();
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла

loopTime = currentTime;
}

 data=analogRead(analogPin); //читаем значение нажатой кнопки
  Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
  /*поддерживаемые коды управляющих клавиш
  http://arduino.cc/en/Reference/KeyboardModifiers*/
  if (data>=28 && data<=35)  // приглушение звука
    {
      Remote.mute();
      Remote.clear();
    }
  if (data>=58 && data<=65)  // воспроизведение / пауза
    {
      Remote.play_pause();
      Remote.clear();
    }
  if (data>=140 && data<=150)  // домой
    {
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
    }
    if (data>=88 && data<=95)  // ALT+TAB
    {
Keyboard.press(KEY_LEFT_ALT);  
Keyboard.press(KEY_TAB);  
Keyboard.release(KEY_TAB);  
Keyboard.press(KEY_TAB);  
Keyboard.releaseAll();
}
  delay(180);
}
__________________

AUDI A6 (C5) V6 2.8L

Последний раз редактировалось TransF; 29.11.2015 в 23:02.
TransF вне форума   Ответить с цитированием