5.UNO闹钟

点击此处alarm-clock.ino - Wokwi Arduino and ESP32 Simulator开始在线仿真

该数字闹钟在4位7段显示屏上显示时间。它具有以下特点:

  • 两个按钮用于设置当前时间(小时/分钟)
  • 具有贪睡功能的可编程警报
  • 报警声音可以在代码中轻松自定义,甚至可以播放旋律
  • 冒号闪烁以指示秒数
  • 可选RTC,使时钟更精确
  • 断电恢复:当前时间和报警设置存储在RTC中

如何使用时钟

要设置时间,请按分钟/小时按钮。

按下警报按钮可启用/禁用警报。屏幕将通过显示单词"打开"或"关闭"来显示警报状态。

启用报警后,当前报警时间将显示几秒钟。您可以使用分钟/小时按钮来调整闹钟时间。要完成操作,请再次按"闹钟"按钮,或等待几秒钟。

当闹钟响起时,短按闹钟按钮可将其暂停 9 分钟。屏幕将显示四个圆圈,让您知道闹钟已打盹。

要停止闹钟,请按住闹钟按钮一秒钟或更长时间。

项目结构

该代码分为几个模块:

  1. config.h - 时钟的配置选项:是否使用RTC芯片,贪睡时间等。当程序中有多个模块时,使用配置文件是一种常见的做法。
  2. alarm-clock.ino - 主程序代码。它管理用户界面:7段显示器和按钮。
  3. 时钟 - 类管理当前时间和警报状态机。它使用RTClib库与RTC芯片通信并跟踪时间。Clock
  4. 闹钟铃声 - 班级播放闹钟声音。您可以更改数组的值,并自定义闹钟并播放不同的音调和旋律。AlarmTone``TONES``TONE_TIME``TONE_SPACING

硬件

项目 数量 笔记
Arduino Uno R3 1
4 位 7 段 4 通用阳极,14 引脚
220Ω 电阻器 8 连接到 7 段段引脚
PNP 晶体管 4 可选,推荐
4.7kΩ 电阻器 4 如果您使用PNP晶体管
12 毫米按钮 3
压电蜂鸣器 1 用于报警
DS1307 RTC 1 自选
  • 您还可以使用共阴极7段显示器,只需在config.h中调整常数,然后切换到NPN晶体管。DISPLAY_TYPE

为了将时钟硬件保持在最低限度,Arduino使用SevSeg库直接控制7段显示。但是,这种方法有一个缺点:它使用12个GPIO引脚!

如果要节省Arduino引脚,可以使用74HC595移位寄存器将引脚使用量减少到6个,甚至可以使用带有集成控制器芯片的7段显示器,例如TM1637HT16K33MAX7219。在这种情况下,您需要更改代码以使用不同的显示库(SevSeg 不支持这种情况),但这超出了本项目的范围。

引脚连接

Arduino Uno Pin Device Device Pin
2 7-Segment 14 (Dig 1)
3 7-Segment 11 (Dig 2)
4 7-Segment 10 (Dig 3)
5 7-Segment 6 (Dig 4)
6 7-Segment 13 (A)
7 7-Segment 9 (B)
8 7-Segment 4 ©
9 7-Segment 2 (D)
10 7-Segment 1 (E)
11 7-Segment 12 (F)
12 7-Segment 5 (G)
13 7-Segment 8 (Colon)
A0 Hour Button -
A1 Minute Button -
A2 Alarm Button -
A3 Buzzer / Speaker -
A4 DS1307 RTC SDA
A5 DS1307 RTC SCL
  • The pin numbers for your 7-segment display may differ. Please consult the datasheet relevant to your device to find out the relevant pin numbers.

代码

