Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Esp32 Blekeyboard программирование кнопки

Andrei ovsannikov Знаток (324), открыт 2 недели назад
Добрый день такой вопрос как на Esp32 Blekeyboard сделать так чтобы программа понимала когда я держу кнопку а когда отпускаю кнопка подключена на встроенный подтягивающий резистор
Дополнен 2 недели назад
1 ответ
Moon Late Мастер (1253) 2 недели назад
Нужны флаги события. Они выставляются по изменению состояния кнопки. Если при новом опросе кнопки её состояние отличается от полученного состояния ранее, тогда что-то изменилось - кнопку отпустили или нажали. Направление изменения состояния кнопки будет давать различие между отпусканием и нажиманием.
Кнопки опрашиваются периодически через равные интервалы времени, обычно это 20-40 мс.
Andrei ovsannikovЗнаток (324) 2 недели назад
Можете помочь с написанием скетча ?
Andrei ovsannikovЗнаток (324) 2 недели назад
Не могу найти как именно прописать флаги для Blekeyboard нашло пример у https://alexgyver.ru/lessons/arduino-buttons/
void setup() {
Serial.begin(9600);
pinMode(3, INPUT_PULLUP);
}

bool flag = false;
void loop() {
// читаем инвертированное значение для удобства
bool btnState = !digitalRead(3);
if (btnState && !flag) { // обработчик нажатия
flag = true;
Serial.println("press");
}
if (!btnState && flag) { // обработчик отпускания
flag = false;
//Serial.println("release");
}
}
Но как его оптимизировать для моих нужд что бы использовалась кнопка клавиатуры
Moon LateМастер (1253) 2 недели назад
Общий принцип таков:
 namespace Butt { 
enum class Event {
NO_CHANGE, PRESS, RELEASE
};

Event EvReco(bool state)
{
static bool prevState = false;

/* кнопка была отпущена */
if(state < prevState)
{
prevState = state;
return Event::RELEASE;
}

/* кнопка была нажата */
if(state > prevState)
{
prevState = state;
return Event::PRESS;
}

/* состояние кнопки не изменилось */
return Event::NO_CHANGE;
};
}
Moon LateМастер (1253) 2 недели назад
использование:
 Butt::Event ev; 
ev = Butt::EvReco(ButtonRead(BT2));
if(ev == Butt::Event::PRESS)
{
чето-сделать по факту нажатия кнопки
}
Moon LateМастер (1253) 2 недели назад
Объяснение:
enum class Event содержит перечисление событий кнопки - "не изменилось состояние", "кнопка была нажата" и "кнопка была отпущена".
Функция Event EvReco(bool state) определяет эти события на основе входного состояния кнопки (state) и хранящегося предыдущего состояния prevState. Эти состояния имеют тип bool, а значит, только два значения - true/false.
Возвращает функция как раз это самое событие, которое и было определено.
Вот и всё, как бы. По месту использования проверяем в if или switch событие и выполняем что-то.
Andrei ovsannikov Знаток (324)
 #define BT1 4 // ПИН к которому подключена кнопка 1

#include <BleKeyboard.h>  // подключаем библиотеку
BleKeyboard bleKeyboard;  // создаем объект

void setup() {
  pinMode(BT1, INPUT_PULLUP);     // ПИН кнопки как вход
  pinMode(2, OUTPUT);   // встроеный светодиод
  bleKeyboard.begin();            // старт клавиатуры
}


void loop() {
  // Если клавиатура подключена то встроеный светодиод горит
  digitalWrite (LED_BUILTIN, bleKeyboard.isConnected());

  }
  Butt::Event ev; 
ev = Butt::EvReco(ButtonRead(BT1));
if(ev == Butt::Event::PRESS)
{
   bleKeyboard.press('A');
} 
Andrei ovsannikovЗнаток (324) 2 недели назад
он явно должен выглядеть не так я особо не разбираюсь и это первый мой проект подскажи где внести изменения
Moon Late Мастер (1253) Andrei ovsannikov, конкретно с этой библиотекой я не работал. Но судя по её содержимому, она вообще не работает с физическими кнопками. И слово BLE как бы намекает на Bluetooth Low Energy - беспроводная клавиатура, работающая с BLE-модулем.
Moon LateМастер (1253) 2 недели назад
Не знаю, я вижу вот это: https://github.com/T-vK/ESP32-BLE-Keyboard/blob/master/BleKeyboard.h
и там в public-методах класса я вообще не вижу хоть что-то, работающее с физическими кнопками.
Andrei ovsannikov Знаток (324) Moon Late, ну в любом случае спасибо по ходу надо менять библиотеку или посоветуешь чего
Похожие вопросы