Подарок на День святого Валентина: Счетчик дней вместе своими руками
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Модуль часов реального времени (RTC) DS3231 | 1 |
| Четырехразрядный 7-сегментный индикатор KYX-5461AS для Arduino | 1 |
| Плата для прототипирования (breadboard) | 1 |
| Перемычки (набор) | 1 |
| Arduino UNO | 1 |
| Резистор 1 кОм | 1 |
О проекте
В 2017 году, в сентябре, я начинал второй курс университета и встретил замечательную девушку. Мы переехали жить вместе с её друзьями и в итоге разделили этаж дома — только мы двое. Мы подружились, и через пару месяцев начали встречаться. День нашего знакомства — 10 декабря 2017 года (формат UK: 10.12.2017).
Почти год спустя я подумывал, что подарить на годовщину, и пришла идея: сделать что-то своими руками, используя знания по электронике. Я решил создать счетчик дней, прошедших с начала наших отношений, и поместить его в фоторамку вместе с нашим совместным фото.
Этот проект отлично подойдет в качестве подарка на годовщину или просто как интересное DIY-устройство. Самая сложная часть — программирование, но я подготовил шаблон кода с комментариями, чтобы вы могли легко вставить свою дату.
Схема подключения
Схема доступна по ссылке: circuito.io
- Скопируйте ссылку и откройте в браузере
- Нажмите "Add components"
- Добавьте: RTC (DS3231) и 7-сегментный индикатор 20мм (выберите generic, не SparkFun)
- Соберите схему по диаграмме, соединяя контакты перемычками
Код (DaysCounter.ino)
Для работы понадобятся библиотеки RTClib и SevSeg. Установите их через Arduino IDE: Sketch → Include Library → Add .ZIP Library.
Важно: В строке 7 кода укажите свою дату начала отношений: DateTime dtBegin (2017, 12, 9, 0, 0, 0); — первые три числа это год, месяц, день.
#include <RTClib.h>
#include <SevSeg.h>
SevSeg sevseg;
RTC_DS3231 rtc;
DateTime dtBegin(2017, 12, 9, 0, 0, 0); // <-- ИЗМЕНИТЕ ЭТУ ДАТУ
TimeSpan tsPassed;
void showInfo(const DateTime& dt) {
Serial.print("NOW:");
Serial.print(dt.year(), DEC); Serial.print('/');
Serial.print(dt.month(), DEC); Serial.print('/');
Serial.print(dt.day(), DEC); Serial.print(' ');
Serial.print(dt.hour(), DEC); Serial.print(':');
Serial.print(dt.minute(), DEC); Serial.print(':');
Serial.print(dt.second(), DEC);
Serial.print("\tPASSED:");
Serial.print(tsPassed.days(), DEC); Serial.print(' ');
Serial.print(tsPassed.hours(), DEC); Serial.print(':');
Serial.print(tsPassed.minutes(), DEC); Serial.print(':');
Serial.print(tsPassed.seconds(), DEC);
Serial.println();
}
void delayWithUpdate(uint32_t parDelay) {
uint32_t started = millis();
while (millis() < started + parDelay) {
sevseg.refreshDisplay();
}
}
void setup() {
Serial.begin(9600);
Serial.println(__TIME__);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
delay(1000);
// Раскомментируйте для настройки времени RTC, загрузите, потом закомментируйте и загрузите снова
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
byte numDigits = 4;
byte digitPins[] = {7, 8, 9, 10};
byte segmentPins[] = {2, 3, 4, 5, 11, 12, 13, 6};
bool resistorsOnSegments = false;
byte hardwareConfig = COMMON_CATHODE;
bool updateWithDelays = false;
bool leadingZeros = false;
bool disableDecPoint = true;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins,
resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(100);
sevseg.setNumber(1234, 1);
delayWithUpdate(1000);
sevseg.setNumber(8888, 1);
delayWithUpdate(1000);
}
void loop() {
sevseg.refreshDisplay();
DateTime now = rtc.now();
tsPassed = now - dtBegin;
static uint32_t nextReportMillis = 0;
static uint16_t prevDaysPassed = 0;
if (tsPassed.days() != prevDaysPassed) {
prevDaysPassed = tsPassed.days();
sevseg.setNumber(prevDaysPassed, 0);
}
if (millis() > nextReportMillis) {
showInfo(now);
nextReportMillis = millis() + 5000;
}
}
Производственный процесс
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
- Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)
- Высокоскоростной тахометр на Arduino: новый алгоритм измерения RPM до 2 знаков после запятой
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
- Своё рулевое управление (джойстик) для игр на Arduino
- FM-радиоприемник на Arduino и модуле TEA5767