--------------------------GND | -------------/------------D15 A | -------------/------------ D2 BUTTON | -------------/------------ D4 B ВСЁ ПОДКЛЮЧЕНО ЧЕРЕЗ ВСТРОЕННЫЕ РЕЗИСТОРЫ... (картинка не загружается..)
Так, Господа... Каким то неведомым мне боком, эта собака (извиняюсь за выражение) заработала.. В общем, я с сайта разраба скачал повторно скетч.. Не знаю, чем он отличается,. Но там почти все так же, как у меня.. Только у меня для проверки вставлен сериал.. Не более.. Код тот же, только мой не работает, а здесь работает...
Для тех, кто с этим же столкнётся.. (Паять ничего не надо, работает по встроенным резисторам) Спойлер: Код Код (C++): // Объявляем переменные int pinA = 4; // Пины прерываний int pinB = 15; // Пины прерываний volatile long pause = 50; // Пауза для борьбы с дребезгом volatile long lastTurn = 0; // Переменная для хранения времени последнего изменения volatile int count = 0; // Счетчик оборотов int actualcount = 0; // Временная переменная определяющая изменение основного счетчика volatile int state = 0; // Статус одного шага - от 0 до 4 в одну сторону, от 0 до -4 - в другую volatile int pinAValue = 0; // Переменные хранящие состояние пина, для экономии времени volatile int pinBValue = 0; // Переменные хранящие состояние пина, для экономии времени void setup() { pinMode(pinA, INPUT_PULLUP); // Пины в режим приема INPUT pinMode(pinB, INPUT_PULLUP); // Пины в режим приема INPUT attachInterrupt(digitalPinToInterrupt(pinA), A, CHANGE); // Настраиваем обработчик прерываний по изменению сигнала attachInterrupt(digitalPinToInterrupt(pinB), B, CHANGE); // Настраиваем обработчик прерываний по изменению сигнала Serial.begin(9600); // Включаем Serial } void loop() { if (actualcount != count) { // Чтобы не загружать ненужным выводом в Serial, выводим состояние actualcount = count; // счетчика только в момент изменения Serial.println(actualcount); } } void A() { if (micros() - lastTurn < pause) return; // Если с момента последнего изменения состояния не прошло // достаточно времени - выходим из прерывания pinAValue = digitalRead(pinA); // Получаем состояние пинов A и B pinBValue = digitalRead(pinB); cli(); // Запрещаем обработку прерываний, чтобы не отвлекаться if (state == 0 && !pinAValue && pinBValue || state == 2 && pinAValue && !pinBValue) { state += 1; // Если выполняется условие, наращиваем переменную state lastTurn = micros(); } if (state == -1 && !pinAValue && !pinBValue || state == -3 && pinAValue && pinBValue) { state -= 1; // Если выполняется условие, наращиваем в минус переменную state lastTurn = micros(); } setCount(state); // Проверяем не было ли полного шага из 4 изменений сигналов (2 импульсов) sei(); // Разрешаем обработку прерываний if (pinAValue && pinBValue && state != 0) state = 0; // Если что-то пошло не так, возвращаем статус в исходное состояние } void B() { if (micros() - lastTurn < pause) return; pinAValue = digitalRead(pinA); pinBValue = digitalRead(pinB); cli(); if (state == 1 && !pinAValue && !pinBValue || state == 3 && pinAValue && pinBValue) { state += 1; // Если выполняется условие, наращиваем переменную state lastTurn = micros(); } if (state == 0 && pinAValue && !pinBValue || state == -2 && !pinAValue && pinBValue) { state -= 1; // Если выполняется условие, наращиваем в минус переменную state lastTurn = micros(); } setCount(state); // Проверяем не было ли полного шага из 4 изменений сигналов (2 импульсов) sei(); if (pinAValue && pinBValue && state != 0) state = 0; // Если что-то пошло не так, возвращаем статус в исходное состояние } void setCount(int state) { // Устанавливаем значение счетчика if (state == 4 || state == -4) { // Если переменная state приняла заданное значение приращения count += (int)(state / 4); // Увеличиваем/уменьшаем счетчик lastTurn = micros(); // Запоминаем последнее изменение } }