В этом проекте мы сделаем секундомер — он будет отсчитывать время по нажатию на кнопку.
Необходимые компоненты:
- плата для прототипирования;
- 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.