Код: Выделить всё
#define PIN_BUTTON 2
bool button_state = false;
bool button_auto_state = false;
uint32_t ms_button = 0;
uint32_t ms_auto_click = 0;
void setup()
{
Serial.begin(115200);
Serial.println("Test button ...");
pinMode(PIN_BUTTON, INPUT_PULLUP);
}
void loop(){
uint32_t ms = millis();
bool pin_state = digitalRead(PIN_BUTTON);
// Фиксируем нажатие кнопки
if( pin_state == LOW && !button_state && ( ms - ms_button ) > 50 ){
button_state = true;
button_auto_state = false;
ms_button = ms;
Serial.println("Press key");
}
// После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия
if( pin_state == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
button_auto_state = true;
ms_auto_click = ms;
Serial.println("Auto press key");
}
// Фиксируем отпускание кнопки
if( pin_state == HIGH && button_state && ( ms - ms_button ) > 50 ){
button_state = false;
ms_button = ms;
if( !button_auto_state )Serial.println("No press key");
}
}
На этой основе я наваял обработку кнопок так как мне было нужно. А именно - почти всё осталось по прежнему за исключением одного. Мне нужно было, что бы после того как мы длительно подержали кнопку, и отпустили её, срабатывал код "отпускание кнопки" Получился вот такой скетч, в который я добавил ещё одну кнопку. Возможно это коряво и не правильно, по крайне мере работает должным образом - как мне и было нужно.
Код: Выделить всё
#define PIN_BUTTON1 8 // пин кнопки 1
#define PIN_BUTTON2 12 // пин кнопки 2
bool button_state1 = false; // статус кнопки 1
bool button_state2 = false; // статус кнопки 2
uint32_t ms_button = 0;
uint32_t ms_auto_click = 0;
void setup()
{
Serial.begin(9600);
Serial.println("Test button ...");
pinMode(PIN_BUTTON1, INPUT_PULLUP);
pinMode(PIN_BUTTON2, INPUT_PULLUP);
}
void loop(){
uint32_t ms = millis();
bool pin_state1 = digitalRead(PIN_BUTTON1); // 1 кнопка
bool pin_state2 = digitalRead(PIN_BUTTON2); // 2 кнопка
// Фиксируем нажатие кнопки
if( pin_state1 == LOW && !button_state1 && ( ms - ms_button ) > 50 ){
button_state1 = true;
ms_button = ms;
Serial.println("Press key"); //короткое нажатие
}
// После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия
if( pin_state1 == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
ms_auto_click = ms;
Serial.println("Auto press key"); //длительное нажатие
}
// Фиксируем отпускание кнопки
if( pin_state1 == HIGH && button_state1 && ( ms - ms_button ) > 50 ){
button_state1 = false;
ms_button = ms;
Serial.println("No Press"); //действие после отпуска длительного нажатия
}
// Фиксируем нажатие кнопки
if( pin_state2 == LOW && !button_state2 && ( ms - ms_button ) > 50 ){
button_state2 = true;
ms_button = ms;
Serial.println("Press key 2"); //короткое нажатие
}
// После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия
if( pin_state2 == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
ms_auto_click = ms;
Serial.println("Auto press key 2"); //длительное нажатие
}
// Фиксируем отпускание кнопки
if( pin_state2 == HIGH && button_state2 && ( ms - ms_button ) > 50 ){
button_state2 = false;
ms_button = ms;
Serial.println("No Press 2"); //действие после отпуска длительного нажатия
}
}