硬币计数器——Arduino
- 硬币计数盒模型
- 计数传感器
- 硬币计数盒接线
- 计数器程序
硬币计数盒模型
计数传感器
硬币计数盒接线
计数器程序
// 包含TM1637库,这是一个用于驱动TM1637数码管的模块
#include <TM1637.h>
// 使用volatile关键字声明布尔变量jishu,表示数据可能会随时改变
volatile boolean jishu = LOW; // 初始化jishu为低电平
// 使用volatile声明整型变量number,用于存储显示的数字
volatile int number = 0;
// 创建TM1637实例,初始化时指定数码管的数据线(DIO)和时钟线(CLK)引脚位置
TM1637 tm1637(3, 2); // 数码管DIO连接到第3引脚,CLK连接到第2引脚
// 主函数setup(),初始化阶段
void setup() {
// 设置jishu初始值为LOW,数字数设为0
jishu = LOW;
number = 0;
// 对TM1637进行初始化,并设置其工作模式
tm1637.init();
// 显示数字开始
tm1637.set();
// 将第6引脚配置为输入模式,用于监听按钮信号
pinMode(6, INPUT);
}
// 持续运行的主循环function loop()
void loop() {
// 读取第6引脚的状态
jishu = digitalRead(6);
// 如果第6引脚为高电平,则说明按钮按下,增加数字计数
if (jishu == HIGH) {
number = number + 1;
}
// TM1637显示当前的数字
tm1637.display(number);
}
缺点:断电后,计数器数字得从0开始。
改进后
// 包含必要的库文件
#include <EEPROM.h> // 引入EEPROM库,用于对闪存数据的操作
#include <TM1637.h> // 引入TM1637库,控制TM1637数码管显示
// 宣告变量为volatile,保证中断处理时的更新可见
volatile boolean jishu; // 表示计数器状态,高电平表示有硬币通过
volatile int number; // 存储当前计数值
// 创建TM1637实例,并指定连接到数字管的引脚
TM1637 tm1637(3, 2); // 数码管的数据线和公共端口
// 自定义函数,将长整型值写入EEPROM指定地址
void eepromWriteLong(int address, unsigned long value) {
// 使用union结构将长整型转换为字节流存储
union u_tag {
byte b[4];
unsigned long ULtime;
} time;
time.ULtime = value;
// 分别写入四个字节到EEPROM
EEPROM.write(address, time.b);
EEPROM.write(address + 1, time.b);
// 比较并修复可能存在的字节差异
if (time.b != EEPROM.read(address + 2)) EEPROM.write(address + 2, time.b);
if (time.b != EEPROM.read(address + 3)) EEPROM.write(address + 3, time.b);
}
// 设置初始化过程
void setup() {
// 设置按键初始状态为低
jishu = LOW;
// 从EEPROM读取地址为0的初始计数值
number = EEPROM.read(0);
// 初始化TM1637数码管
tm1637.init();
tm1637.set(); // 显示数字管
// 设定输入引脚6为输入模式
pinMode(6, INPUT);
// 启动串口通信
Serial.begin(9600);
}
// 主循环
void loop() {
// 检查按键状态,若有按键按下,则操作计数
jishu = digitalRead(6);
if (jishu == HIGH) {
number += 1;
// 更新EEPROM中地址为0存储的计数值
eepromWriteLong(0, number);
}
// 在数码管上显示当前计数值
tm1637.display(number);
// 打印计数值到串口
Serial.println(number);
// 程序暂停2秒再继续
delay(2000);
}