Включение подтягивающих резисторов
- Войдите на сайт для отправки комментариев
Пнд, 13/07/2015 - 01:20
Здравствуйте друзья.
Есть код, который приведен ниже.
Этот код обрабатывает нажатия нерезистивных кнопок и отправляет код 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);
}
в setup()
в setup()
Спасибо.
Попробовал, но к сожалению тоже самое - случайная генерация нажатия кнопок и добавилось мигание TX-Led.
Блин, в пору хоть плюнь и ставь внешние подтягивающие резисторы на массу ((
Точнее будет не в setup, а в нужный момент......
Если "навсегда"- то, конечно, в setup.....
GRAFLEKX, выражение "подтягивающий резистор на массу" ,если придираться, -совершенно лишено смысла. Подтягивающий резистор нужен в том случае, если кнопка стоит между пином и общим. Если у вас кнопка стоит относительно плюса, то единственный вариант -это внешний стягивающий резистор.
Внутренний PULLDOWN в Мегапроцессорах отсутствует.
Выкручивайтесь как хотите.
Например с помощью буквы !
;)
GRAFLEKX, выражение "подтягивающий резистор на массу" ,если придираться, -совершенно лишено смысла. Подтягивающий резистор нужен в том случае, если кнопка стоит между пином и общим. Если у вас кнопка стоит относительно плюса, то единственный вариант -это внешний стягивающий резистор.
Вот, ценная мысль, спасибо! Вы меня как раз пиннули в нужном направлении.
Глупо вышло, но я вообще не обратил внимания, что я замыкаю кнопки не на массу, а между собой, поэтому вариант внутренних подтягивающих резисторов здесь не проканает.
Замыкать на массу, я тоже не могу, так устроен пульт, там каждый 2-ой контакт - общий между двумя кнопками.
Следовательно припаяю три стягивающих резистора на 30-40К и забуду о проблеме.
Всем спасибо большое, вопрос решен.