| Ваш IP: 54.224.150.24 | Online(14) - гости: 7, боты: 7 | Загрузка сервера: 1.39 ::::::::::::

Секундомер на Arduino

Секундомер выполнен на основе Arduino Nano (Uno), показания секундомера выводятся на индикатор 1602. На индикатор выводятся показания часов (до 24), минут, секунд и десятые доли секунды.

Секундомер содержит два секундомера управляемые одной кнопкой, алгоритм работы секундомера следующий:

  • При первом нажатии на кнопку происходит запуск первого секундомера (1 строка индикатора)
  • Второе нажатие на кнопку переводит остановившиеся показания первого секундомера на вторую строку индикатора, при этом отсчет времени в первой строке продолжается, отображая время  второго секундомера.
  • Третье нажатие на кнопку останавливает работу второго секундомера.
  • При четвертом нажатии происходит сброс показаний всех секундомеров.

Отсчет времени секундомера выполняется при помощи функции millis(). Функция возвращает время в мс, с момента запуска текущей программы. Время считается в параллельном процессе и не зависит от алгоритмов выполнения программы, остановок, в том числе и функцией delay(), и т.п. Точность отсчета времени функцией millis() определяется точностью и стабильностью частоты кварцевого резонатора платы Arduino.

Соберите схему показанную на рисунке:

Загрузите в микроконтроллер следующий скетч:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7

unsigned long time0, time1; 
byte ms, s, m, h, ms1, s1, m1, h1, kn, pin, start1, stop1, blok;

void setup(){
  lcd.begin(16, 2);// LCD 16X2
  pinMode(6,INPUT);// кнопка на входе 6
}

void loop(){
  kn = digitalRead(6); // считываем значение со входа 6

    if(kn == HIGH && start1 == 0 && blok == 0){ // запуск счета, первое нажатие кнопки
    start1 = 1;// если кнопка нажата start1 = 1, разрешен отсчет времени
    time1=millis(); // засекаем время нажатия кнопки
  }
  if(millis()-time1 <= 200){ // устраняем дребезг кнопки, блокировка нажатия 200 мс
    kn = LOW;
  } 

  if(kn == HIGH && start1 == 1 && stop1 == 0){// перенос данных во вторую строку, второе нажатие кнопки
    stop1 = 1; // было второе нажатие кнопки
    ms1 = ms; 
    s1 = s; 
    m1 = m; 
    h1 = h; 
    time1 = millis(); // засекаем время нажатия кнопки
  }
  if(millis() - time1 <= 200){ // устраняем дребезг кнопки, блокировка нажатия 200 мс
    kn = LOW;
  } 

  if(kn == HIGH && start1 == 1 && stop1 == 1){// остановка счета, третье нажатие кнопки
    start1 = 0;// запрещен отсчет времени
    blok = 1;// блокировка перехода на первое нажатие кнопки
    time1 = millis(); // засекаем время нажатия кнопки
  }
  if(millis() - time1 <= 200){ // устраняем дребезг кнопки, блокировка нажатия 200 мс
    kn = LOW;
  } 

  if(kn == HIGH && start1 == 0 && stop1 == 1){// обнуление всех переменных, общий сброс
    ms = 0;
    s = 0;
    m = 0;
    h = 0;
    ms1 = 0;
    s1 = 0;
    m1 = 0;
    h1 = 0;
    blok = 0;
    pin = 0;
    start1 = 0;
    stop1 = 0;
    delay(500);// устраняем дребезг кнопки 500 мс пауза после сброса
  }

  if(start1 == 1){ // фиксация нажатия кнопки
    if(pin == 0){ // начало отсчета после нажатия кнопки
      time0 = millis();// устанавливаем время начала отсчета
      pin = 1;
    }

    if(millis() - time0 > 99){
      time0 = millis();
      ++ms; // отсчет 0,1 с
      if(ms > 9){
        ms = 0;
        ++s; // отсчет 1 с
      }
      if(s > 59){
        s = 0; 
        ++m; // отсчет 1 мин
      }
      if(m > 59){
        m = 0;
        ++h; // отсчет 1 час
      }
      if(h > 23){
        h = 0;
      }
    }
  }
  // вывод информации на экран 1 строка
  lcd.setCursor(3,0); 
  if(h < 10){
    lcd.print("0");
  }
  lcd.print(h); // часы
  lcd.print(":");
  if(m < 10 ){
    lcd.print("0");
  }
  lcd.print(m); // минуты
  lcd.print(":");
  if(s < 10){
    lcd.print("0");
  }
  lcd.print(s);// секунды
  lcd.print(":");
  lcd.print(ms);// мс
  // вывод информации на экран 2 строка
  lcd.setCursor(3,1); 
  if(h1 < 10){
    lcd.print("0");
  }
  lcd.print(h1); // часы
  lcd.print(":");
  if(m1 < 10 ){
    lcd.print("0");
  }
  lcd.print(m1); // минуты
  lcd.print(":");
  if(s1 < 10){
    lcd.print("0");
  }
  lcd.print(s1);// секунды
  lcd.print(":");
  lcd.print(ms1);// мс
}

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

Случайные статьи

  • К1224ПН3х — DC-АC КОНВЕРТЕР

    К1224ПН3х — DC-АC КОНВЕРТЕР

    К1224ПН3х – интегральная микросхема представляет собой преобразователь низкого постоянного напряжения в высокое переменное и применяется для управления плоской люминесцентной лампой. Повышение напряжения осуществляется с помощью внешней индуктивности, на которой вырабатываются высоковольтные импульсы напряжения. ИС содержит: • усилитель входного сигнала; • триггерные делители частоты на 4 и на 32; • логические схемы …Подробнее...
  • УМЗЧ на 50Вт на полевых MOSFET транзисторах

    УМЗЧ на 50Вт на полевых MOSFET транзисторах

    На рисунке показана схема 50 Вт усилителя с выходными полевыми MOSFET транзисторами. Первый каскад усилителя представляет собой дифференциальный усилитель на транзисторах VT1 VT2. Второй каскад усилителя состоит из транзисторов VT3 VT4. Оконечный каскад усилителя состоит из МОП-транзисторов IRF530 и IRF9530. Выход усилителя через катушку L1 соединен с нагрузкой 8 Ом. Цепь состоящий …Подробнее...
  • СВЕТОМУЗЫКАЛЬНЫЙ ЭЛЕКТРОННЫЙ ЗВОНОК

    Его можно установить, например, в квартире вместо обычного электрического звонка. И теперь при нажатии на кнопку у входной двери в квартире будет раздавать­ся звук, имитирующий трели соловья, и светиться не­большой экран-сигнализатор. Электронный звонок (рис. 1) состоит из блока пита­ния с реле времени и акустического генератора — ими­татора. В блоке питания …Подробнее...
  • LED светильник в шкаф

    На рисунке показана схема LED светильника, он устанавливается в шкаф и автоматически включается как только дверца открывается, при закрытии дверцы светильник гаснет, но если Вы забыли закрыть дверцу шкафа, светильник сам выключится спустя 3 минуты. Основа светильника таймер на микросхеме 555. Элементы R1 и C2 задают задержку перед выключением LED …Подробнее...
  • Приемник прямого усиления 2-V-1 на трех транзисторах

    Приемник предназначен для приема СВ ДВ диапазона. Источник питания — 3 элемента по 1,5В, ток потребления не превышает 3 мА. Контур магнитной антенны состоит из L1 L2 C1. при приеме ДВ катушки включены последовательно, а при приеме СВ L1 замыкается. С катушки L3 сигнал снимается и поступает на усилитель РЧ …Подробнее...