Универсальный счетчик результатов спортивных упражнений

V Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке

Универсальный счетчик результатов спортивных упражнений

Овсянников А.П. 1
1МБОУ СОШ№1 им. М.М.Пришвина
Овсянников П.Ю. 1Австриевских Н.М. 2
1Детский оздоровительно-образовательный центр города Ельца
2МБОУ «Гимназия №11г. Ельца»
Автор работы награжден дипломом победителя II степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение.

Регулярные физические нагрузки – это основа правильного образа жизни и залог отсутствия проблем со здоровьем в преклонном возрасте. Люди, которые не пренебрегают занятиями спортом, меньше болеют, поскольку их иммунитет более эффективно борется с вирусами и возбудителями различных заболеваний, редко страдают избыточным весом и лучше справляются со стрессами и житейскими проблемами.

С 2014 года по поручению президента происходит возрождение комплекса ГТО в условиях современной России — полноценная программная и нормативная основа физического воспитания населения страны, нацеленная на развитие массового спорта и оздоровление нации.

Все большую популярность набирают фитнес-центры и спортивные клубы, в которых люди могут заняться спортом, как для поддержания здоровья, так и для достижения высоких результатов. Во всех случаях на тренировках необходимо придерживаться определенной методики, описывающей распределение нагрузки во время тренировок. В крупных спортивных центрах предоставляются услуги индивидуального инструктора, который следит за количеством выполненных физических упражнений за определенный промежуток времени.

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

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

Цель работы: разработать и изготовить прибор, упрощающий контроль количества выполняемых физических упражнений, использовать который можно как во время тренировок, так и при проведении соревнований. Добавить в прибор функцию передачи данных в персональный компьютер простым и надежным способом.

Гипотеза: возможно ли разработать и изготовить простой и недорогой прибор, который можно будет использовать для подсчета количества выполненных физических упражнений, как на соревнованиях, так и на тренировках.

Методы:

- теоретический анализ литературы по данной проблеме;

- эксперимент, наблюдение;

- разработка и сборка универсального счетчика;

- разработка и сборка датчиков для различных видов упражнений;

- разработка программного обеспечения.

Задачи:

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

Разработать принципиальную электрическую схему универсального счетчика упражнений.

Изготовить печатные платы для универсального счетчика.

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

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

Разработанное и изготовленное нами устройство предназначено для автоматического подсчета количества выполненных физических упражнений во время тренировок или при проведении соревнований. Ни в литературе, ни в сети Интернет не удалось обнаружить описания подобного многофункционального прибора и конструкций датчиков к нему, описанных ниже. Все конструкции, описания которых удалось обнаружить, оказались приспособлены только для одного конкретного спортивного упражнения. Кроме того, стоимость таких устройств оказалась довольно высока, а использование оказалось не очень удобным.

Универсальный счетчик может работать в двух режимах: тренировка и соревнования. В режиме тренировки производится подсчет количества выполненных упражнений и времени, затраченного на их выполнение. Эти значения поочередно высвечиваются на цифровом табло, а на каждое выполненное упражнение подается короткий звуковой и световой сигналы. Старт времени происходит автоматически при выполнении первого упражнения, а останавливается по нажатию кнопки на пульте судьи. Этой же кнопкой устройство переводится в начальное состояние. В этом состоянии возможно переключение в режим соревнований. При этом прибор будет считать количество выполненных упражнений за определенный промежуток времени – 3 минуты. Старт отсчета времени происходит при нажатии кнопки на пульте судьей соревнований, одновременно подается звуковой сигнал старта. В этом режиме судья, кратко нажимая на пульт, может отменить последнее засчитанное упражнение, если оно выполнено с нарушением требований. Длинным нажатием на кнопку судья может остановить соревнования. По окончании 3 минут подается звуковой сигнал и счет прекращается.

Устройство имеет возможность подключения к компьютеру, расположенному на удалении до 1 км обычным двухжильным витым кабелем, причем количество одновременно подключенных компьютеров может быть до 15 и располагаться они могут в любом месте соединительного кабеля. Это дает возможность при проведении соревнований просматривать результаты как судьям у тренажера, так и главным судьям, расположенным на удалении от места проведения соревнований.

Устройство решено было разделить на два функциональных блока: блок управления и блок индикации.

Принципиальная схема блока управления представлена на рисунке 1. В его основе используется микроконтроллер IC2, работающий на частоте 22,1184 МГц, стабилизированной кварцевым резонатором ZQ1. В энергонезависимой памяти микроконтроллера записан микрокод (приложение 1), реализующий логику работы устройства. Сигнал от датчика подается на контакт “Count” и через фильтр импульсных помех на резисторах R2, R4 и конденсаторе С7 поступает на вход микроконтроллера (вывод 6). Точно такой же фильтр на резисторах R3, R5 и конденсаторе С6 используется для сигнала от пульта судьи, подключаемого к контакту “Check”. Схема на резисторе R1, диоде VD1 и конденсаторе C3 производит сброс микроконтроллера при подаче питания на устройство. На микросхеме IC3 собран преобразователь передаваемых из микроконтроллера данных в формат RS-485 для связи с персональным компьютером. В качестве звуковой индикации используется пьезокерамический излучатель Z1, управляемый транзисторами VT1 и VT2.

Рис. 1. Принципиальная схема блока управления.

Напряжение 5 вольт, необходимое для питания и блока управления и блока индикации, получается из входного стабилизатором IC1.

К контактам DATA1-DATA3, CLK и SAVE подключается блок индикации. Схема рассчитана на одновременное подключение трех различных блоков индикации, в которых могут использоваться светодиодные цифровые индикаторы различных типов. В изготовленном образце используется всего 1 блок индикации, схема которого представлена на рисунке 2.

В основе блока используются микросхемы IC1, IC2, представляющие собой регистры с последовательным вводом информации и параллельным выводом. Цифровое табло работает по принципу динамической индикации: индикаторы LD1-LD3 включаются по очереди с частотой более 100 Гц, отображая каждый свою цифру, при этом из-за высокой частоты создается впечатление одновременного свечения разрядов. Такой способ индикации более сложен, но так как индикаторы являются самым энергоемким элементом конструкции, удалось втрое снизить ток потребления блоком индикации, что совсем немаловажно для устройства, имеющего батарейное питание.

Рис. 2. Принципиальная схема блока индикации.

Как видно из схемы, в микросхеме IC2 остались неиспользуемыми 5 выходов. При необходимости, используя их, можно увеличить количество разрядов цифрового табло до 8 не меняя общей схемы и без увеличения потребляемого тока.

Кроме того, используемые цифровые индикаторы с общим анодом, возможно заменить на индикаторы с общим катодом или на многоразрядные индикаторные сборки, произведя незначительные изменения в схеме блока индикации и исправив код микропрограммы.

Конструкция. Блок управления собран на печатной плате из одностороннего фольгированного стеклотекстолита (фото 1).

Фото 1. Печатная плата блока управления.

Рисунок печатной платы был разработан на компьютере в программе Sprint Layout, распечатан на лазерном принтере и перенесен на фольгу с помощью ламинатора (метод известен как «ЛУТ»).

Фото 2. Блок управления в сборе.

Так как для изменения логики работы прибора требуется извлечение микроконтроллера из устройства и подключение его к программатору, он размещен на панели (фото 2).

Фото 3. Лицевая сторона блока индикации.

Фото 4. Радиодетали блока индикации запаиваются со стороны дорожек.

Печатная плата блока индикации изготовлена аналогичным способом. Ее особенность состоит в том, что для крепления в корпус светодиодные индикаторы и остальные радиоэлементы должны располагаться на разных сторонах платы (фото 3, 4).

Универсальный счетчик собран в корпусе из пластика (фото 5). Датчики, пульт судьи и кабель связи с компьютером подключаются через разъемы, расположенные на боках корпуса.

Фото 5. Универсальный счетчик в сборе.

Пульт судьи, предназначенный для старта, остановки соревнований, а также отмены последнего неверно выполненного упражнения изготовлен из тонкой металлической трубки диаметром 16 мм и длиной 160 мм. С одной стороны закреплен кнопочный выключатель без фиксации, с другой – заглушка с выходящим из нее кабелем (фото 6). Пульт удобно удерживать одной рукой, нажимая кнопку большим пальцем.

Датчик выполнения сгибания и разгибания рук в упоре лежа на полу (далее «отжиманий от пола») представляет собой прямоугольную площадку из ДСП, установленную на ножки из 4 кнопок без фиксации на высоте, определенной правилами и включенных параллельно (фото 7). При выполнении упражнения спортсмен нажимает грудью на площадку, что вызывает срабатывание одной или нескольких кнопок.

