// 引入所需库(Wokwi已内置这些库,无需手动安装)
#include <OneWire.h> // 单总线协议库
#include <DallasTemperature.h> // DS18B20专用驱动库
#include <TM1637Display.h> // TM1637数码管驱动库
// 定义引脚(必须和上面的接线完全一致)
#define DS18B20_DATA_PIN PA0 // DS18B20数据引脚
#define TM1637_CLK_PIN PB6 // 数码管时钟引脚
#define TM1637_DIO_PIN PB7 // 数码管数据引脚
// 创建对象
OneWire oneWire(DS18B20_DATA_PIN);
DallasTemperature sensors(&oneWire);
TM1637Display display(TM1637_CLK_PIN, TM1637_DIO_PIN);
void setup() {
// 初始化串口(用于调试,可选)
Serial.begin(9600);
Serial.println("系统启动中...");
// 初始化DS18B20传感器
sensors.begin();
Serial.println("DS18B20初始化成功");
// 设置数码管亮度(0-7,7最亮)
display.setBrightness(7);
// 清空数码管显示
display.clear();
}
void loop() {
// 1. 向DS18B20发送温度转换命令
sensors.requestTemperatures();
// 2. 读取温度值(摄氏度)
float tempC = sensors.getTempCByIndex(0);
// 3. 异常处理:如果传感器未连接
if (tempC == DEVICE_DISCONNECTED_C) {
Serial.println("错误:DS18B20传感器未连接");
display.showNumberDec(8888); // 显示错误码
}
// 4. 正常显示温度
else {
// 串口输出调试信息
Serial.print("当前温度:");
Serial.print(tempC);
Serial.println(" ℃");
// 温度转换:保留1位小数(乘以10转为整数)
// 例如:25.6℃ → 256,方便数码管显示
int tempDisplay = (int)(tempC * 10);
// 在数码管上显示4位数字
display.showNumberDec(tempDisplay, false, 4, 0);
// 在第2位数字后添加小数点(显示25.6)
display.setSegments(0x80, 1);
}
// 每隔1秒更新一次温度
delay(1000);
}Loading
st-nucleo-c031c6
st-nucleo-c031c6