После использования потенциометра, захотелось использовать механический энкодер(он же датчик угла поворота) для управления чем либо.
Задача
При помощи механического энкодера менять яркость свечения светодиода.
Для реализации потребуется
- Arduino;
- Отладочная плата;
- Механический энкодер;
- Соединительные провода;
- Резистор 220 Ом;
- 2 резистора 10 КОм;
- Светодиод.
Реализация
Подробно описывать принцип действия энкодера не буду, все есть в wikipwdia, ссылочка была выше)
Для определения направления вращения энкодера будем использовать функцию преобразования кода Грея в двоичный код, функция взята прямо из wikipedia без изменений.
Подключаем провода:
- Правую и левую ножку энкодера подключаем D11 и D12 и через резисторы 10 КОм к 5V;
- Средний контакт энкодера подключаем к GND;
- К выходу D9 подключить резистор 220 Ом, к резистору подключаем анод светодиода, катод подключаем к выходу GND.
Код:
Примеров кода в интернетах очень много, читаем их, еще читаем их и пишем свой кусок кода)
enum {LED_PIN = 9, ENC_PIN1 = 11, ENC_PIN2 = 12};
int brightness = 120; // Яркость
int change = 10; // Изменение яркости
void setup() {
pinMode(ENC_PIN1, INPUT);
pinMode(ENC_PIN2, INPUT);
pinMode(LED_PIN, OUTPUT);
}
// Преобразование значения Грея в двоичный код
// без изменений прямиком из wilipedia
unsigned graydecode(unsigned gray) {
unsigned bin;
for (bin = 0; gray; gray >>= 1)
bin ^= gray;
return bin;
}
// grayValue - Значение Грея
// value - Преобразованное значение Грея
// oldValue - Старое преобразованное значение Грея
void loop() {
static uint8_t oldValue = 0;
uint8_t grayValue = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1), value = graydecode(grayValue);
if (value == 0) // Энкодер вращается
{
if (oldValue == 3) { // Вправо
if (brightness + change <= 255) brightness += change;
}
else if (oldValue == 1) { // Влево
if (brightness - change >= 0) brightness -= change;
}
}
analogWrite(LED_PIN, brightness); // Задаем яркость светодиода
oldValue = value;
delay(1);
}
Заливаем скетч на arduino и радуемся результату