| Ваш IP: 34.236.145.124 | Online(31) - гости: 21, боты: 10 | Загрузка сервера: 1.97 ::::::::::::

Секундомер на 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);// мс
}

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

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

  • Мини усилитель 2Вт+2Вт на TBA820M

    Мини усилитель 2Вт+2Вт на TBA820M

    На рисунке показана схема простого стерео усилителя выходной мощность 2Вт на каждый канал. Нагрузкой усилителя служит динамик 8Ом. Данный тип усилителей применяется в малогабаритной звуковоспроизводящей аппаратуре, главное достоинство данного усилителя это низкий ток потребления, минимальное кол-во внешних элементов, простота сборки, отсутствие радиаторов охлаждения микросхемы. В данной схеме напряжение питания усилителя …Подробнее...
  • Генераторы импульсов на микросхемах К176ИЕ5, К176ИЕ12, К176ИЕ18

    На рис. приведена принципиальная схема генератора секундных импульсов на микросхеме К176ИЕ5. Здесь и в других схемах на этом рисунке численные данные приведены для варианта применения стандартного кварцевого резонатора на частоту 32 768 Гц. Микросхемы допускают также использование кварцевого резонатора на частоту 16 384 Гц. Тогда секундные импульсы выделяются на выходе …Подробнее...
  • Контроль уровня воды в аквариуме

    Схема контроля уровня воды в аквариуме представлена на рис.1. Как только поверхность специального зонда покрывается водой, импульсы генератора НЧ, реализованного на первом операционном усилителе D1.1, поступают на компаратор (D1.2), усиливаются и преобразуются в электрический сигнал, управляющий ключевым каскадом на реле К1. В качестве датчика зонда В1 используется отрезок одно или …Подробнее...
  • Двухтональный звонок

    Двухтональный звонок

    Двухтональный звонок содержит управляющий генератор на элементах D1.1 — D1.3 микросхемы К155ЛА, который вырабатывает управляющие импульсы, частота которых зависит от емкости С1 и сопротивления R1. При указанных на схеме элементах частота переключения генератора примерно 0,7…0,8 Гц. Импульсы управляющего генератора подаются на генератор тона и поочередно подключают их к усилителю звуковой …Подробнее...
  • Двухканальный усилитель НЧ для портативной аппаратуры на LA4558

    Двухканальный усилитель НЧ для портативной аппаратуры на LA4558

    На рисунке показана схема простого стерео-усилителя на микросхеме LA4558. Микросхема LA4558 предназначена для портативных аудио устройств. Выходная мощность усилителя 2,4Вт на каждый канал. Сопротивление нагрузки от 3 до 8 Ом. Напряжение питания от 4,5В до 12В. Отношение сигнал/шум -60дБ. При использовании микросхемы на полную мощность 2,4Вт рекомендуется к теплоотводным лепесткам микросхемы сделать …Подробнее...