Часы реального времени и 4-х цифровой дисплей

Как следует из названия, сегодня рассмотрим часы реального времени и 4-х цифровой дисплей.
4-digit_and_RTC
Оба модуля приобретены все на том же AliExpress. Часы обошлись в 66р., а дисплей в 86р. Перед тем как переходить к опытам с Arduino рассмотрим их несколько подробнее.
4-digit display
Перед нами обычный светодиодный 7-ми сегментный индикатор на 4 цифры. Ну еще точечки после 2го разряда, как для часиков. Сзади модуля видим драйвер индикатора TM1637. Поискав по сети нахожу оригинальные datasheet на китайском либо корявенький перевод на английский. А драйвер то может гораздо больше чем 4 цифры:

  • управление 8 сегментами по 6 бит, т.е. 6 индикаторов цифра с точкой;
  • сканирование 8 линий по 2 бита, итого клавиатура из 16 кнопок с защитой от дребезга;
  • регулировка яркости;
  • встроенная цепь мигания;
  • встроенная цепь сброса;
  • все это удовольствие по 2 проводам, фактически I2C шина.

RealTimeClock
Этот модуль 2 в 1. Первое это высокоточные часы реального времени — DS3231, а второе память на 32кбита — AT24C32. Ну память понятное дело, можно туда записать что-нибудь, а потом считать это что-нибудь. Часы же умеют все что положено часам: секунды, минуты, часа, день, месяц, год до 2100, день недели; 2 будильника; 12/24 формат времени; температурная компенсация, точность встроенного сенсора +/-3 градуса. Работают с логикой 3.3В и 5В. Питание от батареи в отсутствии основного. Все общение с часами и памятью происходит по шине I2C, выбор адреса памяти возможен перемычками A0..A2, по умолчанию 0x57. Предусмотрены контакты для каскадирования шины I2C.
Для TM1637 есть несколько вариантов библиотек Arduino. Первый за авторством avishorp для управления 7-ми сегментными индикаторами. Второй, нам он и нужен, от Frankie.Chu именно для такого 4-х цифирного индикатора. Еще понадобится библиотека Jesse Tane управления аппаратным таймером.
Нижеприведенный скетч есть в примерах библиотеки DigitalTube. В нем задается начальное время и аппаратным таймером начинается его счет. Значение выводится на дисплей. При этом двоеточие после 2-ой цифры мигает 2 раза в секунду.

//
// Выводим заданное время на 4-х цифирный дисплей 
// и мигаем точками между часами и минутами
//
#include <TimerOne.h> // библиотека аппаратного таймера
#include "TM1637.h"   // библиотека 4-х цифирного дисплея 
#define ON 1
#define OFF 0

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;         // признак обновления дисплея
unsigned char halfsecond = 0;
unsigned char second;         // секунды
unsigned char minute = 0;     // минуты
unsigned char hour = 12;      // начало с 12 часов

// зададим подключение дисплея ко 2 и 3 портам Arduino
#define CLK 2    
#define DIO 3
TM1637 tm1637(CLK,DIO);

void setup()
{
// инициализация дисплея
 tm1637.set();
 tm1637.init();
 Timer1.initialize(500000);        // таймер на 500мс
 Timer1.attachInterrupt(TimingISR);// привяжем процедуру к прерыванию таймера  
}

void loop()
{
// если что то поменялось обновим запись времени 
// и выведем на дисплей
 if(Update == ON)
 {
  TimeUpdate();
  tm1637.display(TimeDisp);
 }
}

// процедура прерывания таймера
// считаем время и мигаем точками каждые 0,5с
void TimingISR()
{
 halfsecond ++;
 Update = ON;
 if(halfsecond == 2)
 {
  second ++;
  if(second == 60)
  {
   minute ++;
   if(minute == 60)
   {
    hour ++;
    if(hour == 24)hour = 0;
    minute = 0;
   }
   second = 0;
  }
  halfsecond = 0;  
 }
 ClockPoint = (~ClockPoint) & 0x01;
}

// процедура обновления записи времени из значений
void TimeUpdate(void)
{
 if(ClockPoint)tm1637.point(POINT_ON);
 else tm1637.point(POINT_OFF); 
 TimeDisp[0] = hour / 10;
 TimeDisp[1] = hour % 10;
 TimeDisp[2] = minute / 10;
 TimeDisp[3] = minute % 10;
 Update = OFF;
}


4-digit display test
Для модуля часов так же есть масса разных библиотек, например от JeeLabs доработанную разными товарищами с поддержкой DS1307, DS3231, DS3234. Для модуля памяти можно взять универсальную библиотеку Christian Paul. В ней поддерживаются чипы памяти Atmels EEPROM от 32 кбит до 512 кбит.

1 комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *