Простые самодельные часы с 7 сегментным индикатором на TM1637, часами реального времени DS3231 и платформе Digispark.
Похожий проект часов, но на Arduino находится тут,
Как все подключено:
Схема условная, для тех кто желает посмотреть работу собрав проект на модулях, на ней не отображены подтягивающие резисторы для I2C и прочая обвязка часов DS3231 которая должна стоять на плате.
Печатная плата:
Плата, по сути является модулем часов с контактами для Digispark и индикатора на TM1637.
плата в формате .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); // отправляем массив на экран }
Также можно ознакомится с видео:
https://www.youtube.com/watch?v=GILPEzyDptk