// подключение библиотек для RTC
#include <Wire.h>
#include <Time.h>
#include <DS137RTC.h>
// подключение библиотеки для TM1637
#include "TM1637.h"
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK,DIO);
// строка, собираемая из данных, приходящих в последовательный порт
String inputString = "";
boolean stringComplete = false; // флаг комплектности строки
// для данных времени
int8_t ListTime[4]={0,0,0,0};
// для данных dd/mm
int8_t ListDay[4]={0,0,0,0};
// разделитель
boolean point=true;
// для смены время / день-месяц
unsigned long millist=0;
void setup() {
Serial.begin(9600); // запустить последовательный порт
// запуск дисплея
tm1637.init();
// яркость дисплея
//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
tm1637.set(BRIGHTEST);
}
void loop() {
tmElements_t tm;
// ожидание конца строки для анализа поступившего запроса:
// и установки времени
if (stringComplete) {
tm.Day=(int(inputString[0])-48)*10+(int(inputString[1])-48);
tm.Month=(int(inputString[3])-48)*10+(int(inputString[4])-48);
tm.Year=CalendarYrToTm((int(inputString[6])-48)*1000+(int(inputString[7])-48)*100+(int(inputString[8])-48)*10+(int(inputString[9])-48));
tm.Hour=(int(inputString[11])-48)*10+(int(inputString[12])-48);
tm.Minute=(int(inputString[14])-48)*10+(int(inputString[15])-48);
tm.Second=(int(inputString[17])-48)*10+(int(inputString[18])-48);
RTC.write(tm); // записать время в RTC
// очистить строку
inputString = "";
stringComplete = false;
}
// получение времени
if (RTC.read(tm)) {
ListTime[0]=tm.Hour/10;
ListTime[1]=tm.Hour%10;
ListTime[2]=tm.Minute/10;
ListTime[3]=tm.Minute%10;
ListDay[0]=tm.Day/10;
ListDay[1]=tm.Day%10;
ListDay[2]=tm.Month/10;
ListDay[3]=tm.Month%10;
}
else {
;
}
if(millis()-millist>=10000) {
millist=millis();
}
else if(millis()-millist>=5000) {
// вывод день - месяц
tm1637.display(0,ListDay[0]);
tm1637.display(1,ListDay[1]);
tm1637.display(2,ListDay[2]);
tm1637.display(3,ListDay[3]);
tm1637.point(false);
}
else {
// вывод времени
tm1637.display(0,ListTime[0]);
tm1637.display(1,ListTime[1]);
tm1637.display(2,ListTime[2]);
tm1637.display(3,ListTime[3]);
tm1637.point(point);
}
delay(500);
// поменять индикацию точек
point=!point;
}
// процедура вывода на дисплей с добавлением до двух цифр
void print2digits(int number) {
if (number >= 0 && number < 10)
{ Serial.print("0");}
Serial.print(number);
}
// получение данных по последовательному порту
void serialEvent() {
while (Serial.available()) {
// получить очередной байт:
char inChar = (char)Serial.read();
// добавить в строку
inputString += inChar;
// /n - конец передачи
if (inChar == '\n')
{stringComplete = true;}
}
}