基于Micro:bit与REKA:BIT扩展板的数字闹钟DIY项目全解析
1. 项目概述与核心价值
如果你手头有一块Micro:bit,并且对如何让它从一块简单的开发板变成一个真正能用的、带交互功能的电子设备感到好奇,那么这个基于REKA:BIT扩展板的数字闹钟项目,会是一个绝佳的起点。这个项目完美地展示了如何将微控制器的“大脑”能力,通过外围硬件扩展,变成一个看得见、摸得着、能解决实际生活小问题的智能设备。整个过程,从拧螺丝、接线到图形化编程,几乎涵盖了创客入门所需的所有核心技能。
REKA:BIT扩展板为Micro:bit提供了标准化的Grove接口和电源管理,极大地简化了硬件连接。而那个小小的1602 LCD屏幕和两个电位器,则构成了一个经典的人机交互系统:一个负责显示信息,两个负责输入调节。最终,你将得到一个可以手动设置时间、设定闹钟的独立设备,它不再需要连接电脑运行,装上电池就能工作。这不仅仅是完成了一个小制作,更是理解了嵌入式系统如何感知(电位器)、处理(Micro:bit程序)、输出(LCD显示)的完整闭环。对于电子爱好者、编程初学者或者STEM教育者来说,这个项目的实践价值在于,它用最低的成本和最直观的方式,揭开了智能硬件开发的神秘面纱。
2. 核心硬件解析与选型思路
2.1 主控与扩展板:REKA:BIT + Micro:bit 组合的优势
这个项目的核心是 REKA:BIT扩展板 与 Micro:bit v2 的搭配。为什么选择这个组合,而不是直接用Micro:bit连接其他元件?这里有几个关键的考量。
首先,电源管理的便利性。Micro:bit本身可以通过USB供电或外接电池,但当你需要驱动像LCD屏幕这样的外部设备时,稳定的电源至关重要。REKA:BIT板载了高效的3.3V稳压电路,并且提供了一个专用的电池接口(如JST PH连接器),能够轻松管理来自电池盒或锂聚合物电池的电力,为整个系统提供干净、稳定的电源。这避免了因电源波动导致LCD显示乱码或Micro:bit重启的问题。
其次,接口的标准化与防错。REKA:BIT将Micro:bit有限的GPIO引脚,转换成了多个标准的Grove接口。Grove接口采用统一的4针连接器(VCC, GND, 信号1, 信号2),并且自带防反插设计。这意味着连接LCD或电位器时,你不需要再去辨认复杂的杜邦线序,只需“咔哒”一声插上即可,极大降低了硬件连接的难度和出错率,特别适合新手。
最后,功能集成与扩展性。除了基础的IO口,REKA:BIT通常还集成了蜂鸣器、电机驱动接口、额外的按钮等。在这个闹钟项目中,我们虽然主要用到Grove接口,但这种集成性为未来升级(比如增加闹钟响铃的蜂鸣器)预留了空间。因此,选择REKA:BIT不仅仅是图方便,更是为项目的可靠性和后续扩展性打下了基础。
2.2 人机交互组件:LCD与电位器的角色
人机交互是这个项目的灵魂,主要由一个 I2C接口的1602 LCD 和两个 10K电位器 实现。
1602 LCD显示屏: “1602”指的是每行16个字符,共2行。我们选择的是 I2C通信版本,这是关键。普通的1602 LCD需要连接多达6-7根线(数据线、控制线),会大量占用Micro:bit的IO口。而I2C版本通过一个额外的转接板,将并行通信转换为I2C串行通信,只需要连接4根线(VCC, GND, SDA, SCL),并且可以共享Micro:bit上的I2C总线。在REKA:BIT上,它被映射到了特定的Grove端口(如P19/P20),在MakeCode中通过专门的扩展积木就能轻松驱动,节省了宝贵的硬件资源和编程复杂度。
10K电位器(可调电阻): 在这里,电位器充当了模拟输入设备。旋转电位器的旋钮,其中心抽头的输出电压会在0V到3.3V之间连续变化。Micro:bit的模拟输入引脚(通过REKA:BIT引出)可以读取这个电压值,并将其转换为0-1023范围内的数字量。在程序中,我们将这个数字量映射为时间值(时、分)。选择10K欧姆是常见值,其阻值大小适中,在提供足够调节精度的同时,不会从Micro:bit的模拟输入引脚汲取过多电流,保证了读数的稳定性。
注意: 务必确认LCD是3.3V工作电压的版本。虽然5V的LCD也可能工作,但长期使用可能存在风险,最稳妥的是使用与Micro:bit逻辑电平匹配的3.3V器件。
2.3 其他辅助材料的选择
- 电池盒: 建议使用3节AA(5号)电池盒,提供约4.5V电压。REKA:BIT的稳压电路会将其降至3.3V。这比直接用3V的纽扣电池驱动能力强,能保证LCD背光稳定亮起。也可使用一块3.7V的锂聚合物电池,更为紧凑。
- 连接线: Grove to Female(母头)杜邦线 是必需品。它一端是Grove接口连接REKA:BIT,另一端是裸露的杜邦线母头,用于连接电位器这类非Grove标准的元件。
- 外壳与扎带: 一个合适尺寸的塑料盒或亚克力盒子能让项目更规整。尼龙扎带是固定电路板和LCD的廉价且有效的方式,比胶水更灵活且无损。
3. 硬件组装与连接详解
3.1 外壳加工与元件定位
找一个大小适中的塑料项目盒。规划布局是关键一步,这决定了成品的易用性和美观度。
- LCD开孔: 将LCD屏幕的显示部分紧贴盒子内侧,用笔描出它的外轮廓。然后使用小电钻或手工钻头在轮廓内部打一圈密集的小孔,再用锉刀或美工刀小心地将孔连通、修整平滑,直到LCD能严丝合缝地卡进去。边缘务必处理光滑,避免划伤屏幕或自己。
- 电位器开孔: 两个电位器并排安装在LCD上方或下方。根据电位器旋钮的直径开圆孔。开孔后,从盒子内部放入电位器,用配套的螺母从外部拧紧固定,这样电位器就被牢牢锁在面板上了。
- REKA:BIT固定: 在盒子内部规划一个位置放置REKA:BIT主板,确保其USB口和电池接口靠近盒子侧壁,方便后续插拔。在主板四周的安装孔位置,用扎带穿过盒子底板预钻的小孔,将主板牢牢捆绑固定。避免主板悬空或晃动。
- 走线考虑: 所有连接线应尽量沿盒子内壁走,并用少量扎带或胶带固定,避免杂乱无章,也防止线材被电位器轴或主板元件刮伤。
3.2 电路连接原理与实操
接线是项目的物理基础,理解原理能避免错误。请参照下图所示的逻辑关系进行连接:
连接原理图:
(注:Grove接口的VCC和GND引脚已统一为外围元件供电)
具体接线步骤:
-
电位器连接:
- 取两根Grove to Female线。每根线的Grove端分别插入REKA:BIT的 Port 1 和 Port 3。
- 每根线的另一端有三个杜邦线母头(黑、红、黄、白,颜色可能不同,以丝印为准)。我们需要用到其中的 信号线(通常是黄色或白色) 和 GND线(黑色)。
- 对于一个电位器,其三个引脚通常为:左右两脚是电阻的两端,中间脚是滑动抽头。
- 接法: 将信号线母头连接到电位器的中间脚。将GND线母头连接到电位器的任意一侧脚。电位器剩下的那个脚悬空不接。这样,电位器就构成了一个分压电路,中间脚输出可变的电压到Micro:bit的模拟输入引脚。
- 两个电位器接法完全相同。
-
LCD连接:
- 取一根Grove to Female线,其Grove端插入REKA:BIT的 Port 6(这是一个标定为I2C功能的端口,对应P19/SDA和P20/SCL)。
- 这根线的另一端有4个杜邦线母头。找到LCD背面的I2C转接板,上面通常有4个引脚:VCC, GND, SDA, SCL。
- 对应连接: Grove线的 VCC (红) -> LCD的 VCC; GND (黑) -> GND; SDA (蓝或黄) -> SDA; SCL (绿或白) -> SCL。插紧即可。
-
电源连接:
- 将电池盒的红线(正极)连接到REKA:BIT上标有“BAT+”或电池符号正极的端子,黑线(负极)连接到“GND”端子。
- 检查所有连接是否牢固,避免虚接。
实操心得: 在接通电源前,花一分钟做一次“视觉检查”。确保没有金属线头相互触碰(特别是VCC和GND),确保电位器没有接错导致短路。养成“先接线,后上电”的习惯,能保护你的硬件。
4. MakeCode图形化编程逻辑剖析
硬件是身体,软件是灵魂。我们将使用MakeCode for micro:bit进行图形化编程,其核心是处理输入(电位器、按钮)、维护状态(当前时间、闹钟时间)、控制输出(LCD显示)。
4.1 项目初始化与变量定义
程序一开始,我们需要建立整个系统运行所需的所有“记忆单元”(变量)。
- 添加扩展: 在MakeCode的新建项目中,点击“扩展”,搜索并添加
reka-bit或grove扩展(取决于扩展库名称),以确保可以使用REKA:BIT的专用积木块。同时,也需要添加LCD1602或I2C LCD扩展来驱动屏幕。 - 定义核心变量:
当前小时、当前分钟、当前秒: 用于存储和更新实时时间。闹钟小时、闹钟分钟: 用于存储用户设定的闹钟时间。闹钟启用: 一个布尔值(真/假),用于标记闹钟是否开启。设置模式: 另一个变量,用于区分当前是“正常显示模式”、“设置时间模式”还是“设置闹钟模式”。我们可以用数字表示,例如:0=正常,1=设时间,2=设闹钟。
- 初始化操作:
- 在
当开机时积木块中,初始化LCD屏幕(设置I2C地址,通常为0x27或0x3F,需根据你的LCD模块确定)。 - 将
当前小时、当前分钟、当前秒设置为一个初始值(例如12:00:00)。 - 将
闹钟小时、闹钟分钟设置为默认值(如07:00)。 - 将
闹钟启用设为假,设置模式设为0(正常模式)。 - 在LCD上显示初始时间,例如“12:00”。
- 在
4.2 主循环与时间流逝模拟
Micro:bit没有实时时钟(RTC)芯片,所以我们需要用软件模拟时间的流逝。
- 利用“无限循环”和“暂停”: 在
无限循环积木块中,我们让程序每1000毫秒(1秒)执行一次。 - 秒数递增逻辑:
- 每次循环,先将
当前秒增加1。 - 判断:如果
当前秒等于60,则将当前秒归零,同时当前分钟增加1。 - 继续判断:如果
当前分钟等于60,则将当前分钟归零,同时当前小时增加1。 - 最后判断:如果
当前小时等于24,则将当前小时归零。 - 这样就完成了一个完整的“秒->分->时”的进位模拟。
- 每次循环,先将
- 时间显示更新: 在每次更新完时间变量后,都需要调用LCD显示函数,将
当前小时和当前分钟以“HH:MM”的格式显示在屏幕上。为了美观,记得在小时或分钟小于10时,在前面补一个“0”。
4.3 交互逻辑:按钮与电位器编程
这是项目的交互核心,决定了用户如何设置时间。
- 按钮模式切换:
当按钮A被按下时: 将设置模式变量从0(正常)改为1(设置时间)。此时,LCD可以显示“Set Time”或闪烁光标提示。当按钮B被按下时: 将设置模式从0改为2(设置闹钟)。LCD显示“Set Alarm”。- 再次按下对应按钮,应将模式切回0。这可以通过判断当前模式来实现。
- 电位器数值读取与映射:
- 在
无限循环中,我们需要持续读取两个电位器的值。 - 使用
读取模拟引脚 P0 的值和读取模拟引脚 P4 的值积木。读到的值是0-1023。 - 关键映射算法: 我们需要将这个0-1023的值映射到0-23(小时)或0-59(分钟)。公式为:
目标值 = 取整((读取的模拟值 / 1023) * 最大值)。 例如,映射到小时:映射小时 = 取整((P0值 / 1023) * 24)。 映射到分钟:映射分钟 = 取整((P4值 / 1023) * 60)。
- 在
- 模式判断与赋值:
- 在循环内,加入判断
设置模式的积木。 - 如果
设置模式 == 1(设置时间),则将上面计算出的映射小时赋值给当前小时,映射分钟赋值给当前分钟。同时,可以将当前秒归零,让设置更精确。 - 如果
设置模式 == 2(设置闹钟),则将映射小时赋值给闹钟小时,映射分钟赋值给闹钟分钟。同时,可以将闹钟启用设为真。 - 在设置模式下,LCD可以实时显示正在调整的值,提供视觉反馈。
- 在循环内,加入判断
4.4 闹钟触发判断与提示
- 触发判断: 在
无限循环中,每次更新时间后,加入一个判断:如果闹钟启用为真,并且当前小时等于闹钟小时,并且当前分钟等于闹钟分钟,并且当前秒在某个范围内(例如0-10秒),则判定闹钟触发。 - 触发动作:
- 视觉提示: 让LCD屏幕闪烁(交替显示时间和全亮/全暗),或者显示“ALARM!!!”。
- 声音提示(如果REKA:BIT带蜂鸣器): 使用
播放旋律或引脚模拟输出积木来驱动蜂鸣器发出“滴滴”声。可以播放一小段简单的旋律。 - 关闭闹钟: 通常设计为按下任意按钮(A或B)来关闭闹钟提示,并将
闹钟启用设为假。
5. 代码实现与分步详解
下面我们将把上述逻辑转化为具体的MakeCode积木块。请注意,积木的具体名称可能因扩展版本略有差异。
5.1 初始化与变量创建
首先,完成所有必要的设置。
5.2 主时间循环与显示函数
构建心脏部分——让时间走起来。
5.3 按钮控制与模式切换
实现用户输入控制。
将上述所有代码块在MakeCode编辑器中组合起来,检查无误后,点击下载,将生成的.hex文件拖入连接到电脑的Micro:bit盘中,程序就会开始运行。
6. 调试、优化与常见问题排查
即使按照教程操作,也可能会遇到一些小问题。这里记录了一些常见的情况和解决方法。
6.1 硬件连接问题排查
| 现象 | 可能原因 | 排查步骤与解决方法 |
|---|---|---|
| LCD无显示 | 1. 电源未接通或接触不良。 2. I2C地址不正确。 3. 背光未开启(某些模块需跳线)。 4. 接线错误(SDA/SCL反接)。 |
1. 用万用表检查REKA:BIT的VCC和GND是否有3.3V输出,检查LCD连接器是否插紧。 2. 尝试更改代码中的I2C地址,常见的是 0x27和0x3F。可以写一个简单的扫描I2C地址的程序来检测。3. 检查LCD模块背面,可能有背光跳线帽,确保其连接在“ON”或“3.3V”一侧。 4. 确认SDA和SCL线没有接反。 |
| LCD显示乱码 | 1. 电源不稳定(电压过低或波纹大)。 2. 初始化指令未成功发送。 |
1. 确保使用电量充足的电池,或改用USB供电测试。在REKA:BIT的电源输入端并联一个100uF的电解电容可以改善稳定性。 2. 在 当开机时积木块中,在初始化LCD后增加一个暂停(200)毫秒,给模块足够的启动时间。 |
| 电位器调节无反应 | 1. 接线错误(中间脚未接信号线)。 2. 模拟引脚选择错误。 3. 电位器损坏。 |
1. 确认电位器的中间脚连接到了Grove线的信号线(黄色/白色),一侧脚接了GND。 2. 确认代码中读取的引脚(P0, P4)与REKA:BIT上实际插的端口(Port1, Port3)对应。 3. 用万用表电阻档,旋转电位器时测量中间脚与GND脚之间的电阻是否平滑变化。 |
| 时间走时不准 | 1. 暂停(1000)毫秒不精确。2. 程序其他部分执行耗时过长。 |
1. Micro:bit的暂停函数并非绝对精确,受系统负载影响。这是软件模拟RTC的固有误差,一天误差几分钟是正常的。如需高精度,需外接DS3231等硬件RTC模块。2. 优化代码,减少循环内不必要的操作和显示刷新。 |
6.2 软件逻辑与功能优化建议
- 提高时间精度: 可以使用Micro:bit的
运行时间(毫秒)函数来替代简单的暂停。记录每次时间更新的时间戳,通过计算时间差来更精确地触发秒数增加。 - 增加亮度调节: 可以再连接一个电位器到另一个模拟口,将其读取的值映射到LCD背光亮度控制(如果LCD模块支持PWM背光控制)或屏幕对比度(通过I2C命令)。
- 添加贪睡功能: 闹钟触发时,除了关闭,可以设计为按A键关闭,按B键贪睡(暂停提醒5-10分钟后再响)。
- 掉电时间保存: Micro:bit v2有少量非易失存储。可以利用
设置保存数字和读取保存数字积木,在修改时间或闹钟后,将这些值保存起来。在当开机时读取,实现掉电记忆。注意频繁写入可能影响存储器寿命。 - 显示优化: 在设置模式下,可以让正在调整的小时或分钟数字闪烁,用户体验更佳。这可以通过在循环中交替显示数字和空格来实现。
6.3 项目扩展思路
这个基础的数字闹钟是一个完美的平台,可以在此基础上添加更多功能:
- 环境传感器: 添加一个Grove温湿度传感器(如DHT11),在LCD第二行轮流显示时间和温度/湿度。
- 无线同步时间: 利用Micro:bit的蓝牙或无线电功能,与手机APP或另一块Micro:bit通信,实现无线校时。
- 多组闹钟: 使用Micro:bit的A/B按钮和内置加速度计(摇一摇)来切换和设置多组闹钟时间。
- 创意外壳: 使用3D打印或激光切割,为你的闹钟制作一个独一无二的个性化外壳。
这个项目从硬件连接到软件逻辑,完整地走通了一个嵌入式产品的基础开发流程。最重要的是,它让你亲手触摸到了代码如何控制硬件、硬件如何反馈给用户的完整交互链条。当你看到自己设置的闹钟准时“醒来”时,那种成就感正是创客精神的源泉。希望这个详细的教程能帮你顺利搭建起自己的第一个智能硬件作品,并激发你更多的创作灵感。