Постановка задачі
Задачею проекту є виготовлення спортивного таймеру для міні-футбольного турніру.
Розміри поля 20 х 40 метрів - виходячи з цього було прийнято рішення, робити цифри таймера висотою не менше 100 мм, використовуючи ультраяскраві світлодіоди.
Таймер повинний лічити час (наприклад 20 хв) одного з двох таймів футбольного матчу, після чого просто зупинитись до натискання кнопки рестарт. Також потрібно передбачити кнопку зупинки відліку часу при зупинці матчу посеред тайму. Після закінчення тайму необхідно подати звуковий сигнал, який повинний почути коментатор, який сидить поруч.
Вибір елементної бази
Для початку виберемо SMD ультраяскраві світлодіоди типу 5050 червоного кольору. Падіння напруги на такому світлодіоді 1,8 ... 2 В, а робочий струм 60 мА. Кожний з них складається з трьох світлодіодів в одному корпусі. SMD корпус буде зручно монтувати - нема необхідності свердлити сотні отворів в друкованій платі.
Для одного елементу символа цифри будемо використовувати 4 світлодіоди 5050.
Блок живлення буду використовувати зовнішній 9 В / 3 А
Для управління буду використовувати плату контролера Arduino Nano та 4 мікросхеми-розширювачі дискретних входів-виходів PCF8574 з комунікацією I2C по одній на кожний символ.
Як силові ключі буде прикольно використати SMD MOSFET транзистори AO3400. Вони вельми мініатюрні та на диво потужні.
Зі сторони коментатора футбольного матчу поставлю маленький символьний годинниковий індикатор TM1637
Для звукового сигналу буде узято п'єзо-динамік

Схема електрична принципова підключення елементів
На картинці показана основна частина схеми пристрою. Тут показані контролер, один з чотирьох розширювачів виходів, MOSFET транзистори та самі світлодіоди, а також задній індикатор. Усі 4 мікросхеми PCF8574 посажені на одну шину I2C. Та кожній з цих мікросхем надаються свої адреси на цій шині за допомогою подачі +5В або GND на адресні входи A0, A1, A2.
Плата з'єднується з контролером Nano за допомогою гребінки P1. Повна схема пристрою в PDF.
Опис друкованої плати
Друкована плата була розведена у програмі Altium та виготовлена з двохстороннього фольгованого стеклотекстоліту товщиною 1,5 мм (раджу брати 2 мм). З однієї сторони припаюються світлодіоди, їх обмежуючі резистори, силові ключі, а з іншої мікросхеми керування та п'єзо-динамік. Маркування світлодіодів усюди вказується в документаціях по різному - я спочатку не перевірив свої світлодіоди на полярність та припаяв навпаки, згідно першої-ліпшої документації. Довелося їх потім відпаювати феном та перевертати.


Конструкція спортивного таймеру
Корпус був виготовлений з МДФ-плити. Збоку просвердлені вентиляційні отвори, зверху приліплені найпростіші міні-кнопки.
Передню частину таймеру закрили оргсклом та заклеїли автомобільним тонуванням (можна в декілька шарів в залежності від затемнюючої сили плівки).
Було передбачено живлення контролера від акумулятора для запобігання скидання часу при неадекватному живленні блока живлення від мережі (але тут не будемо розглядати коло живлення).
Модулі та акумулятор були приклеєні рідкими цвяхами до корпусу.
Перша кнопка запускає та зупиняє відлік часу, друга - кнопка скидання на нуль. Третя кнопка входу в режим налаштувань часу матчу. В цьому режимі двома правими кнопками можна додавати або зменшувати в хвилинах тривалість тайму футбольного матчу.

