Включение подтягивающих резисторов

GRAFLEKX
Offline
Зарегистрирован: 13.07.2015

Здравствуйте друзья.

Есть код, который приведен ниже.

Этот код обрабатывает нажатия нерезистивных кнопок и отправляет код f5, f6 и т.д. на девайс, которым необходимо управлять с пульта ДУ.

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

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

Заранее благодарен за любую помощь!

Код скетча:



// set pin numbers:
// READ
const int PIN_BLACK = 6;
const int PIN_RED   = 7;
const int PIN_BROWN = 5;
// WRITE
const int PIN_GREEN  = 4;
const int PIN_BLUE   = 3;
const int PIN_YELLOW = 2;


// Блокировка повторного нажатия (фильтр дрожания контактов)
const int TREMOR_FILTER = 70;//(мс)
// Период повторного срабатывания зажатой кнопки
const int REPEAT_DELAY = 200;//(мс)
// Время короткого нажатия кнопки "Mute"
const int MUTE_SHORT_PRESS = 300;//(мс)
// Время длинного  нажатия кнопки "Mute"
const int MUTE_LONG_PRESS = 2000;//(мс)
// Число повторов действия после короткого нажатия кнопки "Mute"
const int MUTE_VALUE1_COUNT = 30;

//------------- КНОПКИ ---------------------------------
struct TButton{
  boolean State;
  unsigned long SwitchedOnTime;
  char* Name;
  boolean LongPressRepeat;
  char Value;
};
//-------------vvvvvvvv---------------------------------
struct TButton btnRadio = {false,0,      "Radio", false, KEY_F7};
struct TButton btnMedia = {false,0,      "Media", false, KEY_ESC};
struct TButton btnPlus  = {false,0,      "Plus",  true,  KEY_F12}; // с повтором срабатывания при зажатии
struct TButton btnMinus = {false,0,      "Minus", true,  KEY_F11}; // с повтором срабатывания при зажатии
struct TButton btnOk    = {false,0,      "Ok",    false, KEY_RETURN};
//------------------------------------------------------


//------------- КНОПКА "Mute" --------------------------
struct TMuteButton{
  boolean State;
  unsigned long SwitchedOnTime;
  boolean VeryLongPressPerformed;
  char* Name;
  char Value1, Value2, Value3;
};
//-----------------vvvvvvv------------------------------
struct TMuteButton btnMute  = {false,0,false,  "Mute", KEY_F11, KEY_F3, KEY_F4};
//------------------------------------------------------


//------------- КРУТИЛКА -------------------------------
int jogPosition=0;
//
char JogAction_UP = KEY_F5;
char JogAction_DN = KEY_F6;
//------------------------------------------------------


unsigned long CurTime;//время (millis) текущего цикла loop

void setup() {
  // initialize control over the keyboard
  Keyboard.begin();
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
  // initialize the pins:
  // READ
  pinMode(PIN_BLACK,  INPUT);
  pinMode(PIN_RED,    INPUT);
  pinMode(PIN_BROWN,  INPUT);
  // WRITE
  pinMode(PIN_GREEN,  OUTPUT);
  pinMode(PIN_BLUE,   OUTPUT);
  pinMode(PIN_YELLOW, OUTPUT);
  //
  digitalWrite(PIN_GREEN,  LOW);
  digitalWrite(PIN_BLUE,   LOW);
  digitalWrite(PIN_YELLOW, LOW);
}


void HID_KeyPress(char key){
  Keyboard.press(key);
  delay(1);
  Keyboard.releaseAll();
}



void setButtonState(struct TButton &Button, boolean newState){
  if (Button.State==newState) {
    if (!newState)
      return;//состояние кнопки (false) не изменилось
    if (!Button.LongPressRepeat || !(CurTime-Button.SwitchedOnTime>=REPEAT_DELAY))
      return;//состояние кнопки (true) не изменилось
  };

  Button.State=newState;
  if (newState) {
    if (CurTime-Button.SwitchedOnTime<=TREMOR_FILTER)
      return;//фильтрация дрожания контактов
    Button.SwitchedOnTime=CurTime;//запоминаем время нажатия кнопки
  };

  if (newState) {
    // Действие при нажатии
    Serial.print(CurTime); Serial.print("  "); Serial.print(Button.Name); Serial.println(" - pressed");
    HID_KeyPress(Button.Value);
  }else{
    // Действие при отпускании
    Serial.print(CurTime); Serial.print("  "); Serial.print(Button.Name); Serial.println(" - released");
  };
}