/**Arduino Digital Alarm ClockCopyright (C) 2020, Uri Shaked.Released under the MIT License.*/#include <SevSeg.h>//数码管函数库
#include "Button.h"
#include "AlarmTone.h"
#include "Clock.h"
#include "config.h"const int COLON_PIN = 13;
const int SPEAKER_PIN = A3;Button hourButton(A0);
Button minuteButton(A1);
Button alarmButton(A2);AlarmTone alarmTone;//闹钟音
Clock clock;//
SevSeg sevseg;//enum DisplayState {//枚举显示时钟,时间等参数DisplayClock,DisplayAlarmStatus,DisplayAlarmTime,DisplayAlarmActive,DisplaySnooze,
};DisplayState displayState = DisplayClock;
long lastStateChange = 0;void changeDisplayState(DisplayState newValue) {displayState = newValue;lastStateChange = millis();
}//改变显示时间long millisSinceStateChange() {return millis() - lastStateChange;
}void setColon(bool value) {digitalWrite(COLON_PIN, value ? LOW : HIGH);
}//设置冒号void displayTime() {DateTime now = clock.now();bool blinkState = now.second() % 2 == 0;sevseg.setNumber(now.hour() * 100 + now.minute());setColon(blinkState);
}void clockState() {displayTime();if (alarmButton.read() == Button::RELEASED && clock.alarmActive()) {//读取alarmButton has_changed()以清除其状态alarmButton.has_changed();changeDisplayState(DisplayAlarmActive);return;}if (hourButton.pressed()) {clock.incrementHour();}//按键按下增加小时if (minuteButton.pressed()) {clock.incrementMinute();}if (alarmButton.pressed()) {clock.toggleAlarm();changeDisplayState(DisplayAlarmStatus);}
}void alarmStatusState() {setColon(false);sevseg.setChars(clock.alarmEnabled() ? " on" : " off");if (millisSinceStateChange() > ALARM_STATUS_DISPLAY_TIME) {changeDisplayState(clock.alarmEnabled() ? DisplayAlarmTime : DisplayClock);return;}
}//闹钟开关void alarmTimeState() {DateTime alarm = clock.alarmTime();sevseg.setNumber(alarm.hour() * 100 + alarm.minute(), -1);if (millisSinceStateChange() > ALARM_HOUR_DISPLAY_TIME || alarmButton.pressed()) {changeDisplayState(DisplayClock);return;}if (hourButton.pressed()) {clock.incrementAlarmHour();lastStateChange = millis();}if (minuteButton.pressed()) {clock.incrementAlarmMinute();lastStateChange = millis();}if (alarmButton.pressed()) {changeDisplayState(DisplayClock);}
}void alarmState() {displayTime();//显示时间if (alarmButton.read() == Button::RELEASED) {alarmTone.play();//启动报警}if (alarmButton.pressed()) {alarmTone.stop();//按键按下报警结束}if (alarmButton.released()) {alarmTone.stop();//按键释放报警结束bool longPress = alarmButton.repeat_count() > 0;if (longPress) {//长按clock.stopAlarm();changeDisplayState(DisplayClock);} else {clock.snooze();//小盹模式changeDisplayState(DisplaySnooze);}}
}void snoozeState() {//小盹模式sevseg.setChars("****");if (millisSinceStateChange() > SNOOZE_DISPLAY_TIME) {changeDisplayState(DisplayClock);return;}
}void setup() {Serial.begin(115200);clock.begin();hourButton.begin();hourButton.set_repeat(500, 200);minuteButton.begin();minuteButton.set_repeat(500, 200);alarmButton.begin();alarmButton.set_repeat(1000, -1);alarmTone.begin(SPEAKER_PIN);pinMode(COLON_PIN, OUTPUT);byte digits = 4;byte digitPins[] = {2, 3, 4, 5};byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12};bool resistorsOnSegments = false;bool updateWithDelays = false;bool leadingZeros = true;bool disableDecPoint = true;sevseg.begin(DISPLAY_TYPE, digits, digitPins, segmentPins, resistorsOnSegments,updateWithDelays, leadingZeros, disableDecPoint);sevseg.setBrightness(90);
}void loop() {sevseg.refreshDisplay();switch (displayState) {case DisplayClock:clockState();break;case DisplayAlarmStatus:alarmStatusState();break;case DisplayAlarmTime:alarmTimeState();break;case DisplayAlarmActive:alarmState();break;case DisplaySnooze:snoozeState();break;}
}

结束

知命者不怨天,知己者不怨人。 – 淮南子 《淮南子》

