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.蜂鸣器分有源和无源两种,本代码适用于有源蜂鸣器


三、接线

OLEDNANO
SDAA4
SCL(SCK)A5
VCC(VDD)3V3
GNDGND
DS18B20NANO
DQD2
VCC(VDD)5V
GNDGND
蜂鸣器NANO
正极D3
负极GND

这里的GND有三处接线端,超过了NANO板本身GND端口数量,因此我引用了面包板,将NANO板的一个GND引脚引入到面包板上,再依次连接DS18B20和蜂鸣器,这样就可以完整实现代码功能了。
在这里插入图片描述
接线图如下
在这里插入图片描述

四、成品展示

温度警报器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值