TM1637 Можно ли подключить более одной?

fere
fere аватар
Offline
Зарегистрирован: 04.12.2016

Доброго времени суток, уважаемые форумчане.

Взялся я тут пилить проект, цифровой термометр для гаража и возник один затык.

Имеется 3 датчика 18b20 инфа с них должна приходить на 3 дисплея TM1637.

Так вот, как и можно ли вообще полключить к ардуине все 3 дисплея для вывода температуры?

В данный момент использовал следующую инициализацию:

#include "TM1637.h"

#define CLK 3//pins definitions for TM1637 and can be changed to other ports       
#define DIO 2
TM1637 tm1637(CLK,DIO);

#define CLK1 9//pins definitions for TM1637 and can be changed to other ports       
#define DIO1 8
TM1637 tm1637_2(CLK1,DIO1);

При подключении второго дисплея ардуина виснет и не отвисает пока дисплей не отключишь.

Помогите решить задачу!

svm
Offline
Зарегистрирован: 06.11.2016

Варианта два:

1. Второй программный I2C

2. I2C коммутатор, можно самодельный http://arduino.ru/forum/programmirovanie/podklyuchenie-neskolkikh-i2c-ustroistv-s-odinakovymi-adresami

yden
Offline
Зарегистрирован: 30.01.2016

У меня подобный вопрос.

С разрешения ТС спрошу: можно к одной ардуинке (ESP 12e) подключить 3 TM1637 и выводить одну и ту же информацию (время)?

 

Спасибо

 

svm
Offline
Зарегистрирован: 06.11.2016

Когда я экспериментировал с I2C коммутатором, у меня были подключены параллельно 4 индикатора на TM1650 ( по архитектуре очень похожие на 1637) . При включении их без коммутатора на вывод все работали синхронно. Проблема возникала только при чтении клавиатуры. Правда есть нюанс , никакие библиотеки не использовал. Работал напрямую с регистрами дисплея.