Фото 6. Устройства пульта судьи.

Такая конструкция датчика по сравнению с известными однокнопочными конструкциями имеет ряд преимуществ: 1) стабильность срабатывания при любом угле нажатия; 2) произвольное расположения датчика во время упражнения; 3) простота изготовления.

Датчик для силовой станции представляет собой низковольтный двигатель постоянного тока, закрепленного так, чтобы его вал вращался от движущегося троса при выполнении упражнений. Вырабатываемое двигателем напряжение подается на светодиоды оптронов, включенных навстречу друг другу. При движении троса в одном направлении срабатывает один оптрон, при движении в обратную сторону – другой. Сигналы с выходов оптронов подаются на вход RS-триггера, который формирует полноценный сигнал для подачи на счетчик упражнений.

Во время работы устройство 1 раз в секунду отправляет в канал передачи данных текстовое сообщение, в котором передается выбранный режим работы устройства (тренировка или соревнования), состояние (ожидание, работа или остановка), количество выполненных упражнений и время на табло. Для просмотра информации достаточно настроить программу-терминал на работу с нужным COM-портом на скорости 9600 бод.

Фото 7. Датчик «отжиманий от пола».

При необходимости эти данные можно использовать для автоматического занесения данных в протоколы соревнований. Ниже показаны примеры расшифровки передаваемых данных и отображение их в понятной форме на экране компьютера.

Использование устройства.

Режим 1. Тренировка.

После включения питания прибор автоматически находится в этом режиме.

На цифровом табло отображается начальное значение времени: 0,00(минуты, секунды).

Для начала тренировки достаточно просто начать выполнять упражнение. Время начнет увеличиваться и каждые 3 секунды на табло будут поочередно появляться время тренировки и количество выполненных упражнений. Во время фиксации очередного упражнения будет подаваться короткий звуковой сигнал и вспышка зеленого светодиода.

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

Чтобы перевести устройство в исходное состояние нужно еще раз нажать и удерживать кнопку на пульте судьи более 2 секунд.

Режим 2. Соревнования.

Режим соревнований выбирается нажатием кнопки на лицевой части слева от индикатора. Включение режима показывает светящийся желтый светодиод.

На цифровом табло отображается начальное значение времени: 3,00(минуты, секунды).

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

Во время фиксации очередного упражнения будет подаваться короткий звуковой сигнал и вспышка зеленого светодиода. Если судья считает, что упражнение выполнено не по правилам, он может кратко нажать кнопку на пульте и отменить последнее засчитанное упражнение.

Когда время дойдет до 0, подается длинный звуковой сигнал и устройство перестает реагировать на датчик, а на табло отображается конечный результат.

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

Чтобы перевести устройство в исходное состояние нужно еще раз нажать и удерживать кнопку на пульте судьи более 2 секунд.

Вывод.

В своей работе мы использовали различные источники информации (научная и учебная литература, Интернет). Анализируя полученную информацию, мы выявили слабые стороны конструкций, выполняющих подобные функции, и постарались их исправить в своем устройстве. Получившийся универсальный счетчик результатов включает в себя как контролирующее устройство для тренировок, так и мощного помощника спортивным судьям. Использование устройства при проведении соревнований позволяет сократить количество судей и автоматизировать процесс фиксирования результата.

Так, в случае «отжиманий от пола» при сдаче нормативов ГТО, необходимо 3 человека в качестве судей: 1) контролирует время выполнения упражнения по секундомеру; 2) контролирует правильность выполнения упражнения; 3) записывает результаты в протокол. При использовании универсального счетчика достаточно 1 судьи: дает команду на старт и контролирует правильность выполнения упражнения, время выполнения контролируется прибором, а результаты в реальном времени передаются в компьютер.

Прибор может применяться в спортивных залах и фитнес-центрах, где необходим контроль количества выполняемых упражнения во время тренировки, на спортивных фестивалях, центрах сдачи ГТО и т.п. При необходимости могут быть изготовлены датчики и для других видов упражнений.

Литература:

 

Белкин В.Г., Бондаренко В.К. «Справочник радиолюбителя-конструктора» издательство: Москва «Радио и связь».

 

И.В.Левин «Справочник конструктора точных приборов» издание третье, Издательство «Машиностроение», Москва.

 

