Добрый день! Помогите разобраться. Есть скетч обработки энкодера. Все вроде работает. Но считает до бесконечности. Как сделать, чтоб при прохождении 360(или другого количества) импульсов появлялся ноль и счет начинался снова? Спасибо.
#include <LiquidCrystal.h>
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int pinA = 2; //Пин прерывания
int pinB = 12; //Любой другой пин
volatile int count = 0; // Счетчик оборотов
int actualcount = 0; // Временная переменная определяющая изменение основного счетчика
volatile int state = 0; // Переменная хранящая статус вращения
volatile int pinAValue = 0; // Переменные хранящие состояние пина, для экономии времени
volatile int pinBValue = 0; // Переменные хранящие состояние пина, для экономии времени
void setup()
{
lcd.begin(16, 2);
pinMode(pinA, INPUT); // Пины в режим приема INPUT
pinMode(pinB, INPUT); // Пины в режим приема INPUT
attachInterrupt(0, A, CHANGE); // Настраиваем обработчик прерываний по изменению сигнала - в этом примере отслеживаем только 1 пин
Serial.begin(9600); // Включаем Serial
}
void loop()
{
lcd.setCursor(2, 0);
lcd.print("Angle =");
delay(1000);
lcd.setCursor(11, 0);
lcd.print(count/4);
}
void A()
{
pinAValue = digitalRead(pinA); // Получаем состояние пинов A и B
pinBValue = digitalRead(pinB);
cli(); // Запрещаем обработку прерываний, чтобы не отвлекаться
if (!pinAValue && pinBValue) state = 1; // Если при спаде линии А на линии B лог. единица, то вращение в одну сторону
if (!pinAValue && !pinBValue) state = -1; // Если при спаде линии А на линии B лог. ноль, то вращение в другую сторону
if (pinAValue && state != 0) {
if (state == 1 && !pinBValue || state == -1 && pinBValue) { // Если на линии А снова единица, фиксируем шаг
count += state;
state = 0;
}
}
sei(); // Разрешаем обработку прерываний
}