Эта библиотека позволяет подключить энкодер KY-040. Дополнительную информацию можно найти в моём блоге itworkclub.ru
Dependents: STM32_Encoder TFT_Touch_Menu_Encoder Encoder_rotativo TFT_Touch_Menu_Touch
Revision 0:e1a3b380b0d6, committed 2018-06-20
- Comitter:
- zelmic
- Date:
- Wed Jun 20 15:21:16 2018 +0000
- Commit message:
- ver. 1.0
Changed in this revision
Encoder.cpp | Show annotated file Show diff for this revision Revisions of this file |
Encoder.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r e1a3b380b0d6 Encoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Encoder.cpp Wed Jun 20 15:21:16 2018 +0000 @@ -0,0 +1,75 @@ +/* +* Автор - Железняков Андрей +* Сайт - 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; +} +
diff -r 000000000000 -r e1a3b380b0d6 Encoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Encoder.h Wed Jun 20 15:21:16 2018 +0000 @@ -0,0 +1,53 @@ +/* +* Автор - Железняков Андрей +* Сайт - itworkclub.ru +* Данный класс описывает энкодер с кнопкой KY-040 +* Обработка вращения и нажатий происходит с помощью прерываний. +* При вращении энкодера меняется состояние переменной State +* в ту или иную сторону. Значения переменной State ограничены заданным +* диапазоном, например, от 0 до 100 или 0т 300 до 500. Диапазон задается +* функцией setRange. По умолчанию диапазон от 0 до 100. +* Узнать текущее значение энкодера можно с помощью функции getState(); +* Нажата ли кнопка с помощью функции getButtonState(); +* К энкодеру припаяны два дополнительных конденсатора по 1000пФ для устранения +* дребезга: один между GND и CLK, второй между GND и DT. Если этих конденсаторов +* нет, то необходимо раскомментировать задержку в функции encode. Так же +* необохдимо проверить запаян ли подтягивающий резистор 10кОм на кнопку SW +* Его необходимо припаять. +*/ + +#ifndef Encoder_H +#define Encoder_H + + +#include "mbed.h" + +class EncoderAli +{ + public: + // В конструкторе задаем пины, к которым подключен энкодер + EncoderAli(PinName DT,PinName CLK1,PinName SW); + + int getState(); // возвращает положение энкодера + void setRange(int minValue,int maxValue);// задает диапазон + bool getButtonState();// true - кнопка нажата, false - отжата + private: + + int State; // положение энкодера + bool work; // флаг, который поднимается, когда идет обработка прерывания + // и опускается по заверщении прерывания. + int minValue_; // минимальное значение энкодера + int maxValue_; // максимальное значение энкодера + bool button; //true - кнопка нажата, false - отжата + + DigitalIn DT_; + InterruptIn CLK1_; + InterruptIn SW_; + + void encode(void); //обработчик вызывается при повороте энкодера + void buttonPress(void); //обработчик вызывается при нажатии кнопки + void buttonUp(void); // обработчик вызывается при отпускании кнопки + +}; + +#endif \ No newline at end of file