Працюємо з 09:00 до 19: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);
      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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Електромагнітне реле 12 В

Електромагнітне реле 12 В

Має одну групу перемикаючих контактівСтрум комутації за змінної напруги 250 В - 10 А,за постійної на..

14.44грн.

Кронштейн для кріплення крокового двигуна

Кронштейн для кріплення крокового двигуна

Якісний сталевий кронштейн підходить для кріплення крокового двигуна Nema 17, а також для його модиф..

102.50грн.

Світлодіод ультраяскравий 5мм

Світлодіод ультраяскравий 5мм

Над-яскравий світлодіод діаметром 5 мм Корпус прозорий в світлодіодів різного кольору світіння. Тоб..

1.60грн.

Регулювання температури повітря вікном

Регулювання температури повітря вікном

Как часто мы попадаем в ситуацию, когда засыпаем теплым летним вечером, а просыпаемся от ночного рез..

Тримач акумулятора 3,7В типу 18650

Тримач акумулятора 3,7В типу 18650

Тримач для циліндричних акумуляторів типу 18650 на 3,7В..

18.55грн.