Працюємо з 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Термоклей 11мм 20см

Термоклей 11мм 20см

Клей для термопістолетаДіаметр 11 ммДовжина 20 смКолір прозорий..

6.10грн.

Електро насос прозорий 12 В 100°С

Електро насос прозорий 12 В 100°С

Насос працює на основі діафрагми та може застосовуватися для перекачування харчових продуктівВитрата..

154.72грн.

Тримач батарейок 2 х АА

Тримач батарейок 2 х АА

Кейс для 2-х батарейок типу АА з дротами під пайкуДовжина дротів 21,5 см..

13.17грн.

Светодиод трёхцветный 5 мм

Светодиод трёхцветный 5 мм

Трьохкольоровий світлодіод діаметром 5 ммКольори: синій, червоний, зеленийЗагальний мінус..

4.55грн.

Реле 12В 2А з двома групами перемикаючих контактів

Реле 12В 2А з двома групами перемикаючих контактів

Електромагнітне реле з двома групами перемикаючих контактів. Робоча напруга на котушці: 12ВНава..

35.18грн.