энкодер и ТМ1637

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Доброе время суток всем!

никак не могу подружить энкодер КУ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 уже заняты другими подключениями.

Подскажите чем можете.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вы в курсе, что на D0 и D1 сидит UART, который Serial?

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Да, я всегда стараюсь их не использовать, но у меня с D5 по D12 все занято другими подключениями. На 2 и 3 висит энкодер. Остается 13 (для нуля от энкодера) и 0 и 1. В проекте, правда, есть пара управляющих кнопок подключенных к Д5 и Д6. Это входы. Возможно их перенести на Д0 и Д1 , а 7ми сегментник (ТМ1637) пернести на Д5 и Д6?

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Зачем тогда используете одновременно и Serial и индикатор?

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Sadman привет! я несколько скорректировал свой предыдущий коммент и дал полную картину по входам.

Вопрос (Зачем тогда используете одновременно и Serial и индикатор?) Чесно говоря не совсем понял. А куда мне его тогда подключить? Индикация нужна, это как некая переменная, которая используется в программе для движения моторчика. Но это уже детали и нет смысла погружаться....

А в принципе, у меня свободны А3-А5, ведь кнопки я могу перенести туда и читать для анализа через analogRead. Мне там нужно только проанализировать 1 или0 HIGH or LOW. И тогда на Д5 и Д6 подключить ТМ1637. Как ???

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот тут, что у вас будет принимать TM-ка - от Serial-а байты? И что показывать будет?

76  Serial.println(counter);
77   tm1637.display(2,counter);

 

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Serial используютолько для отладки для вывода в порт.

А 77 строкой пытаюсь попробовать вывести переменную на индикатор,правда не знаю, позволит ли это библиотека. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Так. Давайте на пальцах. Вот у вас есть ухо, в него орут двое человек одновременно. Слова которого из них вы сможете разобрать?

EuBeginer
Offline
Зарегистрирован: 16.11.2015

То есть 0 и 1 Тх и Rх включаются по Serial?

Посмотрите коммент №4

sadman41
Offline
Зарегистрирован: 19.10.2016

Думаю, что у вас не какая-то особенная ардуина, где у МК Serial0 RX/TX выведены на какие-то другие пины. Так что да.

Как цифровые вы можете использовать A0-A5, A6-A7 - только как аналоговые. 

EuBeginer
Offline
Зарегистрирован: 16.11.2015

получилось вот так

#include "TM1637.h"
#define CLK 4//pins definitions for TM1637 and can be changed to other ports       
#define DIO 5
TM1637 tm1637(CLK,DIO);
#define pin_CLK 2
#define pin_DT  3
#define pin_Btn 13 //pins for encoder , 13 for ZERO
 
EuBeginer
Offline
Зарегистрирован: 16.11.2015

НО! на команду tm1637.display(2,counter); не ругается но вывод идет в 2 разряд от 0 до F и потом всякие отдельные черточки.Причем b и d маленькие, остальные ПРОПИСНЫЕ -БОЛЬШИЕ!

то есть надо бы приобразовать COUNTER в двух разрядное число. А вот в порт идет нормально от 0 до 24!

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
tm1637.display(2,counter/10);
tm1637.display(3,counter%10);

 

EuBeginer
Offline
Зарегистрирован: 16.11.2015

УРЯ! Закрутилось!!!! Ха! А почему в одном случае /10 а в другом %10 ? Просвятите старика, плиз

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

EuBeginer пишет:

УРЯ! Закрутилось!!!! Ха! А почему в одном случае /10 а в другом %10 ? Просвятите старика, плиз

Возьмите число 14, разделите его на 10. Сколько получится, без учёта дробной части? Правильно  - 1. Возьмите число 14, и получите остаток от деления на 10 (оператор %). Сколько получится? Правильно - 4.

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Огромное спасибо! Где тут вешаются вымпелы Ударников Ардуинского Труда?

Как правильно вставить код, ссылкой или целиком?

Почему-то верхние несколько строк серые..., хотя они нужны

 

EuBeginer
Offline
Зарегистрирован: 16.11.2015
#include "TM1637.h"
#define CLK 4//pins definitions for TM1637 and can be changed to other ports       
#define DIO 5
TM1637 tm1637(CLK,DIO);
#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 (CLK, OUTPUT);
//  pinMode (DIO, OUTPUT);
  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/10);
  tm1637.display(3,counter%10);
}