基于Micro:bit与REKA:BIT扩展板的数字闹钟DIY项目全解析

Micro:bitREKA:BIT数字闹钟
于 2026-05-31 13:06:57 修改
·本内容遵循CC 4.0 BY-SA版权协议

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 外壳加工与元件定位

找一个大小适中的塑料项目盒。规划布局是关键一步,这决定了成品的易用性和美观度。

  1. LCD开孔: 将LCD屏幕的显示部分紧贴盒子内侧,用笔描出它的外轮廓。然后使用小电钻或手工钻头在轮廓内部打一圈密集的小孔,再用锉刀或美工刀小心地将孔连通、修整平滑,直到LCD能严丝合缝地卡进去。边缘务必处理光滑,避免划伤屏幕或自己。
  2. 电位器开孔: 两个电位器并排安装在LCD上方或下方。根据电位器旋钮的直径开圆孔。开孔后,从盒子内部放入电位器,用配套的螺母从外部拧紧固定,这样电位器就被牢牢锁在面板上了。
  3. REKA:BIT固定: 在盒子内部规划一个位置放置REKA:BIT主板,确保其USB口和电池接口靠近盒子侧壁,方便后续插拔。在主板四周的安装孔位置,用扎带穿过盒子底板预钻的小孔,将主板牢牢捆绑固定。避免主板悬空或晃动。
  4. 走线考虑: 所有连接线应尽量沿盒子内壁走,并用少量扎带或胶带固定,避免杂乱无章,也防止线材被电位器轴或主板元件刮伤。

3.2 电路连接原理与实操

接线是项目的物理基础,理解原理能避免错误。请参照下图所示的逻辑关系进行连接:

连接原理图

TEXT
Micro:bit (via REKA:BIT Grove Ports)
|
|--- Grove Port 1 (P0, P1) ---> 电位器1 (用于调节小时/设置小时)
| |-- P0: 模拟输入 (连接电位器中间脚)
| |-- P1: 未使用 (Grove接口特性,但此处仅用一根信号线)
|
|--- Grove Port 3 (P4, P5) ---> 电位器2 (用于调节分钟/设置分钟)
| |-- P4: 模拟输入 (连接电位器中间脚)
|
|--- Grove Port 6 (P19, P20) -> I2C LCD 显示屏
|-- P19: SDA (数据线)
|-- P20: SCL (时钟线)

(注:Grove接口的VCC和GND引脚已统一为外围元件供电)

具体接线步骤

  1. 电位器连接

    • 取两根Grove to Female线。每根线的Grove端分别插入REKA:BIT的 Port 1Port 3
    • 每根线的另一端有三个杜邦线母头(黑、红、黄、白,颜色可能不同,以丝印为准)。我们需要用到其中的 信号线(通常是黄色或白色)GND线(黑色)
    • 对于一个电位器,其三个引脚通常为:左右两脚是电阻的两端,中间脚是滑动抽头。
    • 接法: 将信号线母头连接到电位器的中间脚。将GND线母头连接到电位器的任意一侧脚。电位器剩下的那个脚悬空不接。这样,电位器就构成了一个分压电路,中间脚输出可变的电压到Micro:bit的模拟输入引脚。
    • 两个电位器接法完全相同。
  2. 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的 VCCGND (黑) -> GNDSDA (蓝或黄) -> SDASCL (绿或白) -> SCL。插紧即可。
  3. 电源连接

    • 将电池盒的红线(正极)连接到REKA:BIT上标有“BAT+”或电池符号正极的端子,黑线(负极)连接到“GND”端子。
    • 检查所有连接是否牢固,避免虚接。

实操心得: 在接通电源前,花一分钟做一次“视觉检查”。确保没有金属线头相互触碰(特别是VCC和GND),确保电位器没有接错导致短路。养成“先接线,后上电”的习惯,能保护你的硬件。

4. MakeCode图形化编程逻辑剖析

硬件是身体,软件是灵魂。我们将使用MakeCode for micro:bit进行图形化编程,其核心是处理输入(电位器、按钮)、维护状态(当前时间、闹钟时间)、控制输出(LCD显示)。

4.1 项目初始化与变量定义

