ESP8266:Примеры/Использование ESP8266 вместе с энкодером KY-040

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Использование ESP8266 вместе с энкодером KY-040[1]

ESP8266 штурмом взял сердца членов DIY-сообщества – благодаря привлекательной цене, возможности подключения к интернету и относительно большому количеству свободных GPIO-контактов. Но ценность устройства, способного подключиться к интернету, сомнительна, если у него нет средств для взаимодействия с окружающим миром. Впрочем, благодаря стандартизированным протоколам вроде I2C, SPI и последовательной коммуникации, а также трудам сообщества Arduino, на рынке очень много датчиков и устройств вывода данных, которые стоят относительно недорого. Но насколько хорошо они совместимы с ESP8266?

В данной статье этот вопрос будет раскрыт на примере энкодера (датчика угловых перемещений) KY-040 – устройства для ввода данных. В нем, на удивление, нет каких-то особо мудреных технологий, но оно предлагает очень удобный способ для настройки экранных показателей, не используя при этом слишком большое количество GPIO-контактов.

Рис. 1.
Рис. 1. Энкодер KY-040

Что такое энкодер?

С первого взгляда KY-040 можно перепутать с регулируемым резистором, т.е. с потенциометром, потому что у него тоже есть круглый регулятор, который можно поворачивать влево и вправо. Но, в отличие от настоящих потенциометров, KY-040 можно бесконечно вращать по кругу, не натыкаясь ни на какие пределы. Кроме того, включив KY-040, вы будете чувствовать позиции, на которых регулятор будет легонько фиксироваться, а вот ручка потенциометра будет мягко крутиться, пока не достигнет «конечной остановки».

Есть и еще одно отличие – у KY-040 (как и у большинства других энкодеров) есть переключатель, который меняет свое состояние при вертикальном нажатии (как кнопка). Я видел подобные энкодеры встроенными в современные радиоприемники и автомобильные навигационные системы. Одним из главных преимуществ энкодеров значится относительно легкое встраивание в цифровые системы, особенно если сравнивать с АЦП, которые используется для считывания значений с потенциометра. Кроме того, у вас могут возникнуть проблемы вроде температурного дрейфа и т.д. Образно говоря, энкодер – это такой молодой (миллиениал, чья молодость приходится на цифровую эру) брат потенциометра.

Как использовать энкодер?

Энкодеры бывают разных типов. Некоторые могут определять абсолютную позицию/угол поворотной ручки, не следя за ее перемещением. Но KY-040 гораздо проще. Считывая сигналы, идущие на два контакта микроконтроллера, мы можем определить, в какую сторону был повернут потенциометр – влево или вправо. При помощи третьего контакта можно определить состояние кнопки. Форма волны на двух «поворотных» контактах выглядит примерно так:

Рис. 2. Форма волны энкодера при повороте по часовой стрелке
Рис. 2. Форма волны энкодера при повороте по часовой стрелке
Рис. 3. Форма волны энкодера при повороте по против часовой стрелки
Рис. 3. Форма волны энкодера при повороте по против часовой стрелки

Таким образом, когда вы поворачиваете ручку вправо, первой в состояние HIGH переходит линия B, а лишь затем – линия A. После этого, соответственно, линия B первой переходит в состояние LOW, а следом за ней – линия A. В результате последовательность сигналов при повороте ручки по часовой стрелке получается такой: 00, 01, 11, 10, 00. Но если повернуть ручку против часовой стрелки, то последовательность получается такой: 00, 10, 11, 01, 00. Более подробно смотрите на картинках выше.

Таким образом, аккуратно отслеживая эти сигналы, вы можете определять направление, в котором вращается ручка энкодера, а также определять 4 промежуточных состояния между двумя кликами. Если ваше устройство поддерживает прерывания, то с их помощью можно выводить уведомления об изменении сигнала на линиях, но для этого также понадобится дополнить программный код. Если прерывания не поддерживаются, можно воспользоваться техникой под названием «поллинг» (от англ. «polling»), при которой выполняется частое считывание сигнала, чтобы как можно быстрее определить его изменение.

Но есть еще одна трудность – мы живем в неидеальном мире (на тот случай, если вы не в курсе :D). Механические контакты KY-040 время от времени «дают осечку», и причина этого дефекта может быть, например, в том, что на контакт попала пыль, или в том, что на медном припое есть какая-то выбоина. В результате микроконтроллер может получить «грязный» сигнал и сделать неверное «умозаключение». Этот дефект зовется «дребезгом контактов». Справиться с дребезгом контактов можно и на аппаратном, и на программном уровне. Аппаратное решение – это воспользоваться маленьким конденсатором, способным немного смягчить шум сигнала. Программное решение – это задать временной период, в течение которого ожидается изменение сигнала, и в нашем проекте эту задачу будет выполнять библиотека «Encoder». Я специально заострил ваше внимание на этой проблеме, чтобы вы знали, что вы можете столкнуться с нею в своем проекте.

За дело!

Теперь давайте приступим к проекту. Подключите энкодер к NodeMCU как показано на картинке ниже. Только подключайте контакты согласно надписям, а не порядку контактов:

Рис. 4. Подключение энкодера к плате ESP8266
Рис. 4. Подключение энкодера к плате ESP8266
  • Контакт + на энкодере – к контакту 3.3V
  • Контакт GND – к контакту GND
  • Контакт SW – к контакту D3
  • Контакт DT – к контакту D2
  • Контакт CLK – контакт D1

Установка библиотеки

В данном случае можно воспользоваться разными библиотеками. Лично я предпочитаю «Encoder», и скачать ZIP-архив с нею можно отсюда. Скачав архив, распакуйте его и поместите в папку с библиотеками IDE Arduino. Перезапустите IDE Arduino и скопируйте в нее код ниже:

#include <Encoder.h>

Encoder myEnc(D1, D2);

long oldPosition  = -999;
boolean isButtonPressed = false;
long lastUpdateMillis = 0;

void handleKey() {
  isButtonPressed = true;  
}

void setup() {
  Serial.begin(115200);
  Serial.println("Basic Encoder Test:");
             //  "Базовый тест энкодера:" 
   pinMode(D3, INPUT_PULLUP);
   attachInterrupt(D3, handleKey, RISING);
}

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }
  // программное устранение дребезга:
  if (isButtonPressed &amp;&amp; millis() - lastUpdateMillis &gt; 50) {
    isButtonPressed = false;
    lastUpdateMillis = millis();
    // сбрасываем счетчик:
    myEnc.write(0);
  }
}

Загрузив скетч, откройте монитор порта IDE Arduino, поверните ручку вправо и влево, а затем нажмите на него, чтобы сбросить счетчик. В результате данные в мониторе порта будут выглядеть примерно так:

Basic Encoder Test:

0
1
2
3
2
3
4
0 - Knob pressed
1
2
3
4
0 - Knob pressed

Возможное применение KY-040

  • Управление блоками данных погодной станции. Допустим, вы используете несколько разных блоков данных. В результате, чтобы добраться до нужного блока, может понадобиться некоторое время. Энкодер может прийтись тут весьма кстати – с его помощью можно будет переключаться между разными блоками, при этом не добавляя в скетч слишком много кода.
  • Селектор открытых точек доступа WiFi. Допустим, у вас есть система из ESP8266, дисплея и вы хотите быстро выбрать и подключиться к незащищенной WiFi-сети, не используя для этого веб-интерфейс. Просто создайте небольшое меню, а затем подключите энкодер: вращая его, вы сможете перемещать курсор между разными SSID, а нажимая на него – выбирать SSID, к которой хотите подключиться.

См.также

Внешние ссылки