Программа контроллера Arduino Nano
#include <PCF8574.h>
#include <Wire.h>
#include <TM1637.h>
uint8_t cifra[] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};
int sec = 0;
int minut = 0;
int timeset = 20;
int k = 1;
int budilnik = 0;
unsigned long previousMillis = 0;
unsigned long currentMillis;
const long interval = 1000;
#define CLK 4 //піни для підключення маленького індикатора TM1637
#define DIO 3
TM1637 indikatorik(CLK,DIO);
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
PCF8574 PCF4(0x20);
PCF8574 PCF3(0x21);
PCF8574 PCF2(0x22);
PCF8574 PCF1(0x23);
int speakerPin = 2;
const int button1 = 5; // вивід контролера для кнопки старт/стоп
int button1_old = 1;
const int button2 = 6; // вивід контролера для кнопки рестарт
int button2_old = 1;
const int button3 = 7; // вивід контролера для кнопки режим настройки времени тайма
int button3_old = 1;
const int button4 = 8; // вивід контролера для кнопки + хвилина
int button4_old = 1;
const int button5 = 9; // вивід контролера для кнопки - хвилина
int button5_old = 1;
int stage = 1; //поточний режим роботи спортивного таймеру
void setup()
{
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
pinMode(button5, INPUT_PULLUP);
delay(2000);
PCF4.write8(cifra[0]);
PCF3.write8(cifra[0]);
PCF2.write8(cifra[0]);
PCF1.write8(cifra[0]);
delay(1000);
indikatorik.init();// ініціалізація бібліотеки «TM1637.h»
indikatorik.set(BRIGHT_TYPICAL);//установка яскравості вказана константа дорівнює 2, значення за замовчанням
indikatorik.display(TimeDisp);
pinMode(speakerPin, OUTPUT);
currentMillis = millis();
previousMillis = currentMillis;
}
void loop()
{
if (stage == 1){
budilnik = 0;
sec = 0;
minut = 0;
PCF4.write8(cifra[0]);
PCF3.write8(cifra[0]);
PCF2.write8(cifra[0]);
PCF1.write8(cifra[0]);
TimeDisp[0] = 0;
TimeDisp[1] = 0;
TimeDisp[2] = 0;
TimeDisp[3] = 0;
indikatorik.display(TimeDisp);
delay(50);
}
if (stage == 300){
if ((digitalRead(button4)==LOW)&&(button4_old==1))
{
if (timeset!=99) timeset = timeset +1;
}
button4_old = digitalRead(button4);
if ((digitalRead(button5)==LOW)&&(button5_old==1))
{
if (timeset!=1) timeset = timeset -1;
}
button5_old = digitalRead(button5);
budilnik = 0;
sec = 0;
minut = 0;
PCF4.write8(cifra[timeset/10]);
PCF3.write8(cifra[timeset%10]);
PCF2.write8(0);
PCF1.write8(0);
TimeDisp[0] = timeset/10;
TimeDisp[1] = timeset%10;
TimeDisp[2] = 0;
TimeDisp[3] = 0;
indikatorik.display(TimeDisp);
delay(50);
}
if ((digitalRead(button1)==LOW)&&(button1_old==1))
{
if (stage != 100)stage = 100; else stage = 200;
}
button1_old = digitalRead(button1);
if ((digitalRead(button2)==LOW)&&(button2_old==1))
{
stage = 1;
}
button2_old = digitalRead(button2);
if ((digitalRead(button3)==LOW)&&(button3_old==1))
{
if (stage != 300)stage = 300; else stage = 1;
}
button3_old = digitalRead(button3);
currentMillis = millis();
if (stage == 100){
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
TimeDisp[0] = minut/10;
TimeDisp[1] = minut%10;
TimeDisp[2] = sec/10;
TimeDisp[3] = sec % 10;
indikatorik.display(TimeDisp);
PCF4.write8(cifra[minut/10]);
PCF3.write8(cifra[minut%10]);
PCF3.write(7, k);
if (k == 0) indikatorik.point(POINT_ON); else indikatorik.point(POINT_OFF); //блимання двох крапок
PCF2.write8(cifra[sec/10]);
PCF1.write8(cifra[sec % 10]);
if ((minut == timeset)&&(sec == 0)) {
if (budilnik == 0) {
tone (speakerPin, 500); //пищімо 100 мс на частоті 500 Гц
delay(400);
tone(speakerPin, 2000); //пищімо 100 мс на частоті 1000 Гц
delay(600);
tone(speakerPin, 1000); //пищімо 100 мс на частоті 1000 Гц
delay(1000);
noTone(speakerPin); //вимикаємо звук
budilnik = 1;
}
}else{
if (sec < 59) sec = sec+1; else {sec = 0; if (minut <99)minut = minut + 1; else minut = 0;}
if (k == 1) k = 0; else k = 1;
}
}
}
}

Висновки
Таймер вийшов дуже гарним та функціональним. Хлопцям на полі він одразу став рідним. Одна кнопка налаштувань відлетіла під час першої поїздки на турнір (збиралися від самого початку чимось захистити кнопки).
Плата відчутно гріється під світлодіодами. Збирались ставити в корпус вентилятор, але потім відмовились. При вимкненні живлення таймер деякий час зберігає значення часу, завдяки акумулятору.
Є плани приєднати до таймера замість маленької пищалки гучний гудок.
Моно підсилювач потужності 18 Вт TDA2030A
Модуль одноканального підсилювача потужності звукової частоти на основі легендарної мікросхеми TDA20..
62.86грн.
Драйвер двох колекторних двигунів L298N
Модуль драйвера для керування роботою одного двохполюсного високооммного крокового двигуна або двома..
105.58грн.
Клавіатура для панелі управління аналогова
Аналогова клавіатура може використовуватися як джойстик керування або як панель управління менюшкою ..
100.02грн.
Шилд для Arduino Nano и GSM SIM800 с 2реле
Шилд для проектів з використанням плати контролера Arduino Nano та GSM модуля SIM800. Вирішує пробле..
479.09грн.
Створення простого таймера на ESP32: приклад періодичного виклику функції
Створення простого таймера на ESP32: приклад періодичного виклику функції Під час розробки проєкт..