В.О. Шпаковский, «Для тех, кто любит мастерить», Москва, Просвещение

 

http://www.atmel.com – сайт производителя микроконтроллеров

 

Паронджанов В. Д. "Учись писать, читать и понимать алгоритмы. Алгоритмы для правильного мышления. Основы алгоритмизации." – М.: ДМК Пресс, 2012г.

 

Уитсон Дж. "500 практических схем на ИС": Пер. с англ. - М.: Мир, 1992г.

 

Токхейм Р. "Основы цифровой электроники": Пер. с англ.- М.: Мир, 1988г.

 

Галле К. "Как проектировать электронные схемы" - М.: ДМК Пресс, 2009г.

 

Иванов Б.С. "Электроника в самоделках",-М.: ДОСААФ, 2001г.

 

http://turbo51.com/

Приложение 1. Исходный код микропрограммы контроллера на языке Pascal.

program counter;

var

Speaker:Boolean absolute P1.0;

hc595_Data3:Boolean absolute P1.1;

hc595_Data2:Boolean absolute P1.2;

hc595_Data:Boolean absolute P1.3;

hc595_Clock:Boolean absolute P1.4;

hc595_Save:Boolean absolute P1.5;

CurrentModeLed:Boolean absolute P1.6;

Led:Boolean absolute P1.7;

CountInp:Boolean absolute P3.2; volatile;

CheckInp:Boolean absolute P3.3; volatile;

RS485Tx:Boolean absolute P3.4; volatile;

ExtPin:Boolean absolute P3.5;

WorkMode:Boolean absolute P3.7; volatile;

Flags: Byte; BitAddressable; volatile;

CounterFlag:Boolean absolute Flags.0;

NextSecondFlag:Boolean absolute Flags.1;

CountInpFlag:Boolean absolute Flags.2;

StopTimeFlag:Boolean absolute Flags.3;

ExecuteFlag:Boolean absolute Flags.4;

CanCancelFlag:Boolean absolute Flags.5;

CheckInpFlag:Boolean absolute Flags.6;

CurrentMode:Boolean absolute Flags.7;

SecondsDivider:Byte;volatile;

Data: array[0..2,Boolean] of Byte;

CurrentRange:Byte;

Time_CounterInterval:Byte;

PushCounter:Word;

CountInpTimer:Byte;volatile;

Minutes:Byte;

Seconds:Byte;

CheckInpPushTime:Byte;

BeepTimeout:Byte;

RS485Buffer:array[0..9] of Byte;

RS485Pointer:Byte;

ChmodeTimer:Byte;volatile;

LedTimer:Byte;volatile;

procedure SerialHandler; Interrupt Serial; Using 2;

var

tmp:Byte;

begin

if TI then begin

TI:=False;

if RS485Pointer = $FF then RS485Tx:=RS485_RECEIVE else begin

tmp:=RS485Buffer[RS485Pointer];

SBUF:=tmp;

Inc(RS485Pointer);

if tmp=RS485_END_BYTE then RS485Pointer:=$FF;

end;

end;

end;

procedure Timer0_Int; Interrupt Timer0; Using 1;

var

Range:Byte;

Value:Byte;

i,n:Byte;

begin

TL0 := Lo (ClockTimerValue);

TH0 := Hi (ClockTimerValue);

Dec(SecondsDivider);

if BeepTimeout0 then Dec(BeepTimeout) else Speaker:=True;

if SecondsDivider=0 then NextSecondFlag:=True;

if CountInpTimer0 then Dec(CountInpTimer);

if ChmodeTimer0 then Dec(ChmodeTimer);

if LedTimer0 then Dec(LedTimer) else Led:=True;

Inc(CurrentRange);

if CurrentRange>=MAX_RANGES then CurrentRange:=0;

Value:=Digits[Data[CurrentRange,CounterFlag]];

if (CurrentRange=2) and not CounterFlag then

Value:=Value and DEC_POINT_MASK;

for i:=2 downto 0 do begin

hc595_Data:=(CurrentRangei);

hc595_Clock:=True;

asm nop; nop; nop; nop; end;

hc595_Clock:=False;

hc595_Data:=False;

end;

n:=$80;

for i:=0 to 7 do begin

hc595_Data:=(Value and n)=n;

hc595_Clock:=True;

n:=n SHR 1;

