#include "SevSeg.h"
// 实例化一个七段数码管控制器对象
SevSeg sevseg;
// 全局变量
int countdownTime = 0; // 倒计时时间(秒)
int currentTime = 0; // 当前倒计时剩余时间
bool isCountdownMode = true; // 是否为倒计时模式
bool isSetupMode = true; // 是否为设置模式
String inputString = ""; // 存储串口输入的字符串
String studentID = ""; // 存储学号
const int ledPin = 19; // LED连接的引脚
const int buttonPin = 21; // 按钮连接的引脚
void setup() {
// 定义数码管的数量
byte numDigits = 4;
// 定义控制每个数码管的引脚
byte digitPins[] = {2, 3, 4, 5};
// 定义控制七段中每一段的引脚
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
// 硬件配置
bool resistorsOnSegments = false;
byte hardwareConfig = COMMON_ANODE;
bool updateWithDelays = false;
bool leadingZeros = true; // 显示前导零
bool disableDecPoint = true;
// 初始化七段数码管控制器
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
// 设置数码管的亮度
sevseg.setBrightness(66);
// 设置引脚模式
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
// 设置中断
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, CHANGE);
// 初始化串口通信
Serial.begin(9600);
Serial.println("请输入学号和倒计时时间(1-99秒),用空格分隔,例如:1624221 10");
// 初始显示"----"表示等待输入
sevseg.setChars("----");
digitalWrite(ledPin, HIGH);
}
void loop() {
// 处理串口输入
if (isSetupMode && Serial.available() > 0) {
char inChar = Serial.read();
if (inChar == '\n' || inChar == '\r') {
// 处理输入完成
processInput();
} else {
inputString += inChar;
}
}
// 倒计时模式
if (!isSetupMode && isCountdownMode) {
static unsigned long lastTimer = millis();
if (millis() - lastTimer >= 1000) { // 每秒更新一次
lastTimer += 1000;
if (currentTime > 0) {
currentTime--;
// 显示当前倒计时时间
sevseg.setNumber(currentTime, 0);
// 调试输出
Serial.print("剩余时间: ");
Serial.print(currentTime);
Serial.println("秒");
} else {
// 倒计时结束
isCountdownMode = false;
// 提取学号后四位
String lastFour = studentID.substring(studentID.length() - 4);
int displayNum = lastFour.toInt();
sevseg.setNumber(displayNum, 0);
Serial.print("倒计时结束,显示学号后四位: ");
Serial.println(displayNum);
}
}
}
// 刷新数码管显示
sevseg.refreshDisplay();
}
// 处理串口输入
void processInput() {
// 分割输入字符串
int spaceIndex = inputString.indexOf(' ');
if (spaceIndex > 0) {
studentID = inputString.substring(0, spaceIndex);
String timeStr = inputString.substring(spaceIndex + 1);
countdownTime = timeStr.toInt();
// 验证输入
if (studentID.length() > 0 && countdownTime > 0 && countdownTime <= 99) {
// 设置完成,开始倒计时
isSetupMode = false;
currentTime = countdownTime;
Serial.print("学号设置成功: ");
Serial.print(studentID);
Serial.print(", 倒计时时间: ");
Serial.print(countdownTime);
Serial.println("秒");
} else {
Serial.println("输入无效,请重新输入,格式:学号 倒计时时间(1-99)");
}
} else {
Serial.println("输入格式错误,请用空格分隔学号和倒计时时间");
}
// 清空输入字符串
inputString = "";
}
// 按钮中断处理函数
void buttonISR() {
// 切换LED状态
static bool lastButtonState = HIGH;
bool currentButtonState = digitalRead(buttonPin);
if (lastButtonState != currentButtonState) {
if (currentButtonState == LOW) {
// 按钮按下,重置状态
digitalWrite(ledPin, !digitalRead(ledPin));
if (isSetupMode) {
Serial.println("当前处于设置模式,请先输入学号和倒计时时间");
} else {
// 重置为设置模式
isSetupMode = true;
isCountdownMode = true;
sevseg.setChars("----");
Serial.println("已重置,请重新输入学号和倒计时时间");
}
}
lastButtonState = currentButtonState;
}
}