| Ваш IP: 54.80.247.119 | Online(26) - гости: 12, боты: 14 | Загрузка сервера: 3.9 ::::::::::::

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

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

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

  • Индикаторы потребляемой мощности

    Основой индикаторов потребляемой мощности является трансформатор тока, на один из сетевых проводов надевают кольцевой магнитопровод с обмоткой который и образует трансформатор тока. В трансформаторе тока сетевой провод является первичной обмоткой, а обмотка на магнитопроводе вторичной. При подключении нагрузки через сетевой провод протекает ток и на вторичной обмотке появляется переменное напряжение. …Подробнее...
  • УМЗЧ на 50Вт на полевых MOSFET транзисторах

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

    На рисунке показана схема 50 Вт усилителя с выходными полевыми MOSFET транзисторами. Первый каскад усилителя представляет собой дифференциальный усилитель на транзисторах VT1 VT2. Второй каскад усилителя состоит из транзисторов VT3 VT4. Оконечный каскад усилителя состоит из МОП-транзисторов IRF530 и IRF9530. Выход усилителя через катушку L1 соединен с нагрузкой 8 Ом. Цепь состоящий …Подробнее...
  • Импульсные регуляторы напряжения MC34063A, MC33063A, NCV33063A

    Импульсные регуляторы напряжения MC34063A, MC33063A, NCV33063A

    Импульсные регуляторы напряжения MC34063A, MC33063A, NCV33063A — специально разработанные микросхемы для DC-DC преобразователей с минимальным количеством внешних элементов. Технические параметры Диапазон входных напряжений 3…40 В Диапазон выходных напряжений 1.25…40 В Максимальный выходной ток 1.5 А Рабочая частота 33 кГц На рисунках показаны типовые схемы подключения регуляторов напряжения, повышающий, понижающий и инверсный. Основные элементы …Подробнее...
  • Акустическое реле

    Акустическое реле

    Акустическое реле может работать от любого стабилизированного источника питания 5…12В. Акустическое реле срабатывает от любого громкого звука (хлопка), содержит минимальное кол-во элементов, коммутирует нагрузку в зависимости от типа выбранного реле. R1 определяет чувствительность акустического реле. В качестве датчика выбран электретный микрофон. Оригинал статьи и схемы — http://www.electroschematics.com/704/sound-activated-switch/Подробнее...
  • К140УД2А, К140УД2Б (справочные данные)

    К140УД2А, К140УД2Б (справочные данные)

    К140УД2А, К140УД2Б относят к ОУ средней точности. Электрические параметры: Uпит. ном — 2*12,6В (А), 2*6,3 (Б) I пот — 16мА (А), 10мА(Б) Ku — 35*10³(А), 3*10³(Б) Uсм — 5мВ Iвх — 700нА ΔIвх — 150нА Кос.сф — 60дБ f1 — 1МГц Vu — 0,2В/мкс Uвых.мах — 10В(А), 3В(Б) Rвх — …Подробнее...