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

Dependents:   STM32_Encoder TFT_Touch_Menu_Encoder Encoder_rotativo TFT_Touch_Menu_Touch

Files at this revision

API Documentation at this revision

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
--- /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;   
+}
+
--- /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