Skip to content

Commit

Permalink
add button
Browse files Browse the repository at this point in the history
  • Loading branch information
azzibom committed Nov 26, 2021
1 parent be507ce commit 083eb83
Show file tree
Hide file tree
Showing 7 changed files with 274 additions and 30 deletions.
83 changes: 53 additions & 30 deletions TroykaClock/TroykaClock.ino
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
#include <TroykaRTC.h> // библиотека для работы с часами реального времени
#include <TroykaDHT.h> // библиотека для работы с датчиками серии DHT
#include <QuadDisplay2.h> // Подключаем библиотеку для работы с дисплеем
#include <TroykaButton.h> // Подключаем библиотеку для работы с кнопкой

#define DHT_PIN 4
#define QD_PIN 10
#define BTN_PIN 11

RTC clock; // создаём объект для работы с часами реального времени

Expand All @@ -14,22 +16,29 @@ DHT dht(DHT_PIN, DHT11);

QuadDisplay qd(QD_PIN); // создаём объект класса QuadDisplay и передаём номер пина CS

TroykaButton button(BTN_PIN);

void setup() {
// Serial.begin(9600);
Serial.begin(9600);
qd.begin(); // инициализация дисплея
clock.begin(); // инициализация часов
dht.begin(); // инициализация термометра
dht.read();
dht.read();
pinMode(BTN_PIN, INPUT);
button.begin();

// метод установки времени и даты в модуль вручную
// clock.set(10,25,45,27,07,2005,THURSDAY);
// clock.set(10,25,45,27,07,2005,THURSDAY);
// метод установки времени и даты автоматически при компиляции
// clock.set(__TIMESTAMP__);
// clock.set(__TIMESTAMP__);
}

uint32_t dhtTimer; // таймер для dht
int dhtPeriod = 2000; // период чтения данных с dht

uint32_t rtcTimer; // таймер для rtc
int rtcPeriod = 500; // период чтения данных с rtc