程序一开始,我们需要建立整个系统运行所需的所有“记忆单元”(变量)。

  1. 添加扩展: 在MakeCode的新建项目中,点击“扩展”,搜索并添加 reka-bitgrove 扩展(取决于扩展库名称),以确保可以使用REKA:BIT的专用积木块。同时,也需要添加 LCD1602I2C LCD 扩展来驱动屏幕。
  2. 定义核心变量
    • 当前小时当前分钟当前秒: 用于存储和更新实时时间。
    • 闹钟小时闹钟分钟: 用于存储用户设定的闹钟时间。
    • 闹钟启用: 一个布尔值(真/假),用于标记闹钟是否开启。
    • 设置模式: 另一个变量,用于区分当前是“正常显示模式”、“设置时间模式”还是“设置闹钟模式”。我们可以用数字表示,例如:0=正常,1=设时间,2=设闹钟。
  3. 初始化操作
    • 当开机时 积木块中,初始化LCD屏幕(设置I2C地址,通常为0x27或0x3F,需根据你的LCD模块确定)。
    • 当前小时当前分钟当前秒设置为一个初始值(例如12:00:00)。
    • 闹钟小时闹钟分钟设置为默认值(如07:00)。
    • 闹钟启用设为设置模式设为0(正常模式)。
    • 在LCD上显示初始时间,例如“12:00”。

4.2 主循环与时间流逝模拟

Micro:bit没有实时时钟(RTC)芯片,所以我们需要用软件模拟时间的流逝。

  1. 利用“无限循环”和“暂停”: 在 无限循环 积木块中,我们让程序每1000毫秒(1秒)执行一次。
  2. 秒数递增逻辑
    • 每次循环,先将当前秒增加1。
    • 判断:如果当前秒等于60,则将当前秒归零,同时当前分钟增加1。
    • 继续判断:如果当前分钟等于60,则将当前分钟归零,同时当前小时增加1。
    • 最后判断:如果当前小时等于24,则将当前小时归零。
    • 这样就完成了一个完整的“秒->分->时”的进位模拟。
  3. 时间显示更新: 在每次更新完时间变量后,都需要调用LCD显示函数,将当前小时当前分钟以“HH:MM”的格式显示在屏幕上。为了美观,记得在小时或分钟小于10时,在前面补一个“0”。

4.3 交互逻辑:按钮与电位器编程

这是项目的交互核心,决定了用户如何设置时间。

  1. 按钮模式切换
    • 当按钮A被按下时: 将设置模式变量从0(正常)改为1(设置时间)。此时,LCD可以显示“Set Time”或闪烁光标提示。
    • 当按钮B被按下时: 将设置模式从0改为2(设置闹钟)。LCD显示“Set Alarm”。
    • 再次按下对应按钮,应将模式切回0。这可以通过判断当前模式来实现。
  2. 电位器数值读取与映射
    • 无限循环中,我们需要持续读取两个电位器的值。
    • 使用 读取模拟引脚 P0 的值读取模拟引脚 P4 的值 积木。读到的值是0-1023。
    • 关键映射算法: 我们需要将这个0-1023的值映射到0-23(小时)或0-59(分钟)。公式为: 目标值 = 取整((读取的模拟值 / 1023) * 最大值)。 例如,映射到小时:映射小时 = 取整((P0值 / 1023) * 24)。 映射到分钟:映射分钟 = 取整((P4值 / 1023) * 60)
  3. 模式判断与赋值
    • 在循环内,加入判断设置模式的积木。
    • 如果设置模式 == 1(设置时间),则将上面计算出的映射小时赋值给当前小时映射分钟赋值给当前分钟。同时,可以将当前秒归零,让设置更精确。
    • 如果设置模式 == 2(设置闹钟),则将映射小时赋值给闹钟小时映射分钟赋值给闹钟分钟。同时,可以将闹钟启用设为
    • 在设置模式下,LCD可以实时显示正在调整的值,提供视觉反馈。

