====== Модуль энкодера ======
===== Описание =====

Энкодер - датчик угла поворота с диапазоном работы 360 градусов. С помощью данного модуля вы сможете устанавливать яркость светодиодов, дисплеев, регулировать громкость, скорость вращения моторов и т.д. В отличие от модуля потенциометра, модуль энкодера не имеет ограничений по диапазону вращения.

Принцип работы энкодера основан на генерации электрического сигнала при вращении ручки. Вращая ручку, энкодер формирует импульсы на контактах А и В. При повороте по часовой стрелке импульс сначала появляется на выводе А, затем на В. При вращении в противоположную сторону импульсы появляются в противоположном порядке. Данная особенность энкодера позволяет определять направление вращения ручки. Количество импульсов, полученных на выводах, пропорционально углу поворота ручки энкодера.

Энкодер также имеет встроенную кнопку, которая срабатывает при надавливании на ручку. Сигнал кнопки выведен на отдельный вывод модуля (D). На плате также предусмотрен потягивающий резистор для кнопки. 

Для удобства монтажа сам энкодер снабжен резьбой. С помощью шайбы и гайки, входящих в комплект, модуль можно надежно закрепить в отверстии.

==== Технические характеристики ====
  * Рабочее напряжение: 3-5 В
  * Максимальный потребляемый ток: 3 мА
  * Количество шагов на 1 оборот: 30

==== Физические размеры ====
  * Габаритные размеры (Д х Ш х В): 30 х 20 х 38 мм

==== Плюсы использования ====
  * Модуль содержит всю необходимую обвязку
  * Наличие встроенной кнопки
  * Возможность использования в навигации по меню

==== Ресурсы для загрузки ====
  * [[http://files.smartelements.ru/know_libs/encoder.zip|Скачать (encoder)]]

===== Примеры подключения и использования =====
==== Вывод значений на экран ====
**Задача:** Вывести значения поворота и факты нажатия кнопки в монитор Serial-порта.

^ Что нужно                                                                                                               ^  Кол-во, шт  ^
| [[https://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                  |  1           |
| [[https://smartelements.ru/collection/shildy/product/sensor-shield|Sensor Shield]]                      |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-enkodera|Модуль энкодера]]                      |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-mama|Провода папа-мама]] |  5           |


**Схема подключения:**
{{ :главная:модули:модуль_энкодера_пример_1_н.png?nolink |}}

**Скетч для загрузки:**
<file Arduino>
#include <Encoder.h> //подключение библиотеки для работы с энкодером

const int pinA = 5; //вывод подключения контакта А
const int pinB = 6; //вывод подключения контакта В
const int BUT = 7; //вывод подключения контакта D

Encoder myEnc(pinA, pinB); //объявление объекта для работы с энкодером

long oldPosition  = -999; //переменная для хранения старой позиции
boolean lastButton = HIGH; //прошлое положение кнопки


void setup() {
  Serial.begin(9600); //инициализация монитора порта
  Serial.println("Basic Encoder Test:"); //вывод в монитор надписи
}

void loop() {
  lastButton = digitalRead(BUT);
  long newPosition = myEnc.read(); //чтение новой позиции
  if (newPosition != oldPosition) { //если она отлична от старой
    oldPosition = newPosition; //запомнить её
    Serial.println(newPosition); //вывести в монитор
  }

  if (digitalRead(BUT) == LOW && lastButton == HIGH) { //проверка нажатия на кнопку
    Serial.println("Button has been pressed!"); //вывод сообщения
  }
}
</file>

==== Управление RGB-светодиодом ====
**Задача:** С помощью модуля энкодера будем управлять RGB - светодиодом. Алгоритм работы следующий, при вращении вала энкодера по часовой стрелке увеличивается яркость очередного цвета (красный, зелёный, синий), при вращении против часовой стрелки яркость свечения цвета уменьшается. Цвета переключаются с помощью встроенной кнопки.

^ Что нужно                                                                                                               ^  Кол-во, шт  ^
| [[https://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                  |  1           |
| [[https://smartelements.ru/collection/shildy/product/sensor-shield|Sensor Shield]]                      |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-enkodera|Модуль энкодера]]                      |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-rgb-svetodioda-3|Модуль RGB светодиода]]        |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-mama|Провода папа-мама]] |  9           |


**Схема подключения:**
{{ :главная:модули:модуль_энкодера_пример_2_н.png?nolink |}}

**Скетч для загрузки:**
<file Arduino>
#include <Encoder.h> //подключение библиотеки для работы с энкодером

const int pinA = 5; //вывод подключения контакта А
const int pinB = 6; //вывод подключения контакта В
const int BUT = 7; //вывод подключения контакта D
const int pinsRGB [] = {9, 10, 11}; //выводы подключения RGB-светодиода

Encoder myEnc(pinA, pinB); //объявление объекта для работы с энкодером

long oldPosition  = -999; //переменная для хранения старой позиции
int colors [] = {0, 0, 0}; //переменная для хранения значений цветов
int color_index = 0; //индекс номера цвета в массиве
boolean lastButton = HIGH; //прошлое положение кнопки


void setup() {
  pinMode(BUT, INPUT); //установка режима вывода кнопки
}

void loop() {
  lastButton = digitalRead(BUT); //чтение текущего положения кнопки
  long newPosition = myEnc.read(); //чтение новой позиции
  
  if (newPosition != oldPosition) { //если она отлична от старой
    if (oldPosition != -999) { //начальная позиция не интересует
      //увеличить яркость текущего цвета
      colors[color_index] = constrain(newPosition - oldPosition + colors[color_index], 0, 255);
    }
    oldPosition = newPosition; //запомнить новую позицию
  }

  if (digitalRead(BUT) == LOW && lastButton == HIGH) { //проверка нажатия на кнопку
    color_index++; //увеличить индекс номера цвета
    if (color_index == 3) { //если он стал равен 3
      color_index = 0; //сбросить к 0 (красный цвет)
    }
  }
  
  lightLED(); //зажечь RGB - светодиод
}

void lightLED() {
  for (int i = 0; i < 3; i++) { //зажигание каждого цвета
    analogWrite(pinsRGB[i], colors[i]); //с соответствующей яркостью
  }
}
</file>