Часы на Digispark и 7 сегментном индикаторе на TM1637

Простые самодельные часы с 7 сегментным индикатором на TM1637, часами реального времени DS3231 и платформе Digispark.

Похожий проект часов, но на Arduino находится тут,

Как все подключено:

Схема условная, для тех кто желает посмотреть работу собрав проект на модулях, на ней не отображены подтягивающие резисторы для I2C и прочая обвязка часов DS3231 которая должна стоять на плате.

Печатная плата:

Плата, по сути является модулем часов с контактами для Digispark и индикатора на TM1637.

ds3231_digisparkплата в формате .lay

Компоненты:

код для Digispark:

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

В проекте не предусмотрена настройка времени, нужно установить время в DS3231 с компьютера.

#include <TinyWireM.h>
#include "TM1637.h"
  
#define CLK 1
#define DIO 4 

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
{
   TinyWireM.beginTransmission(0x68);
   TinyWireM.send(0);
   TinyWireM.send(decToBcd(second));    
   TinyWireM.send(decToBcd(minute));
   TinyWireM.send(decToBcd(hour));     
   TinyWireM.send(decToBcd(dayOfWeek));
   TinyWireM.send(decToBcd(dayOfMonth));
   TinyWireM.send(decToBcd(month));
   TinyWireM.send(decToBcd(year));
   TinyWireM.endTransmission();
}

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

  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0);
  TinyWireM.endTransmission();

  TinyWireM.requestFrom(0x68, 7);

  *second     = bcdToDec(TinyWireM.receive() & 0x7f);
  *minute     = bcdToDec(TinyWireM.receive());
  *hour       = bcdToDec(TinyWireM.receive() & 0x3f); 
  *dayOfWeek  = bcdToDec(TinyWireM.receive());
  *dayOfMonth = bcdToDec(TinyWireM.receive());
  *month      = bcdToDec(TinyWireM.receive());
  *year       = bcdToDec(TinyWireM.receive());
}

float get3231Temp(){
  byte tMSB, tLSB; 
  float temp3231;

  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0x11);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(0x68, 2);

  if(TinyWireM.available()) {
    tMSB = TinyWireM.receive(); //2's complement int portion
    tLSB = TinyWireM.receive(); //fraction portion

    temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
    temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
  }
  else {
    //oh noes, no data!
  }

  return temp3231;
}
/////////////////

void setup() {
  
  TinyWireM.begin();
  tm1637.init();
  tm1637.set(1); // яркость, от 0 до 7
  
  /*  // установка часов  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);
  
  byte temp = get3231Temp(); 
  
  int8_t TimeDisp[4]; 
  
 
  // вывод температуры .. каждые 10 сек на 2 сек
  if (second >= 0 && second <= 1 ||
      second >= 10 && second <= 11 ||
      second >= 20 && second <= 21 ||
      second >= 30 && second <= 31 ||
      second >= 40 && second <= 41 ||
      second >= 50 && second <= 51)
  {
    tm1637.point(POINT_OFF); // выключаем точки 
    TimeDisp[0] = 19; //  
    TimeDisp[1] = temp / 10; // заполняем массив
    TimeDisp[2] = temp % 10;
    TimeDisp[3] = 12; // C

  }
/*  // дата  else if(second >= 25 && second <= 26 ||          second >= 45 && second <= 46)  {    tm1637.point(POINT_OFF);      TimeDisp[0] = dayOfMonth / 10;    TimeDisp[1] = dayOfMonth % 10;    TimeDisp[2] = month / 10;    TimeDisp[3] = month % 10;    }*/
  /// часы
  else
  {  
    tm1637.point(POINT_ON); // включаем точки
    TimeDisp[0] = hour / 10;
    TimeDisp[1] = hour % 10;
    TimeDisp[2] = minute / 10;
    TimeDisp[3] = minute % 10;        
  }
  
  tm1637.display(TimeDisp); // отправляем массив на экран
 
  
}

 


Также можно ознакомится с видео: