八色木

制作Arduino控制的计时器

制作一个由Arduino控制的定时器,并学习Arduino和LCD1602液晶显示器以及键盘模块的连接。

在这篇文章中,我们将学习如何创建一个由用户控制的定时器。这个项目将帮助你管理时间,实现及时提醒。你可以方便地设定一个时间限制,然后离开,直到你听到定时器发出“哔哔”声后及时安排下一项工作。在这个项目中我们将使用一个Arduino液晶键盘模块,你将从连接小蜂鸣器开始,直到让设备启动起来,并通过按钮接口和LCD接口实现输入和输出功能。

定时器主要功能概述

  1. 在启动电源之后,定时器将显示一个“Arduino-Timer”的信息,并持续3秒。
  2. 计时器将提示设置时间。你可以通过按下左右键来将光标移动到要修改的位置,如分钟和小时。
  3. 通过上下箭头键调整分钟和小时的设置。
  4. 一旦设置了所需的时间,按下“SELECT”按钮,计时器就会启动。
  5. 如果想重新设置时间,请再次按下“SELECT”按钮。
  6. 到达设定的时间后,蜂鸣器就会发出哔哔声。
  7. 需要关闭蜂鸣器声音,在听到哔哔声后按下键盘上的“RST”键。

定时器所需的组件

定时器的线路图


首先,将液晶键盘模块直接插到在Arduino上。然后将蜂鸣器的正极连接到Arduino上的12号引脚上,并将蜂鸣的负极连接到GND上。

制作Arduino定时器的代码

#include <LiquidCrystal.h>
// 设置用于 LCD 的针脚
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// 定义变量
int lcd_key = 0;
int adc_key_in = 0;
int hrs = 0;
int mins = 0;
int set_mins = 0;
int set_hrs = 1;
int secs = 60;
int cursor_pos = 1;
int buzzer_pin = 12;

bool startTimer = false;
bool setTimer = true;
bool get_time = false;

unsigned long interval=1000; // 等待时间
unsigned long previousMillis=0; // millis() 返回无符号数长度.
//定义液晶键盘所使用的按钮
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

// 读buttons值
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // 从液晶键盘上读取按钮的值
// 检查按下的是哪个按钮
if (adc_key_in > 1000) return btnNONE; // 把它作为速度的第一个选项因为它是最有可能的结果
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 650) return btnLEFT;
if (adc_key_in < 850) return btnSELECT;

return btnNONE; // 当所有读取都失败时,返回btnNONE
}

void setup()
{
Serial.begin(115200);
pinMode(buzzer_pin, OUTPUT);

lcd.begin(16, 2); // 启动与LCD键盘的通信
lcd.setCursor(0,0);
lcd.print("Arduino-");
lcd.setCursor(0, 1);
lcd.print(" Timer");
delay(3000);
}

void loop(){
// 根据按下的按钮检查哪个条件是正确的
if(startTimer == true){
start_timer();
}
else if (setTimer == true){
set_timer();
}
}

// 这个函数将计算时间
void start_timer(){
// 检查时间是否正常
if(hrs == 0 && mins == 0 && secs == 0){
lcd.setCursor(0, 0);
lcd.print(" Time is UP");
lcd.setCursor(0, 1);
lcd.print(" Beep Beep");
digitalWrite(buzzer_pin, HIGH);
delay(500);
digitalWrite(buzzer_pin, LOW);
delay(500);
}

else if(secs < 0){
secs = 59;
mins = mins - 1;
}

else if(mins < 0){
mins = 59;
hrs = hrs - 1;
}

else
{
get_time = true;
counter();

lcd.setCursor(0, 0);
lcd.print("Timer is ON");

lcd.setCursor(0, 1);
lcd.print(hrs);
lcd.print(":");

lcd.setCursor(4, 1);
lcd.print(mins);
lcd.print(":");

lcd.setCursor(8, 1);
lcd.print(secs);
}

lcd_key = read_LCD_buttons(); // 读取按钮值

switch (lcd_key) // 根据哪个按钮被按下来执行一个操作
{
// 如果按下select按钮,则返回设置时间
case btnSELECT:
{
startTimer = false;
setTimer = true;
delay(300);
lcd.clear();
break;
}
case btnNONE:
{
break;
}
}
}

// 这个函数将设置时间
void set_timer(){
counter();
lcd.setCursor(0, 0);
lcd.print("Set Time");

lcd.setCursor(0, 1);
lcd.print("Hrs:");
lcd.print(hrs);

lcd.setCursor(8, 1);
lcd.print("Mins:");
lcd.print(mins);

lcd.setCursor(0,1);
lcd_key = read_LCD_buttons(); // 读取按钮值

switch (lcd_key) // 根据哪个按钮被按下来执行一个操作
{
// 如果按下RIGHT按钮,移动光标到分钟位置
case btnRIGHT:
{
cursor_pos = set_mins;
break;
}
// 如果按下left按钮,移动光标到小时位置
case btnLEFT:
{
cursor_pos = set_hrs;
break;
}
// 如果up被按下, 分钟或小时加1
case btnUP:
{
delay(300);
if(cursor_pos == set_mins){
mins++;
if(mins > 59){
mins = 0;
}
}
else if(cursor_pos == set_hrs){
hrs++;
if(hrs > 24){
hrs = 0;
}
}
break;
}
// 如果Down被按下, 分钟或小时减1
case btnDOWN:
{
delay(300);
if(cursor_pos == set_mins){
mins--;
if(mins < 0){
mins = 60;
}
}
else if(cursor_pos == set_hrs){
hrs--;
if(hrs < 0){
hrs = 24;
}
}
break;
}
// 如果按下SELECT按钮,启动定时器
case btnSELECT:
{
startTimer = true;
setTimer = false;
mins = mins - 1;
delay(300);
break;
}
case btnNONE:
{
break;
}
}
}

void counter() {
unsigned long currentMillis = millis(); // 获取当前时间

// 检查“interval”时间是否已超过(1000毫秒)
if ((unsigned long)(currentMillis - previousMillis) >= interval) {

lcd.clear();
if(get_time == true){
secs--;
get_time = false;
}
previousMillis = millis();
}
}

至此一款基于Arduino的定时器就制作完成了,余下的工作你可以根据喜好对它进行美化或者开发更有趣的应用。

Exit mobile version