Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Подарок на День святого Валентина: Счетчик дней вместе своими руками

Компоненты и материалы

Компонент Количество
Модуль часов реального времени (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

  1. Скопируйте ссылку и откройте в браузере
  2. Нажмите "Add components"
  3. Добавьте: RTC (DS3231) и 7-сегментный индикатор 20мм (выберите generic, не SparkFun)
  4. Соберите схему по диаграмме, соединяя контакты перемычками
Подарок на День святого Валентина: Счетчик дней вместе своими руками

Код (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;
  }
}

Производственный процесс

  1. Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
  2. Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
  3. Find Me: Умный поисковик вещей на Arduino и Bluetooth
  4. Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
  5. DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
  6. Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)
  7. Высокоскоростной тахометр на Arduino: новый алгоритм измерения RPM до 2 знаков после запятой
  8. NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
  9. Своё рулевое управление (джойстик) для игр на Arduino
  10. FM-радиоприемник на Arduino и модуле TEA5767