Простой секундомер (модуль индикации 74НС595) (Arduino)

В предыдущей статье было рассмотрено использование модуля индикации 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

Добавить комментарий

Войти с помощью: