Arduino 温度采集系统:基于 DS18B20 与 0.96 OLED 四线款显示
一、目标
搭建Arduino 温度采集系统,通过 DS18B20 温度传感器 采集环境温度,借助 Arduino Nano 开发板处理数据,利用 0.96OLED 显示屏 实时显示温度、学号、姓名,当温度超过 30℃ 时,LED 灯亮、蜂鸣器报警 ,实现温度监测与异常预警,结合开机动画增强交互体验,实现硬件感知与数据可视化的完整流程。
二、硬件介绍
1. 核心硬件
| 硬件名称 | 功能说明 |
|---|---|
| Arduino Nano 开发板 | 系统控制核心,负责运行程序、处理传感器数据与外设交互 |
| DS18B20 温度传感器 | 采集环境温度,通过单总线通信输出数字温度值,精度高、抗干扰强 |
| 0.96OLED 显示屏 | 实时显示温度、学号、姓名、报警信息,I2C 通信,低功耗、高对比度 |
| LED 灯 + 蜂鸣器 | 温度超限(>30℃)时,LED 亮灯、蜂鸣器发声报警 |
| 彩排线/数据线 | 连接硬件模块,传输电信号与电源 |
1. Arduino Nano 开发板
Arduino Nano 是小巧灵活的开源硬件,基于 ATmega328P ,具备 14 个数字 I/O 引脚(6 个 PWM 输出)、8 个模拟输入引脚,支持串口通信,可便捷连接传感器、执行器,是物联网、电子制作实验常用控制核心,为系统提供数据处理与指令执行环境。

2. DS18B20 温度传感器
单总线数字温度传感器,接线简单,测量范围 -55℃ 至 +125℃ ,精度可达 ±0.5℃(-10℃ 至 +85℃ 区间 ),能直接输出数字信号,与 Arduino 通信无需复杂模数转换,方便采集环境温度数据 。

3. 0.96OLED 显示屏
0.96 英寸 OLED 屏,采用 I2C 或 SPI 通信(本实验用 I2C ),分辨率 128×64 ,自发光、对比度高、视角广,可清晰显示温度数值、文字信息(学号、姓名、报警提示等 ),实时呈现系统状态 。

4. LED 灯与蜂鸣器
- LED 灯:作报警指示,温度超阈值时点亮,直观提示异常。
- 蜂鸣器:发声报警,配合 LED 增强警示效果,1kHz 频率鸣叫易引起注意 。


5. 辅助硬件
- 数据线:用于 Arduino 与电脑连接,上传程序、查看串口数据。
- 彩排线:实现硬件间电路连接,如传感器、显示屏、LED、蜂鸣器与 Arduino 的引脚接线 。 注意要用面包板时,是两种彩排线。
- 面包板:实现硬件间电路连接。




三、硬件连接(Fritzing 图示)
1. 连接原理
- DS18B20:
VDD接 Arduino3.3V,GND接GND,DQ接 ArduinoD2(单总线数据脚)。 - 0.96OLED 显示屏:
SCL接 ArduinoA5,SDA接A4,VCC接3.3V,GND接GND(I2C 通信)。 - LED 灯:正极接 Arduino
D3,负极串电阻后接GND(电阻建议 220Ω)。 - 蜂鸣器:正极接 Arduino
D4,负极接GND(有源蜂鸣器可直接驱动)。
2. Fritzing 连接图


关键引脚: DS18B20 接 D2、OLED 接 A4/A5、LED 接 D3、蜂鸣器接 D4
四、完整代码实现
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// OLED 显示屏设置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// 温度传感器设置
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// 报警设置
#define LED_PIN 3
#define BUZZER_PIN 4
#define ALARM_TEMP 30.0 // 报警阈值
// 个人信息
const String studentID = "ID:2406034339";
const String studentName = "Zhao Pei Chong";
void setup() {
Serial.begin(9600);
// 初始化 OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // 初始化失败则卡住
}
// 初始化温度传感器、报警引脚
sensors.begin();
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
// 显示开机动画
showStartupAnimation();
// 初始显示
display.clearDisplay();
displayInfo(0.0);
}
void loop() {
// 获取温度
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// 温度有效则更新显示、判断报警
if(tempC != DEVICE_DISCONNECTED_C) {
Serial.print("Temperature: ");
Serial.print(tempC);
Serial.println("°C");
displayInfo(tempC);
// 超限报警逻辑
if(tempC > ALARM_TEMP) {
triggerAlarm(true);
} else {
triggerAlarm(false);
}
} else {
// 温度传感器异常
Serial.println("Error: Could not read temperature data");
displayError();
}
delay(2000); // 2秒更新一次
}
// 开机动画:文字滚动 + 闪烁
void showStartupAnimation() {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
// 文字从下往上滚动
for(int i=SCREEN_HEIGHT; i>=-30; i--) {
display.clearDisplay();
display.setCursor(10, i);
display.println("WELCOME");
display.setCursor(10, i+30);
display.println("TEMPERATURE");
display.setCursor(10, i+60);
display.println("MONITOR");
display.display();
delay(20);
}
// 闪烁效果
for(int i=0; i<3; i++) {
display.invertDisplay(true);
delay(200);
display.invertDisplay(false);
delay(200);
}
}
// 显示温度、学号、姓名
void displayInfo(float temp) {
display.clearDisplay();
// 显示温度
display.setTextSize(2);
display.setCursor(0, 0);
display.print(temp);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167); // 度符号
display.setTextSize(2);
display.print("C");
// 显示学号
display.setTextSize(1);
display.setCursor(0, 20);
display.print(studentID);
// 显示姓名
display.setCursor(0, 35);
display.print(studentName);
// 超限警告
if(temp > ALARM_TEMP) {
display.setTextSize(1);
display.setCursor(0, 50);
display.print("TOO HOT! ALARM!");
}
display.display();
}
// 显示传感器异常
void displayError() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Error:");
display.println("Cannot read");
display.println("temperature");
display.println("sensor!");
display.display();
}
// 触发/关闭报警(LED + 蜂鸣器)
void triggerAlarm(bool activate) {
if(activate) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000); // 1kHz 蜂鸣
} else {
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
}
}
五、功能演示(GIF 动图说明)

-
开机动画:OLED 屏自下而上依次滚动显示
WELCOMETEMPERATUREMONITOR,随后屏幕闪烁 3 次。 -
正常显示:温度(如 25℃)、学号、姓名稳定显示;温度<30℃ 时,LED 灭、蜂鸣器静音。

-
超限报警:当温度≥30℃(可通过加热 DS18B20 模拟),OLED 显示
TOO HOT! ALARM!,LED 亮、蜂鸣器持续发声。 -
异常处理:若传感器未连接,OLED 显示错误信息
Cannot read temperature sensor!。
2595

被折叠的 条评论
为什么被折叠?



