| Ваш IP: 18.212.93.234 | Online(13) - гости: 7, боты: 6 | Загрузка сервера: 2.54 ::::::::::::

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

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

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

  • Магнитопроводы и сердечники электромагнитных компонентов

    Марка ферромагнитного материала, вид и тип магнитопровода выбирается в зависимости от назначения компонента, рабочей частоты, требованиям к электромагнитным помехам и так далее. В соответствии с ГОСТом 20249-80 магнитопроводы трансформаторов и дросселей работающих на частоте 50Гц выполняются из электротехнической стали марок 1511, 1521, 3411, 3412 толщиной 0,2…0,5 мм. Применение магнитопроводов из …Подробнее...
  • Стерео УМЗЧ на 10Вт с регулировками громкости, баланса и тембра

    Стерео УМЗЧ на 10Вт с регулировками громкости, баланса и тембра

    Краткие технические характеристики: Диапазон частот 40…20000Гц Напряжение питания – 8…18В(14,4В номинальное) Ток покоя не более – 65mA Выходная мощность – 2 x 10Вт Коэффициент нелинейных искажений не более – 1% Входное сопротивление – 200kПодробнее...
  • Регулятор яркости- выключатель лампы накаливания

    Регуляторы основаны на КР1182ПМ1. На рис.1 показана типовая схема включения. На рис.2 показана схема регулятора которая позволяет помимо выключения лампы обесточивать все устройство. Литература Радиоконструктор 5-2008Подробнее...
  • Зарядное устройство мобильного телефона LG (принципиальная схема и ремонт)

    Зарядное устройство (ЗУ) типа BML 162089 R1A южно азиатского производства предназначено для зарядки аккумуляторов мобильных телефонов LG и имеет следующие характеристики: Uвход ~100…250 B, Iвход~160 мA, Uвых=8,5 В, Iвых=750 мA. Его внешний вид показан на рис.1. Все радиоэлементы смонтированы на стекло пластиковом шасси НТ608 размерами 64×33 мм методом навесного монтажа …Подробнее...
  • Ламповый телефонный усилитель

    Ламповый телефонный усилитель

    На рисунке показана схема лампового телефонного (для наушников) усилителя. Все каскады усилителя работают в режиме А. Выходной каскад — катодный повторитель с активной нагрузкой и выполнен на двойном триоде 6Н6П. Для уменьшения выходного сопротивления до 32 Ом выходной каскад охвачен ПОС через С4. Глубина ПОС и величина выходного сопротивления зависят …Подробнее...