#include <TM1637Display.h>
// ========== 引脚定义(代码填空1) ==========
#define CLK_PIN 2 // 数码管时钟引脚(D2)
#define DIO_PIN 3 // 数码管数据引脚(D3)
#define ADC_PIN A0 // 温度传感器输入(接电位器)(A0)
TM1637Display display(CLK_PIN, DIO_PIN);
// ========== 温度映射参数 ==========
#define TEMP_MIN -20.0
#define TEMP_MAX 60.0
#define ADC_MAX 4095
// ========== 中断接收变量(补充代码2) ==========
volatile bool interruptFlag = false;
String interruptData = "";
unsigned long lastInterruptTime = 0;
// ========== 测试命令表 ==========
String testCommands[] = {"B1","B2","TEMP","STATUS","RESET","HELP","ICE","ZONE"};
int testCount = sizeof(testCommands) / sizeof(testCommands[0]);
int testIndex = 0;
// ========== 命令码对照表 ==========
struct {
String name;
int code;
} commands[] = {
{"B1", 3},
{"B2", 4},
{"TEMP", 5},
{"STATUS", 6},
{"RESET", 7},
{"HELP", 8},
{"ICE", 10},
{"ZONE", 11}
};
int cmdCount = sizeof(commands) / sizeof(commands[0]);
// ========== 函数声明 ==========
int getCommandCode(String cmd);
void displayNumber(int num);
void showHelp();
void processCommand(String cmd);
void onInterruptReceive(String data);
float readTemperature();
// ========== 模拟中断处理函数(补充代码2) ==========
void onInterruptReceive(String data) {
interruptData = data;
interruptFlag = true;
Serial.print("[USART2_IRQ] ");
Serial.println(data);
}
// ========== 读取温度(ADC转换)(补充代码3) ==========
float readTemperature() {
int adcValue = analogRead(ADC_PIN);
float temperature = TEMP_MIN + (float)adcValue / ADC_MAX * (TEMP_MAX - TEMP_MIN);
Serial.print("ADC值:");
Serial.print(adcValue);
Serial.print(" → 温度:");
Serial.print(temperature, 1);
Serial.println("℃");
return temperature;
}
// ========== setup() 初始化 ==========
void setup() {
Serial.begin(9600);
delay(500);
display.setBrightness(0x0a);
display.setSegments(0);
}
// ========== loop() 主循环 ==========
void loop() {
if (millis() - lastInterruptTime >= 3000) {
lastInterruptTime = millis();
String cmd = testCommands[testIndex];
testIndex = (testIndex + 1) % testCount;
onInterruptReceive(cmd);
}
if (interruptFlag) {
interruptFlag = false;
String cmd = interruptData;
interruptData = "";
processCommand(cmd);
Serial.println("等待下一个中断...");
Serial.println();
}
delay(10);
}
// ========== 功能函数 ==========
int getCommandCode(String cmd) {
cmd.trim();
for (int i = 0; i < cmdCount; i++) {
if (commands[i].name.equalsIgnoreCase(cmd)) {
return commands[i].code;
}
}
return -1;
}
void displayNumber(int num) {
if (num < 0 || num > 9999) {
display.showNumberDec(0, true);
return;
}
display.showNumberDec(num, true);
}
void showHelp() {
Serial.println("Available commands:");
Serial.println("B1, B2, TEMP, STATUS, RESET, HELP, ICE, ZONE");
}
void processCommand(String cmd) {
cmd.trim();
int code = getCommandCode(cmd);
if (code == -1) {
Serial.println("Unknown command! Type HELP for available commands.");
return;
}
if (cmd.equalsIgnoreCase("HELP")) {
showHelp();
} else if (cmd.equalsIgnoreCase("RESET")) {
display.setSegments(0);
Serial.println("System reset!");
} else if (cmd.equalsIgnoreCase("TEMP")) {
float temp = readTemperature();
display.showNumberDec((int)temp, true);
Serial.printf("Current Temperature: %.1f ℃\r\n", temp);
} else {
displayNumber(code);
Serial.printf("Command %s -> Code %d\r\n", cmd.c_str(), code);
}
}Loading
st-nucleo-c031c6
st-nucleo-c031c6