Працюємо з 09:00 до 20:00 без вихідних.
Київ лівий берег біля ТЦ Квадрат

Постановка задачи

Задачей проекта является изготовление спортивного таймера для мини-футбольного турнира.

Размеры поля 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); //ждем 100 Мс
      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;
   }
 }
}
 
}


Выводы

Таймер получился очень красивым и функциональным. Ребятам на поле он сразу стал родным. Одна кнопка настроек отлетела в первой же поездке на турнир (собирались изначально чем-то защитить кнопки).

Плата ощутимо греется под светодиодами. Собирались ставить в корпус вентилятор, но потом отказались. При выключении питания таймер некоторое время сохраняет значение времени, благодаря аккумулятору.

Есть планы присоединить к таймеру вместо маленькой пищалки громкий гудок.

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Радиаторы для Orange PI или Raspberry PI

Радиаторы для Orange PI или Raspberry PI

Набор из трёх радиаторов охлаждения для процессора миникомпьютера и его микросхем памятиМатериал - а..

32.40грн.

Шестерня для зубчатого ремня на 40 зубьев под ось 8 мм

Шестерня для зубчатого ремня на 40 зубьев под ось 8 мм

Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 40 ..

60.04грн.

Фольгированный текстолит 70х100мм

Фольгированный текстолит 70х100мм

Односторонний фольгированный медью текстолит для изготовления печатных плат Размеры 70 х 100 мм Тр..

30.35грн.

Модуль SPI i2c для LCD индикаторов

Модуль SPI i2c для LCD индикаторов

Модуль припаивается на LCD-индикатор типа LCD 2004, LCD 1602.Обеспечивает связь жидкокристаллическог..

21.99грн.

Модуль реле для Wemos D1 mini

Модуль реле для Wemos D1 mini

Модуль с электромагнитным реле для установки на плату контроллера Wemos D1 miniХарактеристики реле: ..

52.96грн.