4.4 闹钟触发判断与提示

  1. 触发判断: 在无限循环中,每次更新时间后,加入一个判断:如果闹钟启用,并且当前小时等于闹钟小时,并且当前分钟等于闹钟分钟,并且当前秒在某个范围内(例如0-10秒),则判定闹钟触发。
  2. 触发动作
    • 视觉提示: 让LCD屏幕闪烁(交替显示时间和全亮/全暗),或者显示“ALARM!!!”。
    • 声音提示(如果REKA:BIT带蜂鸣器): 使用 播放旋律引脚模拟输出 积木来驱动蜂鸣器发出“滴滴”声。可以播放一小段简单的旋律。
    • 关闭闹钟: 通常设计为按下任意按钮(A或B)来关闭闹钟提示,并将闹钟启用设为

5. 代码实现与分步详解

下面我们将把上述逻辑转化为具体的MakeCode积木块。请注意,积木的具体名称可能因扩展版本略有差异。

5.1 初始化与变量创建

首先,完成所有必要的设置。

BLOCKS
// 此部分为伪代码描述,示意逻辑结构
当开机时 {
// 初始化LCD1602,设置I2C地址(常见为0x27或0x3F)
LCD1602.初始化(地址: 0x27)
// 清屏并显示欢迎信息
LCD1602.显示字符串("DIY Alarm Clock", 行: 0, 列: 0)
暂停(1000)毫秒
LCD1602.清屏()
 
// 初始化时间变量
变量 当前小时 设为 12
变量 当前分钟 设为 0
变量 当前秒 设为 0
// 初始化闹钟变量
变量 闹钟小时 设为 7
变量 闹钟分钟 设为 0
变量 闹钟启用 设为 假
// 初始化模式变量
变量 设置模式 设为 0 // 0=正常,1=设时间,2=设闹钟
 
// 显示初始时间
刷新显示()
}

5.2 主时间循环与显示函数

构建心脏部分——让时间走起来。

BLOCKS
// 定义一个“刷新显示”的函数,方便调用
函数 刷新显示 {
// 将小时和分钟格式化为两位数字符串,例如“12”变成“12”,“5”变成“05”
变量 小时文本 = 格式化数字(当前小时)
变量 分钟文本 = 格式化数字(当前分钟)
// 在LCD第一行中间显示时间,如“12:00”
LCD1602.显示字符串(小时文本 + ":" + 分钟文本, 行: 0, 列: 4)
// 第二行可以显示闹钟状态或模式
如果 设置模式 == 0 则 {
如果 闹钟启用 则 {
LCD1602.显示字符串("Alarm ON " + 格式化数字(闹钟小时) + ":" + 格式化数字(闹钟分钟), 行: 1, 列: 0)
} 否则 {
LCD1602.显示字符串("Alarm OFF", 行: 1, 列: 0)
}
} 否则 如果 设置模式 == 1 则 {
LCD1602.显示字符串("Set Time", 行: 1, 列: 0)
} 否则 {
LCD1602.显示字符串("Set Alarm", 行: 1, 列: 0)
}
}
 
// 辅助函数:格式化数字为两位文本
函数 格式化数字 (数字) {
如果 数字 < 10 则 {
返回 "0" + 数字
} 否则 {
返回 "" + 数字 // 转换为文本
}
}
 
无限循环 {
// 1. 时间流逝
当前秒 += 1
如果 当前秒 >= 60 则 {
当前秒 = 0
当前分钟 += 1
}
如果 当前分钟 >= 60 则 {
当前分钟 = 0
当前小时 += 1
}
如果 当前小时 >= 24 则 {
当前小时 = 0
}
 
// 2. 读取电位器并处理设置
变量 电位器1值 = 读取模拟引脚 P0
变量 电位器2值 = 读取模拟引脚 P4
// 映射电位器1值到0-23(小时)
变量 映射小时 = 取整((电位器1值 / 1023) * 24)
// 映射电位器2值到0-59(分钟)
变量 映射分钟 = 取整((电位器2值 / 1023) * 60)
 
如果 设置模式 == 1 则 {
当前小时 = 映射小时
当前分钟 = 映射分钟
当前秒 = 0 // 设置时间时,秒归零
} 否则 如果 设置模式 == 2 则 {
闹钟小时 = 映射小时
闹钟分钟 = 映射分钟
闹钟启用 = 真
}
 
// 3. 检查闹钟触发
如果 闹钟启用 且 当前小时 == 闹钟小时 且 当前分钟 == 闹钟分钟 且 当前秒 < 10 则 {
// 触发闹钟:闪烁屏幕
如果 当前秒 除以 2 的余数 == 0 则 {
LCD1602.显示字符串("WAKE UP!!!", 行: 0, 列: 3)
LCD1602.显示字符串("Press A/B", 行: 1, 列: 3)
// 这里可以添加声音代码,例如:引脚 P2 模拟输出 500
} 否则 {
LCD1602.清屏()
}
} 否则 {
// 4. 正常刷新显示
刷新显示()
}
 
暂停(1000)毫秒 // 等待1秒
}

