Один мой приятель играет в хоккей и когда узнал, что я увлекаюсь программированием МК, попросил сделать ему и его команде таймер на шесть минут.
Задачи поставил следующие:
1. Управление дистанционно (чтобы не подъезжать к табло)
2. Звуковая индикация
3. Световая индикация
4. Возможность прибавлять/убавлять минуты/секунды, а также пауза и сброс таймера
Подобрал следующие компоненты
Ардуино Мини -1шт.
Порядка ста светодиодов красного свечения
Радиоканальные модули на 433 Мгц (приемник и передатчик)
Реле на 12 Вольт
Звуковая сирена "Иволга"
Поскольку я всего лишь любитель в области программирования, то особо прошу не пинать)))
Представляю вам, дорогие пикабушники-радиолюбители, код этого изобретения.
Может кому понадобится еще. Если будут вопросы, обращайтесь. Всегда рад помочь
Собственно сам код:
#include <SevenSegmentDisplay.h> //Библоитека для работы с самыми обычными индикаторами
SevenSegmentDisplay<false, QuadriDigit<9,13,12,11> > ss(2,3,4,5,6,7,8,1); // значение false или true определяет полярность дисплея: общий катод или общий анод
/////////Переменные времени
unsigned m = 6; //минуты: то,что друг просил
unsigned s = 0; //секунды
unsigned t = 0; //общее значение времени
unsigned long preMillis1 = 0;
unsigned long preMillis2 = 0;
unsigned long preMillis3 = 0;
/////////Кнопки. Переменные
int dp = HIGH; //Выход точки в состояние HIGH
int out_relay = LOW; //Выход реле в состояние LOW
unsigned long c = 0;
void setup()
{
// сюда подключаются каналы приемника
pinMode(A0, INPUT); //Старт/Стоп
pinMode(A1, INPUT); //+
pinMode(A2, INPUT); //-
pinMode(A4, OUTPUT); //Выход на реле
pinMode(10, OUTPUT); //Выход на точку
}
void loop()
{/////////работа кнопок/////////////////////////////
if (digitalRead(A0)==HIGH) //Если кнопка нажата и удерживается, то
{
dp_blink(); //мигает точка и
if (millis() - preMillis1 > 1000)
{
preMillis1 = millis();
{
countdown(); //ведется отсчет
}
}
}
else
if (digitalRead(A0)==LOW) //Если кнопка отжата, то
{
digitalWrite (10,HIGH); //точка постоянно горит
}
/////////Прибавление/убавление минут///////////////
if (millis() - preMillis2 > 500) //Задержка полсекунды
{
preMillis2 = millis();
{
if(digitalRead(A1)==HIGH)
{
m++; //на прибавление
c=0; //сброс реле
}
if(digitalRead(A2)==HIGH)
{
m--; //или убавление
if (m == 0) //Если минуты равны 0, то
{
m=0; //присвоить минутам 0
c=0; //сброс реле
}
}
}
}
/////////вывод на индикатор//////////////////////
t = m*100+s;
if (t == 0)
{
relay(); //вызов функции реле
flash(); //вызов функции мигания индиктора
}
ss.print(t);
}
////////Управление реле///////////////////////
void relay()
{
c++;
if (c == 1) //Время работы реле
{
digitalWrite (A4, HIGH);
}
else
digitalWrite (A4, LOW);
}
/////////мигание индикатора: мигает 0:00
void flash()
{
digitalWrite(9, LOW);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,HIGH);
delay(250);
digitalWrite(9, HIGH);
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
delay(250);
}
/////////Отсчет/////////////////
void countdown()
{
if (s>0)
{
s--;
}
else if (s==0 && m>0)
{
s=59;
m--;
}
else if(s==0 && m==0)
{
t=0;
}
}
////////Мигание точки/////////////////////
void dp_blink()
{
if (millis() - preMillis3 > 500)
{
preMillis3 = millis();
if (dp == HIGH)
dp = LOW;
else
dp = HIGH;
digitalWrite(10, dp);
}
}