Энкодер, как обнулить

Добрый день! Помогите разобраться. Есть скетч обработки энкодера. Все вроде работает. Но считает до бесконечности. Как сделать, чтоб при прохождении 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(); // Разрешаем обработку прерываний
}

Разработка ЦРУ? Почему не приложен (и правильно не оформлен)?

1 лайк

В 49 строке проверяйте значение count на выход за нужные ограничения и модифицируйте …

Опишите count как байт - будет меняться от 0 до 255 и сам сбрасываться на ноль при переполнении :slight_smile:

Врешь, у микроконтроллера конечная память.

1 лайк

А по делу есть что сказать?

В третьем сообщении по делу сказано.

Спасибо.

и в четвертом :slight_smile:

Вообще, на подобный вопрос трудно отвечать серьезно…

2 лайка

А что, всё, что выше этого Вашего сообщения, было не по делу?

Тогда, боюсь, по делу Вам могут сказать только здесь.

Мое сообщение относилось конкретному остряку, сообщившему, что у контроллера конечная память. Остальным весьма благодарен.

Я бы посоветовал всё-таки изучить память контроллера, если ты думаешь, что это шутка. Заодно и на решение своей проблемы наткнешься обязательно.

1 лайк

Вот откуда эта воинствующая безграмотность?
Если Вы не в состоянии понять адресованное Вам сообщение, это совсем не значит, что это сообщение не по существу. Скорее, это намек Вам, что неплохо бы немного подтянуть матчасть.
Тем более, что про бесконечность Вы явно сморозили глупость.

1 лайк