李家钛2506034309 Arduino Nano 温度报警装置一、项目概述本项目基于 Arduino Nano 开发板搭配 DS18B20 温度传感器、SSD1306 OLED 显示屏和有源蜂鸣器模块实现温度实时监测与报警功能。当环境温度超过 30°C 时蜂鸣器自动报警OLED 屏幕同步显示当前温度和报警状态。核心功能实时采集环境温度OLED 屏幕显示温度数值中文界面温度 30°C 时蜂鸣器报警温度 ≤ 30°C 时蜂鸣器静默传感器异常自动提示二、实验材料器材清单序号器材名称数量参考价格1Arduino Nano 3 开发板1¥152DS18B20 温度传感器模块1¥53SSD1306 OLED 显示屏模块128×64I2C1¥84有源蜂鸣器模块1¥35杜邦线公对母/母对母若干¥26面包板可选1¥3合计约¥36三、硬件连接3.1 引脚接线表DS18B20 温度传感器 → Arduino NanoDS18B20 引脚Arduino Nano 引脚VCC5VGNDGNDDQD2SSD1306 OLED 显示屏 → Arduino NanoOLED 模块引脚Arduino Nano 引脚VDD5VGNDGNDSCKA5SDAA4有源蜂鸣器模块 → Arduino Nano蜂鸣器模块引脚Arduino Nano 引脚VCC5VGNDGNDI/OD33.2 硬件连接示意图![所有模块共用 5V 和 GND屏幕用3.3v)数据线分别连接 D2DS18B20、A5/A4OLED I2C、D8蜂鸣器。四、软件编程4.1 所需库安装在 Arduino IDE 中安装以下库OneWire — DS18B20 单总线通信库菜单项目 → 加载库 → 管理库 → 搜索 OneWire → 安装DallasTemperature — DS18B20 温度读取库菜单项目 → 加载库 → 管理库 → 搜索 DallasTemperature → 安装Adafruit SSD1306 — SSD1306 OLED 驱动库菜单项目 → 加载库 → 管理库 → 搜索 Adafruit SSD1306 → 安装Adafruit GFX Library — 图形显示基础库菜单项目 → 加载库 → 管理库 → 搜索 Adafruit GFX → 安装4.2 完整源代码#includeWire.h#includeAdafruit_GFX.h#includeAdafruit_SSD1306.h#includeOneWire.h#includeDallasTemperature.h// OLED 配置#defineSCREEN_WIDTH128#defineSCREEN_HEIGHT64#defineOLED_RESET-1Adafruit_SSD1306display(SCREEN_WIDTH,SCREEN_HEIGHT,Wire,OLED_RESET);// 引脚配置#defineONE_WIRE_BUS2// DS18B20 数据引脚#defineBUZZER_PIN3// 有源蜂鸣器控制引脚#defineLED_PIN13// 板载LED报警引脚OneWireoneWire(ONE_WIRE_BUS);DallasTemperaturesensors(oneWire);// 温度报警阈值constfloatTEMP_THRESHOLD28.0;// 文字内容: 王奂熙 | 宽: 47 | 高: 16constunsignedcharbitmap_wanghuanxi[]PROGMEM{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x01,0xFF,0x0F,0xC3,0x49,0x00,0x00,0x10,0x08,0x42,0xC9,0x00,0x00,0x10,0x18,0xC3,0xAF,0x00,0x00,0x10,0x1B,0x23,0xA8,0x00,0x01,0xFF,0x11,0x22,0xE8,0x00,0x00,0x10,0x11,0x22,0x48,0x80,0x00,0x10,0x3F,0xF1,0xE7,0x00,0x00,0x10,0x06,0x80,0x00,0x00,0x00,0x10,0x0C,0x41,0x49,0x00,0x03,0xFF,0x38,0x32,0x24,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};// 非阻塞定时变量unsignedlonglastBlink0;unsignedlonglastTempUpdate0;bool alarmStatefalse;floatcurrentTemperature0.0;bool alarmActivefalse;constlongALARM_INTERVAL200;// 开机进度条动画voidshowBootAnimation(){constinttotalSteps40;constintstepDelay50;constintbarX10;constintbarY40;constintbarWidth108;constintbarHeight8;for(intstep0;steptotalSteps;step){intpercent(step*100)/totalSteps;intfillWidth(step*barWidth)/totalSteps;display.clearDisplay();display.setTextSize(2);display.setTextColor(SSD1306_WHITE);display.setCursor(20,10);display.print(Smart);display.setCursor(15,28);display.print(Monitor);display.drawRect(barX,barY,barWidth,barHeight,SSD1306_WHITE);if(fillWidth0){display.fillRect(barX,barY,fillWidth,barHeight,SSD1306_WHITE);}display.setTextSize(1);display.setCursor(50,barY12);display.print(percent);display.print(%);display.display();delay(stepDelay);}delay(200);}voidsetup(){Serial.begin(9600);pinMode(BUZZER_PIN,OUTPUT);digitalWrite(BUZZER_PIN,LOW);pinMode(LED_PIN,OUTPUT);digitalWrite(LED_PIN,LOW);sensors.begin();if(!display.begin(SSD1306_SWITCHCAPVCC,0x3C)){Serial.println(F(SSD1306 初始化失败));for(;;);}display.clearDisplay();showBootAnimation();display.clearDisplay();}voidloop(){unsignedlongnowmillis();if(now-lastTempUpdate1000){lastTempUpdatenow;sensors.requestTemperatures();currentTemperaturesensors.getTempCByIndex(0);if(currentTemperature-100){display.clearDisplay();display.setTextSize(2);display.setCursor(15,20);display.print(Sensor Err);display.display();digitalWrite(BUZZER_PIN,LOW);digitalWrite(LED_PIN,LOW);return;}alarmActive(currentTemperatureTEMP_THRESHOLD);display.clearDisplay();intnameW47;intnameH16;intnameX(128-nameW)/2;intnameY0;display.drawBitmap(nameX,nameY,bitmap_wanghuanxi,nameW,nameH,SSD1306_WHITE);display.setTextSize(1);display.setTextColor(SSD1306_WHITE);display.setCursor(30,nameY18);display.print(2506034324);display.setCursor(15,nameY38);display.print(Temp: );display.print(currentTemperature,1);display.print( C);display.setCursor(15,nameY52);if(alarmActive){display.print(ALARM! High Temp);}else{display.print(Normal Temp);}display.display();Serial.print(Temp: );Serial.print(currentTemperature,1);Serial.print( C Status: );Serial.println(alarmActive?ALARM:Normal);}if(alarmActive){if(now-lastBlinkALARM_INTERVAL){lastBlinknow;alarmState!alarmState;digitalWrite(BUZZER_PIN,alarmState);digitalWrite(LED_PIN,alarmState);}}else{digitalWrite(BUZZER_PIN,LOW);digitalWrite(LED_PIN,LOW);}}六、项目总结本项目通过 Arduino Nano 采集 DS18B20 温度数据在 SSD1306 OLED 上实时显示并实现超温蜂鸣器报警功能。项目涵盖了单总线通信、I2C 显示、汉字字模显示、数字输出控制等常用嵌入式开发技术是一个典型的传感器采集显示控制综合应用。可扩展方向增加湿度传感器如 DHT11/DHT22实现温湿度双监测添加 WiFi 模块如 ESP8266实现远程温度监控增加按键模块支持报警阈值可调记录历史温度数据绘制温度曲线](https://i-blog.csdnimg.cn/direct/a1d1d0ae49da4d0c8e0ce7d9ec5c58e6.jpeg#pic_center)