arduino教程——贪睡数字闹钟相关推荐

  1. 5种方法让你不再睡过闹钟

    1. 不要贪睡 你可能认为额外的(extra)睡眠会让你在最后起床时感觉更好,但实际上(actually)它会让你感觉更糟.根据科学研究,当你贪睡一会儿时,大脑就会重回睡眠状态.如果你再多睡一会儿,你 ...

  2. Arduino教程 Lesson 9 -- 震动探测

    震动传感器,我们从名字中应该就可以判断,传感器能够检测震动中的物体.我们用什么来做震动传感器呢?那就是滚珠开关.滚珠开关,其内部含有导电珠子,器件一旦震动,珠子随之滚动,就能使两端的导针导通. 通过这 ...

  3. 串口监视软件_ESP32 Arduino教程:软件重置

    简介 该esp32 arduino教程旨在解释如何使用Arduino核心在ESP32开发板上执行软件重置. 本ESP32教程的测试是使用集成在ESP32开发板中的DFRobot的ESP-WROOM-3 ...

  4. Swift3.0语言教程字符串转换为数字值

    Swift3.0语言教程字符串转换为数字值 Swift3.0语言教程字符串转换为数字值,在NSString中,开发者可以将字符串转换为数字值,通过这些数字值可以实现一些功能,如加法运算.减法运算等.数 ...

  5. esp32 micropython web服务器_ESP32 Arduino教程:Websocket server(服务器)

    本文主要介绍如何使用Arduino内核作为编程架构在ESP32(上创建Websocket server(服务器).所创建的Websocket server(服务器)将作为回发服务器使用,也就是说它会把 ...

  6. Arduino教程-11. PIR传感器

    topic 11.1 PIR简介 11.1.1 产品参数 11.1.2应用 11.2 PIR详细说明 11.2.1 组成 11.2.2 引脚说明 11.2.3 探头概述 11.2.4 触发模式 11. ...

  7. arduino教程-7.脉冲宽度调制【变频】pwm

    目录 主要内容 7.1 PWM的基本原理 7.2 基本PWM信号 周期 占空比 7.3 调节电压变化 7.4 模式输出(PWM)指令和默认频率 7.4.1 analogWrite()函数 7.4.2 ...

  8. arduino教程-08.超声波的应用

    topic 2.1 认识超声波 2.2 影响声音传播速度的因素 2.3 超声波传感器简介 2.4 实验 任务1:使用超声波传感器制作数字量尺 测量脉冲持续时间的pulseln()函数 2.5 hc-s ...

  9. arduino智能闹钟_一种基于Arduino的多功能智能闹钟的制作方法

    本实用新型涉及智能闹钟技术领域,具体为一种基于Arduino的多功能智能闹钟. 背景技术: 智能睡眠是款带有睡眠循环跟踪的闹钟,可以设置多组闹钟,添加不同的铃声,可以记录睡眠状态,自动改变屏幕亮度,帮 ...

最新文章

  1. CSS3基础03(3D②) 求粉丝
  2. bem什么意思_BEM命名法
  3. 分布式事务slides
  4. JavaScript之ajax
  5. 中台架构与实现:基于ddd和微服务 下载_为什么在做微服务设计的时候需要DDD?...
  6. android多图片拖动,Android实现图片拖动效果
  7. 【Oracle】DBMS_STATS.GATHER_TABLE_STATS
  8. Android Android.mk脚本结构
  9. 俄罗斯方块c语言代码 vc 6.0,VC++6.0俄罗斯方块代码
  10. latex写姓名_LaTeX:拥有(中文)姓名
  11. GIS投影、坐标系、坐标系转换
  12. NVIDIA显卡如何显示fps?
  13. Xubuntu系统要求
  14. C和C++的二进制,八进制,十六进制输出格式(全面版)
  15. 手机如何双声道录音_中老年智能手机教程:手机通话如何录音?
  16. 微信显示android23,微信7.0.23内测版发布 新增6个新功能
  17. 英语作文计算机的利弊,电脑游戏的坏处英语作文
  18. HPatches A benchmark and evaluation of handcrafted and learned local descriptors——2017.04
  19. 计算机排名2018全国,2018全国90所计算机专业大学排名,分为ABC三个等级
  20. IE11不兼容array.from()解决方法

热门文章

  1. 为服务器安装网卡驱动
  2. linux-httpd
  3. 计算机广告设计专业学什么,阳泉平面设计专业主要学什么课?,计算机广告设计...
  4. 微信小程序用户定位(逆地址解析)
  5. 方方-前端体系课程(一)
  6. Linux上文件夹中文件名字读取
  7. java毕设项目 - 基于SSM的停车位短租网站(含源码+论文)
  8. WebAPI 入门了解
  9. JavaScript | 如何解决 Cannot set property of Undefined
  10. 恢复HDFS上误删除的文件