5.3 按钮控制与模式切换

实现用户输入控制。

BLOCKS
当按钮 A 被按下 {
如果 设置模式 == 0 则 {
设置模式 = 1 // 进入设置时间模式
LCD1602.显示字符串("Adjust Hour/Min", 行: 1, 列: 0)
} 否则 如果 设置模式 == 1 则 {
设置模式 = 0 // 退出设置时间模式
刷新显示()
}
// 如果闹钟正在响,按A也可以关闭
如果 (闹钟启用 且 当前小时 == 闹钟小时 且 当前分钟 == 闹钟分钟) {
闹钟启用 = 假
LCD1602.清屏()
刷新显示()
}
}
 
当按钮 B 被按下 {
如果 设置模式 == 0 则 {
设置模式 = 2 // 进入设置闹钟模式
LCD1602.显示字符串("Set Alarm H/M", 行: 1, 列: 0)
} 否则 如果 设置模式 == 2 则 {
设置模式 = 0 // 退出设置闹钟模式
刷新显示()
}
// 同样,闹钟响时按B关闭
如果 (闹钟启用 且 当前小时 == 闹钟小时 且 当前分钟 == 闹钟分钟) {
闹钟启用 = 假
LCD1602.清屏()
刷新显示()
}
}

将上述所有代码块在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地址,常见的是0x270x3F。可以写一个简单的扫描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 软件逻辑与功能优化建议

  1. 提高时间精度: 可以使用Micro:bit的运行时间(毫秒)函数来替代简单的暂停。记录每次时间更新的时间戳,通过计算时间差来更精确地触发秒数增加。
  2. 增加亮度调节: 可以再连接一个电位器到另一个模拟口,将其读取的值映射到LCD背光亮度控制(如果LCD模块支持PWM背光控制)或屏幕对比度(通过I2C命令)。
  3. 添加贪睡功能: 闹钟触发时,除了关闭,可以设计为按A键关闭,按B键贪睡(暂停提醒5-10分钟后再响)。
  4. 掉电时间保存: Micro:bit v2有少量非易失存储。可以利用设置保存数字读取保存数字积木,在修改时间或闹钟后,将这些值保存起来。在当开机时读取,实现掉电记忆。注意频繁写入可能影响存储器寿命。
  5. 显示优化: 在设置模式下,可以让正在调整的小时或分钟数字闪烁,用户体验更佳。这可以通过在循环中交替显示数字和空格来实现。

6.3 项目扩展思路

这个基础的数字闹钟是一个完美的平台,可以在此基础上添加更多功能:

  • 环境传感器: 添加一个Grove温湿度传感器(如DHT11),在LCD第二行轮流显示时间和温度/湿度。
  • 无线同步时间: 利用Micro:bit的蓝牙或无线电功能,与手机APP或另一块Micro:bit通信,实现无线校时。
  • 多组闹钟: 使用Micro:bit的A/B按钮和内置加速度计(摇一摇)来切换和设置多组闹钟时间。
  • 创意外壳: 使用3D打印或激光切割,为你的闹钟制作一个独一无二的个性化外壳。

这个项目从硬件连接到软件逻辑,完整地走通了一个嵌入式产品的基础开发流程。最重要的是,它让你亲手触摸到了代码如何控制硬件、硬件如何反馈给用户的完整交互链条。当你看到自己设置的闹钟准时“醒来”时,那种成就感正是创客精神的源泉。希望这个详细的教程能帮你顺利搭建起自己的第一个智能硬件作品,并激发你更多的创作灵感。