подключение енкодера KY-040_2 по одному проводу на аналоговый вход
купил енкодер на самоделку и нет лишних портов. поразмыслив нашел способ подключить его на аналоговый вход т.е по одному только проводу. понадобиться два резистора на 10к и кусок кода.
Скрытый текст
byte EncoderRead;
byte EncoderState;
byte EncoderLastState;
byte EncoderCode;
byte EncoderRot;
//демонстрация
byte up;
byte dw;
byte sw;
void setup() {
Serial.begin(9600);
}
void loop() {
EncoderRead = analogRead(A7) / 4; // 127 (148) 170 (180) 191 (223) 255
if (EncoderRead > 25) { //если что то нажато:
if (EncoderRead < 148) {EncoderState = 1;} //замкнут первый резистор
if (EncoderRead >= 148 && EncoderRead < 180) {EncoderState = 2;} //замкнут второй резистор
if (EncoderRead >= 180 && EncoderRead < 223) {EncoderState = 3;} //замкнуто оба резистора
if (EncoderRead >= 223) {EncoderState = 4;} //нажата кнопка
if (EncoderState != EncoderLastState) { //если возникло новое состояние
EncoderCode = EncoderCode * 10 + EncoderState; //записываем в EncoderCode последовательность возникновения EncoderState
if (EncoderCode == 13 || EncoderCode == 32) { // вычисляется последовательность 132 или 231
EncoderRot = 1;
EncoderCode = 0;
}
if (EncoderCode == 23 || EncoderCode == 31) {
EncoderRot = 2;
EncoderCode = 0;
}
if (EncoderCode == 4) { //если нажата кнопка
EncoderRot = 3;
EncoderCode = 0;
}
if (EncoderCode > 33) { //если какой то глюк
EncoderRot = 0;
EncoderCode = 0;
}
EncoderLastState = EncoderState;
}
}
else { //обнуляем переменные
EncoderCode = 0;
EncoderState = 0;
EncoderLastState = 0;
}
//демонстрация:
if (EncoderRot == 1) {
EncoderRot = 0;
up++;
}
if (EncoderRot == 2) {
EncoderRot = 0;
dw++;
}
if (EncoderRot == 3) {
EncoderRot = 0;
sw++;
}
Serial.print("UP=");
Serial.print(up);
Serial.print(" DOWN=");
Serial.print(dw);
Serial.print(" SWITCH=");
Serial.print(sw);
Serial.println("");
}
как это работает: когда происходит "щелчок" то енкодер замыкает на землю сначала один вывод (CLK или DT), потом оба, потом первый отключается а остается второй (DT или CLK), потом выключаются и второй. параллельно одному из "встроенных" резисторов подпаивается еще один на 10к, общее становиться 5к (можно поменять smd но кому нужен лишний геммор ?) на GND енкодера подпаиватся еще один один резюк на 10к, который дает делитель напряжения. если не подпаивать первый то направления вращения не определить а так через analogRead() понятно куда вращается енкодер: сначала возникает одно напряжение (10к--10к), потом второе(10к--(10к+5к), потом третье (10к--5к) . в зависимости от порядка возникновения понятно куда вал вращается. если возникает максимум - Vcc то нажата кнопка.
похожим способом т.е на один аналоговый вход при помощи резисторов можно подключить 12 разрядную клавиатуру (как у кнопочных телефонов)