Эта библиотека позволяет подключить энкодер KY-040. Дополнительную информацию можно найти в моём блоге itworkclub.ru
Dependents: STM32_Encoder TFT_Touch_Menu_Encoder Encoder_rotativo TFT_Touch_Menu_Touch
Encoder.cpp@0:e1a3b380b0d6, 2018-06-20 (annotated)
- Committer:
- zelmic
- Date:
- Wed Jun 20 15:21:16 2018 +0000
- Revision:
- 0:e1a3b380b0d6
ver. 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
zelmic | 0:e1a3b380b0d6 | 1 | /* |
zelmic | 0:e1a3b380b0d6 | 2 | * Автор - Железняков Андрей |
zelmic | 0:e1a3b380b0d6 | 3 | * Сайт - itworkclub.ru |
zelmic | 0:e1a3b380b0d6 | 4 | * Данный класс описывает энкодер с кнопкой KY-040 |
zelmic | 0:e1a3b380b0d6 | 5 | * Обработка вращения и нажатий происходит с помощью прерываний. |
zelmic | 0:e1a3b380b0d6 | 6 | * При вращении энкодера меняется состояние переменной State |
zelmic | 0:e1a3b380b0d6 | 7 | * в ту или иную сторону. Значения переменной State ограничены заданным |
zelmic | 0:e1a3b380b0d6 | 8 | * диапазоном, например, от 0 до 100 или 0т 300 до 500. Диапазон задается |
zelmic | 0:e1a3b380b0d6 | 9 | * функцией setRange. По умолчанию диапазон от 0 до 100. |
zelmic | 0:e1a3b380b0d6 | 10 | * Узнать текущее значение энкодера можно с помощью функции getState(); |
zelmic | 0:e1a3b380b0d6 | 11 | * Нажата ли кнопка с помощью функции getButtonState(); |
zelmic | 0:e1a3b380b0d6 | 12 | * К энкодеру припаяны два дополнительных конденсатора по 1000пФ для устранения |
zelmic | 0:e1a3b380b0d6 | 13 | * дребезга: один между GND и CLK, второй между GND и DT. Если этих конденсаторов |
zelmic | 0:e1a3b380b0d6 | 14 | * нет, то необходимо раскомментировать задержку в функции encode. Так же |
zelmic | 0:e1a3b380b0d6 | 15 | * необохдимо проверить запаян ли подтягивающий резистор 10кОм на кнопку SW |
zelmic | 0:e1a3b380b0d6 | 16 | * Его необходимо припаять. |
zelmic | 0:e1a3b380b0d6 | 17 | */ |
zelmic | 0:e1a3b380b0d6 | 18 | #include "Encoder.h" |
zelmic | 0:e1a3b380b0d6 | 19 | |
zelmic | 0:e1a3b380b0d6 | 20 | EncoderAli::EncoderAli(PinName DT,PinName CLK,PinName SW): DT_(DT), CLK1_(CLK), SW_(SW){ |
zelmic | 0:e1a3b380b0d6 | 21 | |
zelmic | 0:e1a3b380b0d6 | 22 | // инициализация начального состояния энкодера |
zelmic | 0:e1a3b380b0d6 | 23 | work = false; |
zelmic | 0:e1a3b380b0d6 | 24 | minValue_ =0; |
zelmic | 0:e1a3b380b0d6 | 25 | maxValue_ = 100; |
zelmic | 0:e1a3b380b0d6 | 26 | button = false; |
zelmic | 0:e1a3b380b0d6 | 27 | State = minValue_; |
zelmic | 0:e1a3b380b0d6 | 28 | |
zelmic | 0:e1a3b380b0d6 | 29 | // подключение прерываний для вращения, нажатия и отжатия |
zelmic | 0:e1a3b380b0d6 | 30 | CLK1_.rise(callback(this,&EncoderAli::encode)); |
zelmic | 0:e1a3b380b0d6 | 31 | SW_.fall(callback(this,&EncoderAli::buttonPress)); |
zelmic | 0:e1a3b380b0d6 | 32 | SW_.rise(callback(this,&EncoderAli::buttonUp)); |
zelmic | 0:e1a3b380b0d6 | 33 | |
zelmic | 0:e1a3b380b0d6 | 34 | } |
zelmic | 0:e1a3b380b0d6 | 35 | |
zelmic | 0:e1a3b380b0d6 | 36 | |
zelmic | 0:e1a3b380b0d6 | 37 | void EncoderAli::encode(void) // обработчик вращения |
zelmic | 0:e1a3b380b0d6 | 38 | { |
zelmic | 0:e1a3b380b0d6 | 39 | if (work) return; // если идет обработка предыдущего прерывания то ничего |
zelmic | 0:e1a3b380b0d6 | 40 | // не делаем |
zelmic | 0:e1a3b380b0d6 | 41 | work = true; // поднимаем флаг работы прерывания, тем самым запрещая |
zelmic | 0:e1a3b380b0d6 | 42 | // выполнения других таких же прерываний |
zelmic | 0:e1a3b380b0d6 | 43 | int A = DT_; // считываем значение пина DT |
zelmic | 0:e1a3b380b0d6 | 44 | //wait_us(100); |
zelmic | 0:e1a3b380b0d6 | 45 | if(A==0 && State < maxValue_) //если DT 0, то энкодер крутится вправо |
zelmic | 0:e1a3b380b0d6 | 46 | State++;// увеличиваем значение состояния энкодера |
zelmic | 0:e1a3b380b0d6 | 47 | if (A==1 && State > minValue_) //если DT = 1, то энкодер крутится влево |
zelmic | 0:e1a3b380b0d6 | 48 | State--; // уменьшаем значение энкодера |
zelmic | 0:e1a3b380b0d6 | 49 | work = false; // освобождаем флаг работы прерывания |
zelmic | 0:e1a3b380b0d6 | 50 | |
zelmic | 0:e1a3b380b0d6 | 51 | |
zelmic | 0:e1a3b380b0d6 | 52 | } |
zelmic | 0:e1a3b380b0d6 | 53 | int EncoderAli::getState() |
zelmic | 0:e1a3b380b0d6 | 54 | { |
zelmic | 0:e1a3b380b0d6 | 55 | return State; |
zelmic | 0:e1a3b380b0d6 | 56 | } |
zelmic | 0:e1a3b380b0d6 | 57 | void EncoderAli::setRange(int minValue,int maxValue) |
zelmic | 0:e1a3b380b0d6 | 58 | { |
zelmic | 0:e1a3b380b0d6 | 59 | minValue_=minValue; |
zelmic | 0:e1a3b380b0d6 | 60 | maxValue_=maxValue; |
zelmic | 0:e1a3b380b0d6 | 61 | State = minValue_; |
zelmic | 0:e1a3b380b0d6 | 62 | } |
zelmic | 0:e1a3b380b0d6 | 63 | void EncoderAli::buttonPress(void) |
zelmic | 0:e1a3b380b0d6 | 64 | { |
zelmic | 0:e1a3b380b0d6 | 65 | button = true; |
zelmic | 0:e1a3b380b0d6 | 66 | } |
zelmic | 0:e1a3b380b0d6 | 67 | void EncoderAli::buttonUp(void) |
zelmic | 0:e1a3b380b0d6 | 68 | { |
zelmic | 0:e1a3b380b0d6 | 69 | button = false; |
zelmic | 0:e1a3b380b0d6 | 70 | } |
zelmic | 0:e1a3b380b0d6 | 71 | bool EncoderAli::getButtonState() |
zelmic | 0:e1a3b380b0d6 | 72 | { |
zelmic | 0:e1a3b380b0d6 | 73 | return button; |
zelmic | 0:e1a3b380b0d6 | 74 | } |
zelmic | 0:e1a3b380b0d6 | 75 |