Секундомер выполнен на основе 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);// мс }
А можете описать что куда соединяется?
Соберите схему как показано на рисунке.
Добрый день.
Подскажите пожалуйста, начинающему, что нужно поменять в скетче, если дисплей подключен по
i2c.
Заранее большое спасибо.
http://forum.rcl-radio.ru/viewtopic.php?id=63
Большое спасибо, всё получилось.