void setMuteButtonState(struct TMuteButton &Button, boolean newState){
  unsigned long delta = CurTime-Button.SwitchedOnTime;

  if (Button.State==newState) {
    if (!newState)
      return;//состояние кнопки (false) не изменилось
    else {
      //проверить срабатывание сверхдлинного нажатия
      if (delta > MUTE_LONG_PRESS) if (!Button.VeryLongPressPerformed) {
        Serial.print(CurTime); Serial.print("  "); Serial.print(Button.Name); Serial.println(" - very long press");
        HID_KeyPress(Button.Value3);
        Button.VeryLongPressPerformed=true;
      };
      return;//состояние кнопки (true) не изменилось
    };
  };

  Button.State=newState;
  if (newState) {
    if (delta<=TREMOR_FILTER)
      return;//фильтрация дрожания контактов
    Button.SwitchedOnTime=CurTime;//запоминаем время нажатия кнопки
    Button.VeryLongPressPerformed=false;
  };

  if (newState) {
    // Действие при нажатии
    Serial.print(CurTime); Serial.print("  "); Serial.print(Button.Name); Serial.println(" - pressed");
  }else{
    // Действие при отпускании
    Serial.print(CurTime); Serial.print("  "); Serial.print(Button.Name); Serial.print(" - released");
    
    if (!Button.VeryLongPressPerformed) {
      if (delta < MUTE_SHORT_PRESS) {
        Serial.print(" - short");
        for (byte i=0; i<MUTE_VALUE1_COUNT; i++)
          HID_KeyPress(Button.Value1);        
      }else{
        Serial.print(" - long");
        HID_KeyPress(Button.Value2);
      };
    };
    
    Serial.println("");
  };
}



void setJogPosition(int value){
  if (value==jogPosition) return;
  if (jogPosition==0) {
      Serial.print("JOG INIT "); Serial.println(value);
      jogPosition=value;
      return;
  };

  if ((value==3 && jogPosition==2) || (value==2 && jogPosition==1) || (value==1 && jogPosition==3)) {
    // Действие при щелчке вниз
    Serial.print(CurTime); Serial.print("  Jog("); Serial.print(value); Serial.println(") - Down");
    HID_KeyPress(JogAction_DN);
  }else{
    // Действие при щелчке вверх
    Serial.print(CurTime); Serial.print("  Jog("); Serial.print(value); Serial.println(") - Up");
    HID_KeyPress(JogAction_UP);
  };
  jogPosition=value;
}

byte tempJogPos; 
byte tempJogsCount;

void loop(){
    CurTime=millis();
    tempJogsCount=0;

    digitalWrite(PIN_YELLOW, LOW);
  //digitalWrite(PIN_BLUE,   LOW);
    digitalWrite(PIN_GREEN,  HIGH);
    setButtonState(btnRadio, digitalRead(PIN_BLACK)==HIGH);
    setButtonState(btnOk,    digitalRead(PIN_RED  )==HIGH);
    if (digitalRead(PIN_BROWN)==HIGH) {tempJogsCount++; tempJogPos = 1;};

    digitalWrite(PIN_GREEN,  LOW);
  //digitalWrite(PIN_YELLOW, LOW);
    digitalWrite(PIN_BLUE,   HIGH);
    setMuteButtonState(btnMute, digitalRead(PIN_BLACK)==HIGH);
    setButtonState(btnPlus,     digitalRead(PIN_RED  )==HIGH);
    if (digitalRead(PIN_BROWN)==HIGH) {tempJogsCount++; tempJogPos = 2;};

    digitalWrite(PIN_BLUE,   LOW);
  //digitalWrite(PIN_GREEN,  LOW);
    digitalWrite(PIN_YELLOW, HIGH);
    setButtonState(btnMedia, digitalRead(PIN_BLACK)==HIGH);
    setButtonState(btnMinus, digitalRead(PIN_RED  )==HIGH);
    if (digitalRead(PIN_BROWN)==HIGH) {tempJogsCount++; tempJogPos = 3;};
    
    if (tempJogsCount==1) setJogPosition(tempJogPos);   
}

 

std
Offline
Зарегистрирован: 05.01.2012

в setup()

pinMode(N,INPUT_PULLUP);
GRAFLEKX
Offline
Зарегистрирован: 13.07.2015

std пишет:

в setup()





pinMode(N,INPUT_PULLUP);

Спасибо.

Попробовал, но к сожалению тоже самое - случайная генерация нажатия кнопок и добавилось мигание TX-Led.

Блин, в пору хоть плюнь и ставь внешние подтягивающие резисторы на массу ((

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

Точнее будет не в setup, а в  нужный момент......
Если "навсегда"- то, конечно, в setup.....

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

GRAFLEKX, выражение "подтягивающий резистор на массу" ,если придираться, -совершенно лишено смысла.  Подтягивающий резистор нужен в том случае, если кнопка стоит между пином и общим. Если у вас кнопка стоит относительно плюса, то единственный вариант -это внешний стягивающий резистор.

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

Внутренний PULLDOWN в Мегапроцессорах отсутствует.
Выкручивайтесь как хотите.
Например с помощью буквы !
;)

GRAFLEKX
Offline
Зарегистрирован: 13.07.2015

dimax пишет:

GRAFLEKX, выражение "подтягивающий резистор на массу" ,если придираться, -совершенно лишено смысла.  Подтягивающий резистор нужен в том случае, если кнопка стоит между пином и общим. Если у вас кнопка стоит относительно плюса, то единственный вариант -это внешний стягивающий резистор.

Вот, ценная мысль, спасибо! Вы меня как раз пиннули в нужном направлении.

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

Замыкать на массу, я тоже не могу, так устроен пульт, там каждый 2-ой контакт - общий между двумя кнопками.

Следовательно припаяю три стягивающих резистора на 30-40К и забуду о проблеме.

Всем спасибо большое, вопрос решен.