void loop() {
// запрашиваем данные с часов
clock.read();
Expand All @@ -44,31 +53,45 @@ void loop() {
dht.read();
}

if ((second > 30 && second < 35) || (second > 0 && second < 5) ) {
// проверяем состояние данных
switch (dht.getState()) {
case DHT_OK: { // всё OK
qd.displayTemperatureC(dht.getTemperatureC()); // выводим только температуту т к влажность беспощадно врет
break;
}
case DHT_ERROR_CHECKSUM: { // ошибка контрольной суммы
// Serial.println("Checksum error");
qd.displayDigits(QD_E, QD_r, QD_r, QD_1);
break;
}
case DHT_ERROR_TIMEOUT: { // превышение времени ожидания
// Serial.println("Time out error");
qd.displayDigits(QD_E, QD_r, QD_r, QD_2);
break;
}
case DHT_ERROR_NO_REPLY: { // данных нет, датчик не реагирует или отсутствует
// Serial.println("Sensor not connected");
qd.displayDigits(QD_E, QD_r, QD_r, QD_0);
break;
}
// uint32_t rtcTimeLeft = millis() - rtcTimer;
// if (rtcTimeLeft >= rtcPeriod) {
// rtcTimer += rtcPeriod * (rtcTimeLeft / rtcPeriod);

if ((second > 30 && second < 35) || (second > 0 && second < 5) ) {
// проверяем состояние данных
switch (dht.getState()) {
case DHT_OK: { // всё OK
qd.displayTemperatureC(dht.getTemperatureC()); // выводим только температуту т к влажность беспощадно врет
break;
}
case DHT_ERROR_CHECKSUM: { // ошибка контрольной суммы
// Serial.println("Checksum error");
qd.displayDigits(QD_E, QD_r, QD_r, QD_1); // Err1
break;
}
case DHT_ERROR_TIMEOUT: { // превышение времени ожидания
// Serial.println("Time out error");
qd.displayDigits(QD_E, QD_r, QD_r, QD_2); // Err2
break;
}
case DHT_ERROR_NO_REPLY: { // данных нет, датчик не реагирует или отсутствует
// Serial.println("Sensor not connected");
qd.displayDigits(QD_E, QD_r, QD_r, QD_0); // Err0
break;
}
}
} else {
qd.displayScore(hour, minute, true);
}
} else {
qd.displayScore(hour, minute, true);
// }

// считываем данные с кнопки
button.read();

// определяем короткое нажатие кнопки
if (button.isClick()) {
// Serial.println("Key is clicked");
clock.setMinute(minute - 1);
}
delay(500);
}

}
20 changes: 20 additions & 0 deletions libraries/TroykaButton/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
TroykaButton
============

Библиотека поможет считывать состояния кнопки: нажатие, отжатие и зажатие.
Программный модуль также позволяет программно избавиться от дребезга контактов.

Библиотека будет полезна для кнопок:
* [Кнопка (Troyka-модуль)](http://amperka.ru/product/troyka-button)
* [Кнопка со светодиодом (Troyka-модуль)](http://amperka.ru/product/troyka-led-button)
* [Сенсорная кнопка (Troyka-модуль)](http://amperka.ru/product/troyka-touch-sensor)
* [Четырёхкнопочная клавиатура (Troyka-модуль)](http://amperka.ru/product/troyka-quad-switch)
* [Кнопка тактовая](http://amperka.ru/product/tactile-button)
* [Кнопка тактовая с колпачком](http://amperka.ru/product/big-tactile-button)

Установка библиотеки
====================

В Arduino IDE выберите пункт меню «Скетч» → «Импортировать библиотеку» →
«Добавить библиотеку…». В появившемся окне выберите скачаный архив с
библиотекой. Установка завершена.
36 changes: 36 additions & 0 deletions libraries/TroykaButton/examples/testButton/testButton.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include "TroykaButton.h"

// создаём объект для работы с кнопкой с параметром номер пина
TroykaButton button(4);
// также есть два необзятельных параметра:
// время длительного зажатия кнопки: по умолчанию 2000 мc
// выбор подтяжки кнопки: по умолчанию подтяжка к минусу
// TroykaButton button(4, 2000, true);
void setup() {
// открываем монитор Serial порта
Serial.begin(9600);
// начало работы с кнопкой
button.begin();
}

void loop()
{
// считываем данные с кнопки
button.read();
// опеределяем клик кнопки
if (button.justPressed()) {
Serial.println("Key on press");
}
// определяем отжатие кнопки
if (button.justReleased()) {
Serial.println("Key is release");
}
// определяем длительное зажатие кнопки
if (button.isHold()) {
Serial.println("Key on long press");
}
// определяем короткое нажатие кнопки
if (button.isClick()) {
Serial.println("Key is clicked");
}
}
20 changes: 20 additions & 0 deletions libraries/TroykaButton/keywords.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#######################################
# Syntax Coloring Map TroykaButton
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

TroykaButton KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

begin KEYWORD2
read KEYWORD2
justPressed KEYWORD2
justReleased KEYWORD2
isHold KEYWORD2
isClick KEYWORD2
9 changes: 9 additions & 0 deletions libraries/TroykaButton/library.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name=TroykaButton
version=1.0.0
author=Igor Dementiev <[email protected]>
maintainer=Amperka <amperka.ru>
sentence=Allows you to read state from the button.
paragraph=Supported events are clicked, released and longPressed.
category=Communication
url=https://github.com/amperka/TroykaButton
architectures=*
75 changes: 75 additions & 0 deletions libraries/TroykaButton/src/TroykaButton.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/****************************************************************************/
// Function: Cpp file for TroykaButton
// Arduino IDE: Arduino-1.8.5
// Author: Igor Dementiev
// Date: Sep 09,2018
// Version: v1.0
// by www.amperka.ru
/****************************************************************************/

#include "TroykaButton.h"

TroykaButton::TroykaButton(uint8_t pin, uint32_t timeHold, bool pullUP) {
_pin = pin;
_timeHold = timeHold;
_pullUP = pullUP;
}

// инициализация кнопки
void TroykaButton::begin() {
pinMode(_pin, INPUT);
_msButtonState = 0;
_buttonStateOld = ON_RELEASE;
_isClick = false;
}

// считывание состояние кнопки
void TroykaButton::read() {
_stateButton = false;
_isClick = false;
bool buttonStateNow = !digitalRead(_pin);
if (!_pullUP) {
buttonStateNow = !buttonStateNow;
}
if (buttonStateNow && buttonStateNow != _buttonStateWas && millis() - _msButtonState > DEBOUNCE_TIME) {
_buttonStateNowLong = false;
_msButtonState = millis();
_stateButton = ON_PRESS;
_buttonStateOld = _stateButton;
}
if (!buttonStateNow && buttonStateNow != _buttonStateWas && millis() - _msButtonState > DEBOUNCE_TIME) {
_msButtonState = millis();
_stateButton = ON_RELEASE;
}
if (buttonStateNow && !_buttonStateNowLong && millis() - _msButtonState > _timeHold) {
_buttonStateNowLong = true;
_msButtonState = millis();
_stateButton = ON_PRESS_LONG;
_buttonStateOld = _stateButton;
}
if (_stateButton == ON_RELEASE && _buttonStateOld == ON_PRESS ) {
_buttonStateOld = ON_RELEASE;
_isClick = true;
}
_buttonStateWas = buttonStateNow;
}

// определение клика кнопки
bool TroykaButton::justPressed() const {
return _stateButton == ON_PRESS ? 1 : 0;
}

// определение отжатие кнопки
bool TroykaButton::justReleased() const {
return _stateButton == ON_RELEASE ? 1 : 0;
}

// определение зажатие кнопки (по умолчанию 2 секунды)
bool TroykaButton::isHold() const {
return _stateButton == ON_PRESS_LONG ? 1 : 0;
}

// определение короткого клика, если сработал метод isHold() клик не сработает.
bool TroykaButton::isClick() const {
return _isClick;
}
61 changes: 61 additions & 0 deletions libraries/TroykaButton/src/TroykaButton.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/****************************************************************************/
// Function: Header file for TroykaButton
// Arduino IDE: Arduino-1.8.5
// Author: Igor Dementiev
// Date: Sep 09,2018
// Version: v1.0
// by www.amperka.ru
/****************************************************************************/

#ifndef _TROYKA_BUTTON_H_
#define _TROYKA_BUTTON_H_

#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#define DEBOUNCE_TIME 50
#define ON_PRESS 1
#define ON_PRESS_LONG 2
#define ON_RELEASE 3

class TroykaButton
{
public:
TroykaButton(uint8_t pin, uint32_t timeHold = 2000, bool pullUP = true);
// инициализация кнопки
void begin();
// считывание данных с кнопки
void read();
// определение клика кнопки
bool justPressed() const;
// определение отжатие кнопки
bool justReleased() const;
// определение зажатие кнопки (по умолчанию 2 секунды)
bool isHold() const;
// определение короткого клика, если сработал метод isHold() клик не сработает.
bool isClick() const;
private:
// номера пина
uint8_t _pin;
// время длительного зажатия кнопки
uint32_t _timeHold;
// выбор подтяжки
bool _pullUP;
// короткое нажатие кнопки (клик)
bool _isClick;
// состояние кнопки
uint8_t _stateButton;
// предыдущие состояние кнопки
uint8_t _buttonStateOld;
// ранее состояние кнопки
bool _buttonStateWas;
// длинное нажатие
bool _buttonStateNowLong;
// время нажатия кнопки
uint32_t _msButtonState;
};

#endif

0 comments on commit 083eb83

Please sign in to comment.