Эта библиотека позволяет подключить энкодер 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
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