风筝
发表于: 2018-4-18 17:21:32 | 显示全部楼层

Arduino-based-Countdown-Timer.jpg


计时器是一种时钟形式,通常用于测量时间间隔。有两种类型的计时器,一种是从零开始向上计数,用于测量已用时间,称为秒表。而第二种类型的计时器从用户提供的指定持续时间倒计时,通常称为倒计时器。


在本教程中,我们将向您展示如何使用Arduino开发板制作一个倒计时器。在本文中,我们没有使用任何实时时钟(RTC)模块来获取时间。持续时间由用户通过键盘和1602的LCD设定的。当计时器归零时,将会通过蜂鸣器发出警报声。


所需的材料

●    Arduino UNO开发板

●    LCD显示模块1602

●    4 * 4的矩阵键盘

●    蜂鸣器

●    按钮

●    电位器(10k)

●    电阻(10k、100欧)

●    连接导线


电路原理图

Arduino-based-Countdown-Timer-circuit-diagram.png

在这里,Arduino Uno开发板用作主控制器。使用键盘来设定持续时间,以及LCD显示模块1602来显示倒计时。按钮用于启动定时。有关如何将Arduino开发板与4x4矩阵键盘进行连接,请参考:https://www.yiboard.com/thread-780-1-1.html


代码和说明

在本文的末尾处,给出了完整的Arduino计时器代码。


在下面的代码中,我们正在初始化键盘和LCD的库以及代码中使用的变量。

  1. #include <LiquidCrystal.h>
  2. #include <Keypad.h>

  3. long int set1;
  4. long int set2;
  5. long int set3;
  6. long int set4;
  7. long int j;
  8. int t1, t2, t3, t4, t5, t6;
  9. int r1, r2, r3;
  10. char key;
  11. String r[8];
  12. String hours;
  13. String minutes;
  14. String seconds;
复制代码

在下面的代码中,我们初始化行和列的数目,用于定义键盘矩阵。

  1. const byte ROWS = 4; // Four rows
  2. const byte COLS = 4; // Three columns

  3. char keys[ROWS][COLS] = {
  4.   {'1','2','3','A'},
  5.   {'4','5','6','B'},
  6.   {'7','8','9','C'},
  7.   {'*','0','#','D'}
  8. };
复制代码

为了将连接4 * 4矩阵键盘与Arduino开发板进行连接,我们必须定义使用的行和列的引脚。所以在下面的代码中我们已经定义了键盘的引脚以及1602模块的引脚。

  1. byte rowPins[ROWS] = { 6, 7, 8, 9 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins
  2. byte colPins[COLS] = { 10, 11, 12, 13 };// Connect keypad COL0, COL1 and COL2 to t

  3. LiquidCrystal lcd(A0, A1, 5, 4, 3, 2); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
复制代码

下面的代码用于声明一个keypad数组:

  1. Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
复制代码

void setFeedingTime()函数中,按下按钮后,我们可以输入定时器的时间,然后在输入完成后,我们必须按下D开始倒计时。

  1. void setFeedingTime()
  2. {
  3.   feed = true;
  4.    int i=0;

  5.   lcd.clear();
  6.   lcd.setCursor(0,0);
  7.   lcd.print("Set feeding Time");
  8.   lcd.clear();
  9.   lcd.print("HH:MM:SS");
  10.   lcd.setCursor(0,1);

  11.   while(1){
  12.     key = kpd.getKey();
  13.     char j;

  14.   if(key!=NO_KEY){
  15.     lcd.setCursor(j,1);
  16.     lcd.print(key);   
  17.     r[i] = key-48;
  18.     i++;
  19.     j++;

  20.     if (j==2 || j == 5)
  21.     {
  22.       lcd.print(":"); j++;
  23.     }
  24.     delay(500);
  25.   }

  26.   if (key == 'D')
  27.   {key=0; break; }
  28.   }
  29. lcd.clear();
  30. }
复制代码

void setup()函数中,我们初始化了LCD和串行通信,并在下面的代码中将引脚定义为INPUTOUTPUT

  1. void setup()
  2. {
  3.   lcd.begin(16,2);
  4.   Serial.begin(9600);
  5.   pinMode(A0, OUTPUT);
  6.   pinMode(A1, OUTPUT);
  7.   pinMode(A3, INPUT);
  8.   pinMode(A4, OUTPUT);
  9. }
复制代码

这个Arduino倒计时器的工作原理很简单,但代码有点复杂。


最初,它会在LCD显示屏上打印输出“Arduino Timer”,直到您按下按钮。只要按下按钮,它会通过调用“setFeedingTime”函数来要求输入倒计时时间。然后你可以通过使用键盘输入持续时间。然后你需要按'D'来保存时间并开始倒计时。在void loop()函数中,我们已经做了一些计算以逐秒递减时间,并根据剩余时间显示Hour、Minutes和Seconds(HH:MM:SS)相应的值。您可以在下面查看完整的代码。

Arduino-based-Countdown-Timer-in-action.jpg


当计时器归零时,蜂鸣器开始发出蜂鸣声并且只发出100次蜂鸣声。要停止蜂鸣器,请按住按钮。您可以随时使用按钮在计数时停止定时器。

Arduino-based-Countdown-Timer-ringing.jpg


代码

本文中的完整代码如下: main.rar (1.55 KB, 下载次数: 715)


跳转到指定楼层
18805387716
发表于: 2019-1-21 14:09:07 | 显示全部楼层

程序写进去以后为什么有的时候能输入,有的时候不能输入哇
回复

使用道具 举报

风筝
发表于: 2019-1-21 14:18:12 | 显示全部楼层

18805387716 发表于 2019-1-21 14:09
程序写进去以后为什么有的时候能输入,有的时候不能输入哇

按键时间长一些 或者把代码    delay(500); 修改一下,减少延迟时间
回复

使用道具 举报

18805387716
发表于: 2019-1-22 08:53:23 | 显示全部楼层

风筝 发表于 2019-1-21 14:18
按键时间长一些 或者把代码    delay(500); 修改一下,减少延迟时间

能不能帮忙看一下这是什么情况,按照帖子下面的程序写进去,成功过1次,第二次输入时间就不能输入了;后来再写入,就没有冒号了,再往后输入位置就变了。
11.jpg
回复

使用道具 举报

poko
发表于: 2019-5-8 17:10:06 | 显示全部楼层

你好啊,请问一下这个程序里面的 Keypad 的头文件(库文件)是怎样建(添加)的啊
回复

使用道具 举报

Rachel
发表于: 2020-5-23 18:36:37 | 显示全部楼层

你好,请问一下显示屏一直显示这个,按了按钮和矩阵键盘都没有响应是什么情况?
微信图片_20200523183456.jpg
回复

使用道具 举报

周文立
发表于: 2022-7-21 15:04:33 | 显示全部楼层

18805387716 发表于 2019-1-22 08:53
能不能帮忙看一下这是什么情况,按照帖子下面的程序写进去,成功过1次,第二次输入时间就不能输入了;后 ...

怎么修改的啊,老哥
回复

使用道具 举报

周文立
发表于: 2022-7-21 15:08:19 | 显示全部楼层

为什么只能输入星号和井号啊
回复

使用道具 举报

周文立
发表于: 2022-7-21 16:17:36 | 显示全部楼层

为什么不能开始倒计时啊
回复

使用道具 举报

风筝
发表于: 2022-7-21 20:14:57 | 显示全部楼层

周文立 发表于 2022-7-21 15:08
为什么只能输入星号和井号啊

这个是矩阵键盘的型号有关的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 01:00 , Processed in 0.044056 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表