硬币计数器——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);
}
  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌你一颗小芯芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值