В предыдущей статье было рассмотрено использование модуля индикации 4-х разрядного 7-и сегментного на сдвиговых регистрах 74НС595. В этой статье будет простой пример реализации простого секундомера с использованием выше указанного модуля индикации.
Частотомер состроит из модуля индикации 74НС595, одной кнопки и платы Arduino Nano. Управление секундомером очень простое, при подачи питания на индикаторе отражается 00,00, при первом нажатии на кнопку запуска происходит отсчет времени с разрешением 0,01 с до 99,99 секунды, затем разрешение уменьшается до 0,1 сек. с 100,0 до 999,9 секунды, далее разрешение секундомера равно 1 секунде. При втором нажатии на кнопку счет времени останавливается, третье нажатие обнуляет показание. Максимальное время измерения секундомера 9999 секунд.
#include <MsTimer2.h> byte razr[5] = {0x08, 0x04, 0x02, 0x01, 0x00};// 0123 byte digit[12] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF}; // 0123456789 byte point = 0x80; //точка float k=0.000; int k1,t,n; byte a[4]; unsigned long time,time1; void setup(){ MsTimer2::set(10, to_Timer);// задаем период 10...20 мс MsTimer2::start();// старт индикации pinMode(3, OUTPUT); // RCLK pinMode(4, OUTPUT); // SCLK pinMode(2, OUTPUT); // DIO pinMode(10,INPUT); // кнопка старт / стоп } void to_Timer(){ if(n==1){time++;} } void loop(){ if(digitalRead(10)==HIGH&&n==0&&millis()-time1>200){n=1;time1=millis();} if(digitalRead(10)==HIGH&&n==1&&millis()-time1>200){n=2;time=time;time1=millis();} if(digitalRead(10)==HIGH&&n==2&&millis()-time1>200){time=0;n=0;time1=millis();} if(k<10){k1=round(k*100);t=1;} else if(k<100){k1=round(k*100);t=1;} else if(k<1000){k1=round(k*10);t=2;} else {k1=k;t=4;} a[0]=k1/1000; a[1]=k1/100%10; a[2]=k1/10%10; a[3]=k1%10%10; for(int i=0;i<5;i++){ digitalWrite(3, LOW); if(i==t){shiftOut(2, 4, MSBFIRST, digit[a[i]] ^ point);} else{shiftOut(2, 4, MSBFIRST, digit[a[i]]);} shiftOut(2, 4, MSBFIRST, razr[i]); digitalWrite(3, HIGH);} k=(float)time/100; delay(5); // паузой от 1 до 10 мс можно регулировать яркость свечения индикатора 1 - макс. яркость, 10 - миним. }
Если сравнивать скетч с кетчами на странице «Модуль индикации на 74НС595 (Arduino)» , то видно, что код индикатора выведен из функции to_Timer() и помещен в функцию loop() , это позволяет очень точно воспроизводить таймером интервал времени 10 мс, поэтому все временные задержки при нажатии кнопки используют функцию millis().
Скетчи на странице «Модуль индикации на 74НС595 (Arduino)» больше подойдут для применения совместно с различными датчиками которые имеют большое время опроса (датчики температуры, давления, влажности и др.), в этих скетчах код индикации помещен в функцию таймера и не зависит от времени исполнения кода помещенного в функцию loop().
Библиотека MsTimer2.h — MsTimer2.zip