энкодер и ТМ1637
- Войдите на сайт для отправки комментариев
Втр, 16/01/2018 - 20:45
Доброе время суток всем!
никак не могу подружить энкодер КУ020 и индикатор 4 разрядный 7ми сегментный на ТМ1637.
Отдельно все работает. Вместе никак. Индикатор молчит либо держит предыдущее сосстояние от ПРИМЕРА Number Flow
#include "TM1637.h" #define C 0//pins definitions for TM1637 and can be changed to other ports #define D 1 TM1637 tm1637(C,D); #define pin_CLK 2 #define pin_DT 3 #define pin_Btn 13 unsigned long CurrentTime, LastTime; enum eEncoderState {eNone, eLeft, eRight, eButton}; int EncoderA, EncoderB, EncoderAPrev, counter; bool ButtonPrev; eEncoderState GetEncoderState() { // Считываем состояние энкодера eEncoderState Result = eNone; CurrentTime = millis(); if (CurrentTime >= (LastTime + 10)) { // Считываем не чаще 1 раза в 10мс для уменьшения ложных срабатываний LastTime = CurrentTime; if (digitalRead(pin_Btn) == LOW ) { if (ButtonPrev) { Result = eButton; // Нажата кнопка ButtonPrev = 0; } } else { ButtonPrev = 1; EncoderA = digitalRead(pin_CLK); EncoderB = digitalRead(pin_DT); if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0 if (EncoderB) Result = eRight; // B=1 => энкодер вращается по часовой else Result = eLeft; // B=0 => энкодер вращается против часовой } EncoderAPrev = EncoderA; // запомним текущее состояние } } return Result; } void setup() { pinMode(pin_DT, INPUT); pinMode(pin_CLK, INPUT); pinMode(pin_Btn, INPUT_PULLUP); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор Serial.begin(115200); counter =0; tm1637.init (); //TM1637is the type of the module tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7; } void loop() { switch (GetEncoderState()) { case eNone: return; case eLeft: { counter--; if(counter == -1) {counter =24;} break; } case eRight: { counter++; if(counter > 24) {counter =0;} break; } case eButton: { counter = 0; break; } } Serial.println(counter); tm1637.display(2,counter); }
Энкодер подключен CLK-A pin 2, DT-B pin 3, SW (кнопка) - pin 13
4 разрядный дисплей на базе ТМ1637 CLK pin 0, DIO pin 1
Ну и питание соответствующим образом.
Что Хочу? Хочу энкодером воводить на разряды 2 и 3 дисплея цифирки (переменную, в данном случае - counter)от 0 до 24, а на 0 и1 разряд динамически выводить другую переменную, но это потом. Пока никак стартовать эту часть не могу. К сожалению ноги с 4 по 12 уже заняты другими подключениями.
Подскажите чем можете.
Вы в курсе, что на D0 и D1 сидит UART, который Serial?
Да, я всегда стараюсь их не использовать, но у меня с D5 по D12 все занято другими подключениями. На 2 и 3 висит энкодер. Остается 13 (для нуля от энкодера) и 0 и 1. В проекте, правда, есть пара управляющих кнопок подключенных к Д5 и Д6. Это входы. Возможно их перенести на Д0 и Д1 , а 7ми сегментник (ТМ1637) пернести на Д5 и Д6?
Зачем тогда используете одновременно и Serial и индикатор?
Sadman привет! я несколько скорректировал свой предыдущий коммент и дал полную картину по входам.
Вопрос (Зачем тогда используете одновременно и Serial и индикатор?) Чесно говоря не совсем понял. А куда мне его тогда подключить? Индикация нужна, это как некая переменная, которая используется в программе для движения моторчика. Но это уже детали и нет смысла погружаться....
А в принципе, у меня свободны А3-А5, ведь кнопки я могу перенести туда и читать для анализа через analogRead. Мне там нужно только проанализировать 1 или0 HIGH or LOW. И тогда на Д5 и Д6 подключить ТМ1637. Как ???
Вот тут, что у вас будет принимать TM-ка - от Serial-а байты? И что показывать будет?
76
Serial
.println(counter);
77
tm1637.display(2,counter);
Serial используютолько для отладки для вывода в порт.
А 77 строкой пытаюсь попробовать вывести переменную на индикатор,правда не знаю, позволит ли это библиотека.
Так. Давайте на пальцах. Вот у вас есть ухо, в него орут двое человек одновременно. Слова которого из них вы сможете разобрать?
То есть 0 и 1 Тх и Rх включаются по Serial?
Посмотрите коммент №4
Думаю, что у вас не какая-то особенная ардуина, где у МК Serial0 RX/TX выведены на какие-то другие пины. Так что да.
Как цифровые вы можете использовать A0-A5, A6-A7 - только как аналоговые.
получилось вот так
НО! на команду tm1637.display(2,counter); не ругается но вывод идет в 2 разряд от 0 до F и потом всякие отдельные черточки.Причем b и d маленькие, остальные ПРОПИСНЫЕ -БОЛЬШИЕ!
то есть надо бы приобразовать COUNTER в двух разрядное число. А вот в порт идет нормально от 0 до 24!
УРЯ! Закрутилось!!!! Ха! А почему в одном случае /10 а в другом %10 ? Просвятите старика, плиз
УРЯ! Закрутилось!!!! Ха! А почему в одном случае /10 а в другом %10 ? Просвятите старика, плиз
Возьмите число 14, разделите его на 10. Сколько получится, без учёта дробной части? Правильно - 1. Возьмите число 14, и получите остаток от деления на 10 (оператор %). Сколько получится? Правильно - 4.
Огромное спасибо! Где тут вешаются вымпелы Ударников Ардуинского Труда?
Как правильно вставить код, ссылкой или целиком?
Почему-то верхние несколько строк серые..., хотя они нужны