智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
项目初衷
为女儿制作一款“知余额”的智能存钱罐:硬币投入后自动识别面值、累计总额、掉电不丢失、四位数码管实时显示。核心在于驱动通用硬币识别器(脉冲输出型)并解析其脉冲模式对应面值。
硬件清单
- Arduino Nano R3 ×1
- 硬币识别器(多币种脉冲输出型)×1
- TM1637 四位共阴数码管模块 ×1
- 面包板、跳线若干
工作原理
硬币识别器脉冲协议
识别器验币通过后,在 OUT 引脚输出一定数量的下降沿脉冲:
• 1 个脉冲 → 2 元
• 2 个脉冲 → 1 元
• 3 个脉冲 → 0.5 元
• 4 个脉冲 → 0.2 元
• 5 个脉冲 → 0.1 元
脉冲间隔极短,单片机需用外部中断捕获。
软件实现要点
- 中断计数:引脚 D2 (INT0) 下降沿触发
incomingImpuls(),全局变量impulsCount累加,i计时器清零 - 主循环定时判决:
i每循环+1,当i ≥ 30(约 30 ms 无新脉冲)判定一枚硬币结束,根据impulsCount增加对应金额,清零计数器 - EEPROM 掉电保存:
EEPROM.get/put(0, total_amount)读写浮点总额,上电恢复 - 数码管显示:
TM1637Display库驱动,showNumberDecEx处理小数点(< 10 元显示两位小数,≥10 元显示整数)
接线说明
| 模块引脚 | Arduino Nano |
|---|---|
| 硬币识别器 OUT | D2 (INT0) |
| 硬币识别器 VCC/GND | 5V / GND |
| TM1637 CLK | D3 |
| TM1637 DIO | D4 |
| TM1637 VCC/GND | 5V / GND |
代码结构
#include <TM1637Display.h>
#include <EEPROM.h>
#define CLK 3
#define DIO 4
TM1637Display display(CLK, DIO);
volatile int impulsCount = 0;
int i = 0;
float total_amount = 0;
void incomingImpuls() { impulsCount++; i = 0; }
void loop() {
i++;
if (i >= 30 && impulsCount > 0) {
switch (impulsCount) {
case 1: total_amount += 2; break;
case 2: total_amount += 1; break;
case 3: total_amount += 0.5; break;
case 4: total_amount += 0.2; break;
case 5: total_amount += 0.1; break;
}
impulsCount = 0;
EEPROM.put(0, total_amount);
}
// 显示逻辑...
}
扩展建议
- 更换识别器只需修改
switch映射表 - 可加入 OLED 显示更多信息(如各面值计数)
- 接入 Wi-Fi/蓝牙模块实现手机端同步查看
- 外壳 3D 打印集成投币口与显示窗
制造工艺
- Arduino 电源控制中心:N-FET/P-FET/继电器/RTC 多功能扩展板
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- Arduino Nano + 摇杆控制双步进电机:Visuino 图形化教程
- ThimbleKrox:基于 Arduino Micro 与 MPU-6050 的指戴式鼠标控制器
- Arduino UNO + 以太网盾板实现低成本太阳辐射测量仪(热电堆原理)
- DIY Arduino 蟑螂控制系统 —— 30 美元以内自制指南
- 使用 Arduino Uno 和蓝牙实现遥控小车:分步指南
- 通过专用 Android App 蓝牙控制 Arduino 机械臂
- Arduino Pro Micro 实现 HID UPS:将"哑"电源升级为 USB 智能后备电源
- 使用 Arduino 制作便携式 RFID 门锁——分步指南
- Arduino Uno 控制 25kHz 4 针 PWM 风扇 - 硬件、代码与测试