asm nop; nop; nop; nop; end;

hc595_Clock:=False;

hc595_Data:=False;

end;

hc595_Save:=True;

asm nop; nop; nop; nop; end;

hc595_Save:=False;

end;

procedure SendRS485;

begin

if RS485Pointer $FF then exit;

RS485Tx:=RS485_TRANSMIT;

if not ExecuteFlag then begin

RS485Buffer[0]:=ord('W');

RS485Buffer[1]:=ord(CurrentMode)+$30;

RS485Buffer[2]:=ord('T');

RS485Buffer[3]:=Data[2,False]+$30;

RS485Buffer[4]:=Data[1,False]+$30;

RS485Buffer[5]:=Data[0,False]+$30;

RS485Buffer[6]:=RS485_END_BYTE;

end else if StopTimeFlag then begin

RS485Buffer[0]:=ord('E');

RS485Buffer[1]:=ord(CurrentMode)+$30;

RS485Buffer[2]:=ord('C');

if Data[2,True] = 10 then RS485Buffer[3]:= $20

else RS485Buffer[3]:=Data[2,True]+$30;

if Data[1,True] = 10 then RS485Buffer[4]:= $20

else RS485Buffer[4]:=Data[1,True]+$30;

RS485Buffer[5]:=Data[0,True]+$30;

RS485Buffer[6]:=RS485_END_BYTE;

end else begin

RS485Buffer[0]:=ord('C');

if Data[2,True] = 10 then RS485Buffer[1]:= $20

else RS485Buffer[1]:=Data[2,True]+$30;

if Data[1,True] = 10 then RS485Buffer[2]:= $20

else RS485Buffer[2]:=Data[1,True]+$30;

RS485Buffer[3]:=Data[0,True]+$30;

RS485Buffer[4]:=ord('T');

RS485Buffer[5]:=Data[2,False]+$30;

RS485Buffer[6]:=Data[1,False]+$30;

RS485Buffer[7]:=Data[0,False]+$30;

RS485Buffer[8]:=RS485_END_BYTE;

end;

RS485Pointer:=0;

SBUF:=RS485_START_BYTE;

end;

procedure Beep(Len:Byte);

begin

BeepTimeout:=Len;

Speaker:=False;

end;

procedure ConvertCounter;

var

i:Byte;

tmp:Word;

Dig:Byte;

begin

tmp:=PushCounter;

for i:=0 to MAX_RANGES-1 do begin

Dig:=tmp mod 10;

tmp:=tmp div 10;

if (Dig=0) and (i0) and (tmp=0) then Dig:=10;

Data[i,True]:=Dig;

end;

end;

procedure IncCounter;

begin

if PushCounter0 then Dec(PushCounter);

ConvertCounter;

end;

procedure ConvertTime;

begin

Data[2,False]:=Minutes;

Data[1,False]:=Seconds div 10;

Data[0,False]:=Seconds mod 10;

end;

procedure ResetCheck;

begin

ExecuteFlag:=False;

StopTimeFlag:=False;

CanCancelFlag:=False;

CounterFlag:=False;

CountInpTimer:=0;

Time_CounterInterval:=TIME_COUNTER_INTERVAL_VALUE-1;

PushCounter:=0;

ConvertCounter;

if CurrentMode then begin

Minutes:=TIME_TO_EXECUTE_MINUTES;

Seconds:=TIME_TO_EXECUTE_SECONDS;

end else begin

Minutes:=0;

Seconds:=0;

end;

ConvertTime;

end;

procedure DectrmentTime;

begin

if Seconds=0 then begin

if Minutes>0 then begin

Dec(Minutes);

Seconds:=59;

end;

end else Dec(Seconds);

ConvertTime;

if (Minutes=0) and (Seconds=0) then begin

CounterFlag:=True;

StopTimeFlag:=True;

Beep(255);

end;

end;

procedure IncrementTime;

begin

if Seconds=99 then exit;

if Seconds=59 then begin

Inc(Minutes);

Seconds:=0;

if Minutes>9 then begin

Seconds:=99;

Minutes:=9;

CounterFlag:=True;

end;

end else Inc(Seconds);

ConvertTime;

end;

procedure Init;

begin

P1:=$C7;

RS485Tx:=RS485_RECEIVE;

RS485Pointer:=$FF;

CurrentRange:=0;

CheckInpPushTime:=0;

