В этом проекте мы сделаем секундомер — он будет отсчитывать время по нажатию на кнопку.

 

Необходимые компоненты:

  • плата для прототипирования;
  • Arduino Nano; 
  • LCD экран;
  • кнопка; 
  • провода; 
  • резистор 10 кОм.

Схема подключения:

 

Рис. П2.1.Схема подключения кнопки и LCD экрана

Рис. П2.2.Монтажная плата подключения кнопки и LCD экрана

Программное обеспечение:


Листинг П2.1


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define button 7 
// Кнопка для Запуска/Остановки (нажатие = 
замыкание на GND)
#define delay_button 200 
/*Задержка в мс после нажатия кнопки, поскольку 
мгновенно 
нажать и отпустить невозможно, есть 
инерционность. На точность секундомера не 
влияет, только на удобство работы с кнопкой */
LiquidCrystal_I2C lcd(0x27,16,2); 
unsigned long memTime = 0, timer = 0, s = 0, ms 
= 0, ss = 0,
minutes = 0, seconds = 0, milisec = 0;
bool start = true, work = false;
void setup(){
Serial.begin(9600);
pinMode(button, INPUT_PULLUP);
digitalWrite(button, HIGH);
Serial.println("***Init LCD...");
lcd.init(); // Инициализация дисплея, 
// проверка правильности 
подключения 
lcd.backlight(); // Включение подсветки 
экрана
Serial.println("***LCD ready!");
lcd.setCursor(0,0);
lcd.print("Push to start");
}
void loop(){
if ( !(digitalRead(button))&&start) //Ждем 
нажатия
{
memTime = millis()-timer; /*Точка отсчета, 
относительно нее начнется счет. Вычитание 
timer дает возможность продолжить счет, если он 
будет остановлен*/
start = false; // Отключаем проверку 
нажатия
work = true; // Запускаем секундомер
Serial.println("Start!");
lcd.setCursor(0,0);
lcd.print("Push to stop ");
33
delay(delay_button); 
}
if(work) //Если кнопка была нажата, то 
начинаем работу.
{
timer = millis() - memTime; //Считаем 
милисекунды
// 
относительно точки отсчета
Serial.println(timer);
ms = timer/10;
s = timer/1000; // Переводим в удобные для 
работы секунды
if ((s%60==0)&&(ss!=s)) // Это условие 
переводит
// каждые 
60 секунд в 1 минуту
{
ss=s; /*Необходимо для того, чтобы 
условие сработало однажды при 60.0 сек., а не 
каждые 60.1 сек., 60.2 сек., и т.д. */
minutes+=1; //Количество минут
}
/*
Вывод на экран. Особенностью вывода является 
то, что при значениях от 0 до 9 время занимает 
одну ячейку на экране, а от 10 до 59 уже две. 
Разумеется, удобнее и привычнее запись в два 
символа, т.е. 00, 01, 02 и т.д.
Приведенное ниже условие работает следующим 
образом:
1) Если число от 0 до 9, то в первую ячейку 
записывается "0", во вторую наша цифра
2) Если число от 10 до 59, то число 
записывается автоматически в обе ячейки, 
начиная
с наименьшей.
*/
if (minutes < 10){
lcd.setCursor(0, 1);
lcd.print("0");
lcd.setCursor(1, 1);}
else {
lcd.setCursor(0, 1);
}
lcd.print(minutes);
lcd.setCursor(2,1);
lcd.print(":");
seconds = s-60*minutes; /*Переменная "s" 
34
хранит суммарное количество секунд, для вывода 
на экран переведем ее в удобный формат: от 
00 сек. до 59 сек. */
if (seconds < 10){
lcd.setCursor(3, 1);
lcd.print("0");
lcd.setCursor(4, 1);}
else {
lcd.setCursor(3, 1);
}
lcd.print(seconds);
lcd.setCursor(5,1);
lcd.print(":");
milisec = ms-100*(seconds+60*minutes); // 
Аналогично с seconds,
// 
переводим в 00..99
if (milisec < 10){
lcd.setCursor(6, 1);
lcd.print("0");
lcd.setCursor(7, 1);}
else {
lcd.setCursor(6, 1);
}
lcd.print(milisec);
}
if(!(digitalRead(button))&&work) //
Приостановка секундомера
{
work = false; // Остановка счета
start = true; // Включаем снова ожидание
// нажатия кнопки для 
включения
Serial.println("Stop!");
lcd.setCursor(0,0);
lcd.print("Push to continue");
delay(delay_button); 
}
}




Порядок подключения:

  • Выводы экрана GND, VCC, SDA, SCLподключаем к выводам GND, 5V, А4, А5 Arduino соответственно.
  • Один вход кнопки подключаем к выводу 5V, другой — через подтягивающий резистор 10 кОм к выводу GND, выход кнопки подключаем к D7.
  • Загрузите скетч, представленный в листинге П2.1.