Описание
Этот тип переключателя представляет собой инкрементальный датчик угла поворота. Фактически, он является наиболее широко используемым из всех поворотных энкодеров из-за его низкой стоимости и способности подавать сигналы, которые можно легко интерпретировать для получения информации, связанной с движением, например скорости.
Вращаясь, поворотный энкодер может подсчитывать частоту выходных импульсов в положительном и обратном направлении во время вращения, в отличие от счетчика поворотного потенциометра без ограничения счета. С помощью кнопки на поворотном энкодере его можно вернуть в исходное состояние, начиная с нуля.
Код тестирования
int redPin = 2;
int yellowPin = 3;
int greenPin = 4;
int aPin = 6;
int bPin = 7;
int buttonPin = 5;
int state = 0;
int longPeriod = 5000; // Время на зеленом или красном
int shortPeriod = 700; // Период времени при изменении
int targetCount = shortPeriod;
int count = 0;
установка void ()
{
pinMode (aPin, INPUT);
pinMode (bPin, ВХОД);
pinMode (buttonPin, ВВОД);
pinMode (redPin, ВЫХОД);
pinMode (yellowPin, ВЫХОД);
pinMode (greenPin, ВЫХОД);
}
пустой цикл ()
{
count ++;
если (digitalRead (buttonPin))
{
setLights (HIGH, HIGH, HIGH);
}
еще
{
int change = getEncoderTurn ();
int newPeriod = longPeriod + (изменение * 1000);
если (newPeriod> = 1000 && newPeriod <= 10000)
{
longPeriod = newPeriod;
}
если (количество> targetCount)
{
setState ();
count = 0;
}
}
задержка (1);
}
int getEncoderTurn ()
{
// возвращаем -1, 0 или +1
статический int oldA = LOW;
статический int oldB = LOW;
int результат = 0;
int newA = digitalRead (aPin);
int newB = digitalRead (bPin);
если (newA! = oldA || newB! = oldB)
{
// что-то изменилось
если (oldA == LOW && newA == HIGH)
{
результат = - (oldB * 2 - 1);
}
}
oldA = newA;
oldB = newB;
вернуть результат;
}
int setState ()
{
если (состояние == 0)
{
setLights (ВЫСОКИЙ, НИЗКИЙ, НИЗКИЙ);
targetCount = longPeriod;
состояние = 1;
}
иначе, если (состояние == 1)
{
setLights (ВЫСОКИЙ, ВЫСОКИЙ, НИЗКИЙ);
targetCount = shortPeriod;
состояние = 2;
}
иначе, если (состояние == 2)
{
setLights (LOW, LOW, HIGH);
targetCount = longPeriod;
состояние = 3;
}
иначе, если (состояние == 3)
{
setLights (НИЗКИЙ, ВЫСОКИЙ, НИЗКИЙ);
targetCount = shortPeriod;
состояние = 0;
}
}
void setLights (int красный, int желтый, int зеленый)
{
digitalWrite (redPin, красный);
digitalWrite (yellowPin, желтый);
digitalWrite (greenPin, зеленый);
}