SecondsDivider:=255;

Flags:=0;

ChmodeTimer:=0;

LedTimer:=0;

ResetCheck;

TL0 := Lo (ClockTimerValue);

TH0 := Hi (ClockTimerValue);

TL1:=Lo(BaudRateTimerValue);

TH1:=Lo(BaudRateTimerValue);

SCON:=SCON_SERIAL_MODE_1;

TMOD:=TMOD_TIMER1_MODE_2+TMOD_TIMER0_MODE_1;

TCON:=TCON_TIMER1_ENABLE+TCON_TIMER0_ENABLE;

IE:=IE_GLOBAL+IE_TIMER0+IE_UART;

end;

procedure EverySecond;

begin

if CheckInpFlag then Inc(CheckInpPushTime);

if CheckInpPushTime>=RESET_PUSH_TIME then begin

Beep(SHORT_BEEP_TIME);

end;

if ExecuteFlag and not StopTimeFlag then begin

if CurrentMode then DectrmentTime else IncrementTime;

if Time_CounterInterval>0 then Dec(Time_CounterInterval) else begin

Time_CounterInterval:=TIME_COUNTER_INTERVAL_VALUE-1;

if not StopTimeFlag then CounterFlag:=not CounterFlag else

CounterFlag:=True;

end;

end;

SendRS485;

NextSecondFlag:=False;

end;

procedure CheckMode;

begin

if not CheckInp then begin

if not ExecuteFlag then begin

ExecuteFlag:=True;

SecondsDivider:=255;

Beep(255);

end else begin

if not CheckInpFlag then begin

CheckInpFlag:=True;

CheckInpPushTime:=0;

end;

end;

end else begin

if CheckInpFlag and ExecuteFlag then begin

if CheckInpPushTime>=RESET_PUSH_TIME then begin

CheckInpPushTime:=0;

if not StopTimeFlag then begin

StopTimeFlag:=True;

CounterFlag:=True;

CheckInpFlag:=False;

end else ResetCheck;

end else begin

if not StopTimeFlag and CanCancelFlag then begin

DecCounter;

Beep(LONG_BEEP_TIME);

CanCancelFlag:=False;

end;

end;

CheckInpFlag:=False;

end;

end;

if not CountInp then begin

if not CountInpFlag and (CountInpTimer=0) and

not StopTimeFlag and ExecuteFlag then begin

CountInpFlag:=True;

LedTimer:=LED_TIMEOUT;

Led:=False;

IncCounter;

Beep(SHORT_BEEP_TIME);

CanCancelFlag:=True;

end;

end else begin

if CountInpFlag then begin

CountInpTimer:=COUNT_PAUSE_INTERVAL;

CountInpFlag:=False;

end;

end;

end;

procedure TrainMode;

begin

if not CheckInp then begin

if ExecuteFlag then begin

if not CheckInpFlag then begin

CheckInpFlag:=True;

CheckInpPushTime:=0;

end;

end;

end else begin

if CheckInpFlag and ExecuteFlag then begin

if CheckInpPushTime>=RESET_PUSH_TIME then begin

CheckInpPushTime:=0;

if not StopTimeFlag then begin

StopTimeFlag:=True;

CounterFlag:=True;

CheckInpFlag:=False;

end else ResetCheck;

end;

CheckInpFlag:=False;

end;

end;

if not CountInp then begin

ExecuteFlag:=True;

if not CountInpFlag and (CountInpTimer=0) and ExecuteFlag then begin

CountInpFlag:=True;

LedTimer:=LED_TIMEOUT;

Led:=False;

IncCounter;

Beep(SHORT_BEEP_TIME);

CanCancelFlag:=False;

end;

end else begin

if CountInpFlag then begin

CountInpTimer:=COUNT_PAUSE_INTERVAL;

CountInpFlag:=False;

end;

end;

end;

begin

Init;

CurrentModeLed:=not CurrentMode;

repeat

if not ExecuteFlag and (ChmodeTimer=0) then begin

if not WorkMode then begin

ChmodeTimer:=CHANGE_MODE_TIMEOUT;

CurrentMode:=not CurrentMode;

CurrentModeLed:=not CurrentMode;

ResetCheck;

end;

end;

if NextSecondFlag then EverySecond;

if CurrentMode then CheckMode else TrainMode;

until False;

end.

25

Просмотров работы: 259