7 сегментный индикатор, модуль на TM1637

Существует несколько версий модулей базирующихся на драйвере TM1637, различие в 7 сегментном индикаторе, в основном это модули с сегментами высотой 0.36″, но есть и покрупнее, с  0.56″



Драйвер TM1637 берет на себя всю работу с динамической индикацией, По всей видимости, микросхема была разработана для использования в DVD плеерах, для отображения времени, модули также больше подходят для сборки часов.

Характеристики микросхемы:

  • Напряжение питание: 5V ±10%
  • Индикаторы, 6 разрядов и 8 элементов, поддержка индикаторов с общим анодом.
  • Возможность регулировки яркости.
  • Двух проводной последовательный интерфейс (CLK, DIO).

Подключение к Arduino:

Модуль можно подключать на любые свободные выходы arduino, питание у модуля 5 вольт.

Софт:

Библиотеку для работы с модулем можно взять тут или тут

После установки открываем пример, NumberFlow.ino,

#define CLK 6//pins definitions for TM1637 and can be changed to other ports       
#define DIO 7

в директивах (16,17 строка), указываем к каким контактам подключены выводы CLK и DIO модуля. В нашем случаи это 6 и 7.

После загрузки скетча в arduino видим на экране следующее.

Часы:

Модуль для часов, поэтому пример с часами. Как оно работает можно посмотреть на видео ниже.

 

код из видео
#include <Wire.h>
#include "TM1637.h"
 
#define DS1307_I2C_ADDRESS 0x68

#define CLK 6 
#define DIO 7 

TM1637 tm1637(CLK,DIO);

///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}
  
 
void setup() {
  
  Wire.begin();
  tm1637.init();
  tm1637.set(1); // яркость, от 0 до 7
  tm1637.point(POINT_ON); // включаем точки
  
  /*  // установка часов
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  second = 30;
  minute = 0;
  hour = 14;
  dayOfWeek = 3; // день недели
  dayOfMonth = 1; // день
  month = 4;
  year = 14;

  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
 */
}

void loop(){
  
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
   
  
  int8_t TimeDisp[4]; 
  
  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;
  
  tm1637.display(TimeDisp);
 
  
}