romiras
Offline
Зарегистрирован: 12.07.2015
#include "TM1637.h" // Подключаем библиотеку
#define CLK_1 8 // первый семисегмент
#define DIO_1 9 // 
#define CLK_2 10 // второй семисегмент
#define DIO_2 11 //
TM1637 disp_1(CLK_1, DIO_1);
TM1637 disp_2(CLK_2, DIO_2);
void setup() {
  disp_1.set(7);
  disp_1.init(D4056A);
  disp_2.set(7);
  disp_2.init(D4056A);
 
diger67
Offline
Зарегистрирован: 25.07.2015

Прежде чем задавать вопросы почитайте даташит http://olimex.cl/website_MCI/static/documents/Datasheet_TM1637.pdf  . Есть два варианта или выделять для управления отдельные пины как в предыдущем посте или использовать что то типа 74hc245 и дишифратора bin -> dec. Или писать на основе готовой библиотеки свои функции.

fere
fere аватар
Offline
Зарегистрирован: 04.12.2016

romiras пишет:

#include "TM1637.h" // Подключаем библиотеку
#define CLK_1 8 // первый семисегмент
#define DIO_1 9 // 
#define CLK_2 10 // второй семисегмент
#define DIO_2 11 //
TM1637 disp_1(CLK_1, DIO_1);
TM1637 disp_2(CLK_2, DIO_2);
void setup() {
  disp_1.set(7);
  disp_1.init(D4056A);
  disp_2.set(7);
  disp_2.init(D4056A);
 

Ваш пример отказывается работать.

#include "TM1637.h" // Подключаем библиотеку
#define CLK_1 8 // первый семисегмент
#define DIO_1 9 // 
#define CLK_2 10 // второй семисегмент
#define DIO_2 11 //
TM1637 disp_1(CLK_1, DIO_1);
TM1637 disp_2(CLK_2, DIO_2);
void setup() {
  disp_1.set(7);
  //disp_1.init(D4056A);
  disp_2.set(7);
  //disp_2.init(D4056A);
  }

void loop() 
  {
  disp_1.display(1234);
  delay(2000);
  disp_2.display(5678);
  delay(2000);
  }

 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

#include <TM1637Display.h> // У меня библиотека другая делаю так.


ind_1val = 1234;
ind_1();

ind_2val = -987;
ind_2();


//~~~~~~~~~~~~~индикация TM 1637~~~~~~~~~~~~~~~~~~~~~
void ind_1(){//  первый индикатор
   #define CLK  12
   #define DIO  13
   TM1637Display display(CLK, DIO);
   display.setBrightness(0x0c); // установкa яркости  дисплея 
   display.showNumberDec(abs(ind_1val)); 
   if (ind_1val < 0){
   uint8_t data[] = { 0x40 };// вывод "-" .   1-4          0-3
   display.setSegments(data, 1, 0);//     . кол-во цифр, №-знакаместа
   }
    if (abs (ind_1val) < 10){//вывод не значащего ноля "0"
   uint8_t data[] = { 0x3f };// вывод "0" .   1-4          0-3
   display.setSegments(data, 1, 2);//     . кол-во цифр, №-знакаместа
    } }
  
void ind_2(){//  второй индикатор
   #define CLK  10
   #define DIO  11
   TM1637Display display(CLK, DIO);
   display.setBrightness(0x0c); // установкa яркости  дисплея
   display.showNumberDec(abs(ind_2val));
   if (ind_2val < 0){
   uint8_t data[] = { 0x40 };// вывод "-" .   1-4          0-3
   display.setSegments(data, 1, 0);//     . кол-во цифр, №-знакаместа
   }
    if (abs (ind_2val) < 10){//вывод не значащего ноля "0"
   uint8_t data[] = { 0x3f };// вывод "0" .   1-4          0-3
   display.setSegments(data, 1, 2);//     . кол-во цифр, №-знакаместа
 } }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

fere пишет:

Доброго времени суток, уважаемые форумчане.

Взялся я тут пилить проект, цифровой термометр для гаража и возник один затык.

Имеется 3 датчика 18b20 инфа с них должна приходить на 3 дисплея TM1637.

Так вот, как и можно ли вообще полключить к ардуине все 3 дисплея для вывода температуры?

В данный момент использовал следующую инициализацию:

#include "TM1637.h"

#define CLK 3//pins definitions for TM1637 and can be changed to other ports       
#define DIO 2
TM1637 tm1637(CLK,DIO);

#define CLK1 9//pins definitions for TM1637 and can be changed to other ports       
#define DIO1 8
TM1637 tm1637_2(CLK1,DIO1);

При подключении второго дисплея ардуина виснет и не отвисает пока дисплей не отключишь.

Помогите решить задачу!

 

fere
fere аватар
Offline
Зарегистрирован: 04.12.2016

Расскажите по подробнее пожалуйста. Не получается воспроизвести.

romiras
Offline
Зарегистрирован: 12.07.2015

зачем закомментировали 10 и 12 строки? Уберите слеши.

fere
fere аватар
Offline
Зарегистрирован: 04.12.2016

romiras пишет:

зачем закомментировали 10 и 12 строки? Уберите слеши.

Убрал, подключил, при старте на долю секунды мигает второй индикатор и все, больше ничего не происходит.

romiras
Offline
Зарегистрирован: 12.07.2015
#include "TM1637.h" // Подключаем библиотеку
#define CLK_1 8 // первый семисегмент
#define DIO_1 9 // 
#define CLK_2 10 // второй семисегмент
#define DIO_2 11 //
TM1637 disp_1(CLK_1, DIO_1);
TM1637 disp_2(CLK_2, DIO_2);
void setup() {
  disp_1.set(7);
  disp_1.init(D4056A);
  disp_2.set(7);
  disp_2.init(D4056A);
}
void loop()
{
  disp_1.display(1234);
  delay(2000);
  disp_2.display(5678);
  delay(2000);
}

По этому коду, не поленился собрал две ТМки(благо валялись) и уно. Все работает идеально. Проверьте правильность подключения. 

romiras
Offline
Зарегистрирован: 12.07.2015

Попробуйте запитать одельно семисегменты, не забудьте только объеденить землю унки и землю внешнего питания ТМок. 

romiras
Offline
Зарегистрирован: 12.07.2015

Попробуйте заменить библиотеку на эту: http://www.arduino.md/wp-content/uploads/library/TM1637-4-digit-display-tube.zip

fere
fere аватар
Offline
Зарегистрирован: 04.12.2016

romiras пишет:

Попробуйте запитать одельно семисегменты, не забудьте только объеденить землю унки и землю внешнего питания ТМок. 

Прошу прощения, действительно, при подключении доп линии 5В на второй дисплей все заработало!

Думаю тему можно закрывать.

Всем большое спасибо.

dokgor
Offline
Зарегистрирован: 17.09.2017

Доброго времени суток! Ребят, есть вопрос по отображению информации на часовом индикаторе ТМ1637. В целях обучения работы с ардой поставил задачу собрать устройство для управления байпасным краном на котле отопления. За основу сейчас взята ARDUINO UNO, часовой индикатор на ТМ1637 и датчик температуры DS18B20.  Код "собрал" из разных скетчей. Индикация температуры требуется в положительном диапазоне до 99*С и она отображаеся нормально, но, на 2и3 разрядах индикатора. Уже бьюсь третью ночь и не могу переместить на 0и1 разряд индикатора.......... Разряды смещаются, но, показания температуры от 1 до 16*С   -  "0"....."F" и всё, дальше крокозябры. Объясните пожалуйста на пальцах что не так.................

#include <Wire.h>
#include <DallasTemperature.h>
#include "TM1637.h"
#define CLK 3           //  LED_дисплей
#define DIO 2           //  LED_дисплей
#define ONE_WIRE_BUS 4  // датчик температуры на выв.4
#define PIN_motor_A    5  // выход на мотор A
#define PIN_motor_B    6  // выход на мотор B
#define PIN_Alarm    9  // выход сигнала аварии
#define PIN_open_stop   7  // датчик кран открыт
#define PIN_close_stop   8 // датчик кран закрыт
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637 tm1637(CLK, DIO);



void setup()
{
  tm1637.init();// инициализация библиотеки «TM1637.h»
  tm1637.set(3);//установка яркости
  pinMode(PIN_motor_A, OUTPUT);
  pinMode(PIN_motor_B, OUTPUT);
  pinMode(PIN_Alarm, OUTPUT);
  pinMode(PIN_open_stop, INPUT);
  pinMode(PIN_close_stop, INPUT);
  sensors.begin();
}

void loop()
{
  sensors.requestTemperatures();//  опрос температуры
  
  currentTemp = sensors.getTempCByIndex(0);
 
  delay(200);
  
  tm1637.display(currentTemp);//вывод на индикатор значение температуры
  //tm1637.display(0,currentTemp); !!!!!!  замена выше стоящей строки для смещения индикации влево
  if (currentTemp >= 90) {
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
  }
  if (currentTemp <= 80) {
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
  }
}