基于arduino 2560 编写一个程序,要求电路上电后,进入配置模式,通过三个按键来设置倒计时时间,单位是秒,并通过4位数码管显示出来,其中一个按键控制位选择,另外两个按键控制加和减。另外按下一个启动自锁按键,开启倒计时,再次按下启动自锁按键停止。要求断电重启后设置的倒计时不会重置,
时间: 2023-10-10 07:05:14 浏览: 167
mid_倒计时_pwm控制风速_电风扇_按键_
好的,下面是基于Arduino 2560的倒计时程序代码:
```
#include <EEPROM.h>
#include <TM1637Display.h>
// 定义TM1640数码管的引脚
#define CLK 22
#define DIO 23
// 定义按键引脚
#define SEL_PIN 2
#define ADD_PIN 3
#define SUB_PIN 4
#define START_PIN 5
// 定义倒计时时间,初始值为60秒
unsigned int count_down_time = 60;
// 定义倒计时是否开始的标志变量
bool is_count_down_started = false;
// 定义倒计时开始的时间戳
unsigned long start_time;
// 定义TM1637Display对象
TM1637Display display(CLK, DIO);
// 定义EEPROM地址,用于保存倒计时时间
#define EEPROM_ADDR 0
void setup() {
// 初始化按键引脚
pinMode(SEL_PIN, INPUT_PULLUP);
pinMode(ADD_PIN, INPUT_PULLUP);
pinMode(SUB_PIN, INPUT_PULLUP);
pinMode(START_PIN, INPUT_PULLUP);
// 初始化数码管
display.setBrightness(0x0f); // 设置亮度
// 从EEPROM中读取倒计时时间,如果没有设置过则使用默认值
EEPROM.get(EEPROM_ADDR, count_down_time);
if (count_down_time == 0) {
count_down_time = 60;
}
}
void loop() {
// 进入配置模式
while (digitalRead(SEL_PIN) == LOW) {
// 按键按下时,等待按键释放
while (digitalRead(SEL_PIN) == LOW) {
delay(10);
}
// 进入配置模式,显示倒计时时间并等待按键操作
display_count_down_time();
while (digitalRead(SEL_PIN) == HIGH) {
// 检测加减按键是否按下
if (digitalRead(ADD_PIN) == LOW) {
count_down_time++;
if (count_down_time > 9999) {
count_down_time = 9999;
}
display_count_down_time();
delay(100);
}
if (digitalRead(SUB_PIN) == LOW) {
count_down_time--;
if (count_down_time == 0) {
count_down_time = 1;
}
display_count_down_time();
delay(100);
}
}
// 保存倒计时时间到EEPROM
EEPROM.put(EEPROM_ADDR, count_down_time);
}
// 检测启动自锁按键是否按下
if (digitalRead(START_PIN) == LOW && !is_count_down_started) {
is_count_down_started = true;
start_time = millis();
}
if (digitalRead(START_PIN) == LOW && is_count_down_started) {
is_count_down_started = false;
count_down_time -= (millis() - start_time) / 1000;
if (count_down_time == 0) {
// 倒计时结束,执行相应操作
}
display_count_down_time();
}
// 显示倒计时时间
if (is_count_down_started) {
unsigned int remain_time = count_down_time - (millis() - start_time) / 1000;
if (remain_time <= 0) {
// 倒计时结束,执行相应操作
}
display.showNumberDecEx(remain_time, 0b01000000, true);
} else {
display_count_down_time();
}
}
// 显示倒计时时间
void display_count_down_time() {
display.showNumberDecEx(count_down_time, 0b01000000, true);
}
```
这段代码使用了EEPROM库和TM1637Display库来实现倒计时功能。在`setup()`函数中对按键和数码管进行了初始化,并从EEPROM中读取保存的倒计时时间。在`loop()`函数中实现了配置模式和倒计时模式的逻辑。在配置模式下,通过加减按键来设置倒计时时间,并保存到EEPROM中。在倒计时模式下,检测启动自锁按键的状态来开始或停止倒计时,并倒计时过程中显示剩余时间。
需要注意的是,该程序只能保存一个倒计时时间,如果需要保存多个倒计时时间,可以使用数组和循环来实现。同时,由于倒计时时间是以秒为单位,所以最大倒计时时间为9999秒,如果需要更长时间的倒计时,可以考虑使用更大的数据类型或者将倒计时时间单位改为毫秒。
阅读全文