Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18: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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
SIM800L как припаять гребенку

SIM800L как припаять гребенку

Привет, друзья! Это короткая статья под названием SIM800L как припаять гребенку. Модули GSM связ..

Джойстик 2 оси аналоговый влагозащищенный 5К

Джойстик 2 оси аналоговый влагозащищенный 5К

Джойстик аналоговый для установки в плоскую панельВлагозащищенной является только верхняя часть джой..

529.98грн.

Блок питания 9 В 2 А с разъемом 5,5мм x 2,1мм

Блок питания 9 В 2 А с разъемом 5,5мм x 2,1мм

Импульсный блок питания розеточного типа с разъемом 5,5мм x 2,1ммВходное напряжение переменного..

231.58грн.

Муфта на шаговый двигатель 5x5x25мм

Муфта на шаговый двигатель 5x5x25мм

Данная муфта служит переходником между валами 5 мм и 5 мм. Тоесть имеет с обеих сторон отверстие диа..

57.63грн.

Ремень зубчатый 6 мм 200 мм

Ремень зубчатый 6 мм 200 мм

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

41.98грн.