Arduino实现温度报警器功能-NANO板
前言
本项目仅在面包板上简单实现了在OLED屏幕上显示学号和姓名,并监测温度,当温度超过阈值时蜂鸣器会报警。在此基础上,我还为其添加了一个开机动画。有兴趣的小伙伴可以添加更多功能,或改成中文显示,探索更多可能。
一、硬件配置
1.Arduino NANO开发板
Arduino Nano 是一款类似Arduino UNO的开发板。区别是Nano的尺寸更加小巧。并且它是一款基于 ATmega328P的开发板,可以直插面包板。它与Uno的区别是Nano没有直流电压供电接口,同时Nano通过Mini-B USB 接口与电脑连接。
2.0.96寸蓝色4针IIC接口OLED模块显示屏(128*64点阵 SSD1315)
该显示器采用 OLED 技术,支持 SPI 和 I2C 通信来显示数据。它通过每个像素使用它的光。屏幕上几乎总共有128×64像素。在单色模式下,屏幕只有一种颜色,具体取决于 OLED 类型。由于 OLED 技术,它的显示屏始终处于明亮状态,不需要任何对比度调整。所有像素均可通过SSD1306驱动器控制。每个像素和通信信号都经过SSD1306。这种OLED显示器具有更高的图像质量、全视角、高亮度、更好的对比度、宽广的色彩范围、低功耗、更高效和可靠。主要应用于电脑显示器、手机、掌上游戏机、电视屏幕等数字显示设备。
3.DS18B20温度传感器
DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
4.有源蜂鸣器
有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。有源蜂鸣器内部带震荡源,所以只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。
长为正极,短为负极
注:有源和无源的区别
第一张图的蜂鸣器可以看到内部有电路板,而第二张图是浇封起来的。蜂鸣器从驱动方式上来分可以分为无源蜂鸣器和有源蜂鸣器。第一张图就是无源的,第二张图就是有源。
5.面包板和连接线
二、代码上传
// #include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define BUZZER_PIN 3
#define TEMP_THRESHOLD 30
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const String studentID = "20230001";
const String studentName = "张三";
void showStartupAnimation() {
// 清屏
display.clearDisplay();
// 从下往上填充动画
for(int y=SCREEN_HEIGHT; y>=0; y-=4) {
display.clearDisplay();
display.fillRect(0, y, SCREEN_WIDTH, SCREEN_HEIGHT-y, SSD1306_WHITE);
display.display();
delay(20);
}
// 显示欢迎信息
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 20);
display.println("Welcome");
display.display();
delay(1000);
// 缩小文字效果
for(int size=3; size>=1; size--) {
display.clearDisplay();
display.setTextSize(size);
display.setCursor(10, 20);
display.println("Loading...");
display.display();
delay(300);
}
// 进度条动画
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("System Initializing");
for(int i=0; i<=SCREEN_WIDTH; i+=5) {
display.drawRect(0, 20, SCREEN_WIDTH, 10, SSD1306_WHITE);
display.fillRect(0, 20, i, 10, SSD1306_WHITE);
display.display();
delay(50);
}
delay(500);
}
void setup() {
Serial.begin(9600);
// 初始化OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// 显示开机动画
showStartupAnimation();
// 初始化温度传感器
sensors.begin();
// 初始化蜂鸣器
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
}
void loop() {
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
if(tempC == DEVICE_DISCONNECTED_C) {
Serial.println("Error: Could not read temperature data");
return;
}
if(tempC > TEMP_THRESHOLD) {
digitalWrite(BUZZER_PIN, HIGH);
delay(100);
digitalWrite(BUZZER_PIN, LOW);
delay(100);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
displayInfo(tempC);
delay(1000);
}
void displayInfo(float temperature) {
display.clearDisplay();
// 显示学号
display.setTextSize(1);
display.setCursor(0, 0);
display.print("ID: ");
display.println(studentID);
// 显示姓名
display.setCursor(0, 16);
display.print("Name: ");
display.println(studentName);
// 显示温度
display.setCursor(0, 32);
display.print("Temp: ");
display.print(temperature);
display.println(" C");
// 温度警告
if(temperature > TEMP_THRESHOLD) {
display.setTextSize(1);
display.setCursor(0, 48);
display.print("WARNING! High Temp!");
}
display.display();
}
1.使用说明
1.将上述代码上传到Arduino NANO板
2.确保所有硬件连接正确
3.上电后OLED会显示初始化信息,然后显示学号、姓名和当前温度
4.当温度超过30℃(可在代码中修改TEMP_THRESHOLD值)时,蜂鸣器会发出报警声,并且OLED显示警告信息
2.自定义设置
1.修改学号和姓名
const String studentID = "20230001"; // 改为你的学号
const String studentName = "张三"; // 改为你的姓名
2.修改温度报警阈值
#define TEMP_THRESHOLD 30 // 改为你想要的报警温度
3.如果需要更长的蜂鸣器报警时间,可以修改报警部分的代码
3.注意事项
1.DS18B20需要4.7kΩ的上拉电阻
2.OLED的I2C地址通常是0x3C,如果无法显示,尝试改为0x3D
3.蜂鸣器分有源和无源两种,本代码适用于有源蜂鸣器
三、接线
OLED | NANO |
---|---|
SDA | A4 |
SCL(SCK) | A5 |
VCC(VDD) | 3V3 |
GND | GND |
DS18B20 | NANO |
---|---|
DQ | D2 |
VCC(VDD) | 5V |
GND | GND |
蜂鸣器 | NANO |
---|---|
正极 | D3 |
负极 | GND |
这里的GND有三处接线端,超过了NANO板本身GND端口数量,因此我引用了面包板,将NANO板的一个GND引脚引入到面包板上,再依次连接DS18B20和蜂鸣器,这样就可以完整实现代码功能了。
接线图如下
四、成品展示
温度警报器