Эта библиотека позволяет подключить энкодер KY-040. Дополнительную информацию можно найти в моём блоге itworkclub.ru

Dependents:   STM32_Encoder TFT_Touch_Menu_Encoder Encoder_rotativo TFT_Touch_Menu_Touch

Encoder.cpp

Committer:
zelmic
Date:
2018-06-20
Revision:
0:e1a3b380b0d6

File content as of revision 0:e1a3b380b0d6:

/*
* Автор - Железняков Андрей
* Сайт - itworkclub.ru
* Данный класс описывает энкодер с кнопкой KY-040
* Обработка вращения и нажатий происходит с помощью прерываний.
* При вращении энкодера меняется состояние переменной State
* в ту или иную сторону. Значения переменной State ограничены заданным
* диапазоном, например, от 0 до 100 или 0т 300 до 500. Диапазон задается
* функцией setRange. По умолчанию диапазон от 0 до 100.
* Узнать текущее значение энкодера можно с помощью функции getState();
* Нажата ли кнопка с помощью функции getButtonState();
* К энкодеру припаяны два дополнительных конденсатора по 1000пФ для устранения
* дребезга: один между GND и CLK, второй между GND и DT. Если этих конденсаторов
* нет, то необходимо раскомментировать задержку в функции encode. Так же 
* необохдимо проверить запаян ли подтягивающий резистор 10кОм на кнопку SW
* Его необходимо припаять.
*/
#include "Encoder.h"

EncoderAli::EncoderAli(PinName DT,PinName CLK,PinName SW): DT_(DT), CLK1_(CLK), SW_(SW){
    
    // инициализация начального состояния энкодера
    work = false;
    minValue_ =0;
    maxValue_ = 100;
    button = false;
    State = minValue_;
    
    // подключение прерываний для вращения, нажатия и отжатия
    CLK1_.rise(callback(this,&EncoderAli::encode));
    SW_.fall(callback(this,&EncoderAli::buttonPress));
    SW_.rise(callback(this,&EncoderAli::buttonUp));
    
}


void EncoderAli::encode(void) // обработчик вращения
{
    if (work) return; // если идет обработка предыдущего прерывания то ничего 
                      // не делаем
    work = true;      // поднимаем флаг работы прерывания, тем самым запрещая
                      // выполнения других таких же прерываний
    int A = DT_;      // считываем значение пина DT
    //wait_us(100);
    if(A==0 && State < maxValue_) //если DT 0, то энкодер крутится вправо 
        State++;// увеличиваем значение состояния энкодера
    if (A==1 && State > minValue_) //если DT = 1, то энкодер крутится влево
        State--; // уменьшаем значение энкодера
    work = false; // освобождаем флаг работы прерывания
    

}
int EncoderAli::getState()
{
    return State; 
}
void EncoderAli::setRange(int minValue,int maxValue)
{
    minValue_=minValue;
    maxValue_=maxValue;
    State = minValue_;
}
void EncoderAli::buttonPress(void)
{
    button = true;
}
void EncoderAli::buttonUp(void)
{
    button = false;
}
bool EncoderAli::getButtonState()
{
    return button;   
}