Делаем не большой проект на Arduino и пришлось написать собственную библиотеку для работы с кнопкой.
Казалось бы - такая банальщина! Масса примеров в нете для работы с кнопкой, а вот именно того функционала, что нужен нам не нашел ни в одном из них. В итоге пришлось сесть и написать собственную библиотеку для кнопки. Библиотека умеет гасить дребезг контактов, при чем без задержки основной программы (т.е. без использования delay и подобных функций), считает количество нажатий, так же имеется триггер и импульсный флажок (для каждой итерации цикла) на нажатие и отпускание кнопки. При создании экземпляра кнопки указывается пин к которому подключена кнопка, способ подключения кнопки (нормально замкнутая/разомкнутая), время задержки для гашения дребезга.
Подключение библиотеки стандартное для Arduino.
Пример работы с библиотекой:
- Код: Выделить всё • Развернуть
#include <button_coin.h>
// Создать экземпляр класса button
button_coin button(2, 0, 100); // параметры:
// 1-й параметр - номер пина к которому подключена кнопка (0-13)
// 2-й параметр - режим работы кнопки (0-нормально замкнутая на землю; 1-нормальна замкнутая на +5В через сопротивление 1КОм, сопротивление можно не подключать)
// 3-й параметр - время задержки дребезга в миллисекундах
void setup(void) {
Serial.begin(9600);
}
void loop () {
button.but(); // обработка кнопки
Serial.print(button.cur); // текущее состояние кнопки
Serial.print(" ");
Serial.print(button.prev); // предыдущее состояние кнопки
Serial.print(" ");
Serial.print(button.trigger_push); // триггер кнопки на нажатие
Serial.print(" ");
Serial.print(button.trigger_let); // триггер кнопки на отпускание
Serial.print(" ");
Serial.print(button.coint); // счетчик нажатий кнопки с запуска библиотеки
Serial.print(" ");
Serial.print(button.con); // момент нажатия кнопки
Serial.print(" ");
Serial.println(button.discon); // момент отпускания кнопки
}
Этот пример работает с кнопкой подключенной на pin2, кнопка должна быть нормально замкнута на общий провод. Данный пример выводит все переменные экземпляра button в окне монитора порта. Используемый для кнопки вывод подключается с внутренним подтягивающим резистором, так что внешнее сопротивление на +5В можно не подключать.
Библиотека называется button_coin и реализует следующие функции:
1. *.cur - текущее состояние кнопки, возвращает значение нажата или отжата кнопка;
2. *.prev - предыдущее состояние кнопки, возвращает значение состояния кнопки на предыдущей итерации цикла;
3. *.trigger_push - триггер кнопки на нажатие, меняет свое состояние с 1 в 0 и обратно при каждом нажатии кнопки;
4. *.trigger_let - триггер кнопки на отпускание, меняет свое состояние с 1 в 0 и обратно при каждом отпускании кнопки;
5. *.coint - счетчик нажатий кнопки с запуска библиотеки, считает сколько раз была нажата кнопка;
6. *.con - момент нажатия кнопки, на текущей итерации возвращает 1 в момент когда нажата кнопка;
7. *.discon - момент отпускания кнопки, на текущей итерации возвращает 1 в момент когда кнопка отжата.
Все выше указанные переменные экземпляра кнопки доступны как на чтение так и на запись в них значений. Так что вы можете самостоятельно изменить значение любой переменной в ходе выполнения вашего скетча (если конечно в этом есть необходимость).
Так как библиотека не использует прерывания (это сделано специально из за того что прерывания в нашем проекте уже заняты), то если при использовании библиотеки button_coin в вашем скетче происходят задержки более чем время нажатия кнопки, то возможны пропуски в отработке нажатий.
Кому может пригодиться скачивайте, пользуйтесь. Если есть вопросы задавайте.