简单的Arduino 温度采集系统

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. 连接原理

  • DS18B20VDD 接 Arduino 3.3VGNDGNDDQ 接 Arduino D2(单总线数据脚)。
  • 0.96OLED 显示屏SCL 接 Arduino A5SDAA4VCC3.3VGNDGND(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 动图说明)

在这里插入图片描述

  1. 开机动画:OLED 屏自下而上依次滚动显示 WELCOME TEMPERATURE MONITOR,随后屏幕闪烁 3 次。

  2. 正常显示:温度(如 25℃)、学号、姓名稳定显示;温度<30℃ 时,LED 灭、蜂鸣器静音。
    在这里插入图片描述

  3. 超限报警:当温度≥30℃(可通过加热 DS18B20 模拟),OLED 显示 TOO HOT! ALARM!,LED 亮、蜂鸣器持续发声。

  4. 异常处理:若传感器未连接,OLED 显示错误信息 Cannot read temperature sensor!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值