# 2.6.1 温度报警器

## 2.6.1.1 简介

当温度超过设置的阈值时，语音模块就会发出警告提示音 "警告，温度过高，当前温度是“xx”摄氏度"，在我们需要对温度预警时便能用到它了。

## 2.6.1.2 控制指令表

**消息号表：**

| 消息号 |               播报语音               |
| :----: | :----------------------------------: |
|   9    | 警告，温度过高，当前温度为“xx”摄氏度 |

## 2.6.1.3 接线图

![a74](./media/a74.png)

## 2.6.1.4 代码

```c
// 引入库
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// 创建软串口对象，使用A5作为RX引脚接收数据，A4作为TX引脚发送数据
SoftwareSerial mySerial(A5, A4);

// 定义变量用于存储从语音模块接收到的控制码
volatile int Voice_Control = 0;  // 初始化为0，确保首次判断时不触发任何指令


// 定义传感器连接的引脚号
int DS18b20Pin = 3;

OneWire DS18B20_Sensor(DS18b20Pin);
DallasTemperature DS18B20(&DS18B20_Sensor);

/*
 函数功能：通过串口发送具有固定帧格式的数据包
 数据包格式：帧头(0xAA 0x55) + 消息号数据 + 数据1 + 数据2 + 帧尾(0x55 0xAA)
 
 输入参数说明：
  ---Message_Number ：消息号，用于标识命令类型   <必需填写>
  ---data1 ：第一个数据参数  <如果没有数据就输入0>
  ---data2 ：第二个数据参数  <如果没有数据就输入0>
 */
void Uart_SendCmd(int Message_Number, int data1, int data2) {
  // 发送帧头：固定字节0xAA和0x55，用于标识数据包的开始
  mySerial.write(0XAA);
  mySerial.write(0X55);

  // 发送消息号，标识具体的命令类型
  mySerial.write(Message_Number);

  // 发送两个数据参数
  mySerial.write(data1);
  mySerial.write(data2);

  // 发送帧尾：固定字节0x55和0xAA，用于标识数据包的结束
  mySerial.write(0X55);
  mySerial.write(0XAA);
}

void setup() {
  // 初始化硬件串口，用于调试和监控，波特率9600
  Serial.begin(9600);

  // 初始化软串口，用于与语音模块通信，波特率9600
  mySerial.begin(9600);
  //初始化DS18B20
  DS18B20.begin();
}

void loop() {
  //读取18B20传感器数据
  DS18B20.requestTemperatures();
  float Temp = DS18B20.getTempCByIndex(0);
  Serial.println("T:" + String(Temp));
  delay(500);
  // 持续检查软串口是否有来自语音模块的数据
  while (mySerial.available()) {
    // 读取一个字节的数据
    Voice_Control = mySerial.read();

    // 将接收到的数据通过硬件串口输出，便于调试和监控
    Serial.println(Voice_Control);
  }

  //判断温度是否大于25摄氏度
  if (Temp > 25) {
    //发送消息号9以及温度数据
    Uart_SendCmd(9, Temp, 0);
  }
}
```



## 2.6.1.5 代码说明

① 添加库文件，设置模拟串口引脚为RX：A5，TX：A4，设置传感器引脚

② 搭建发送消息号函数

```c
void Uart_SendCmd(int Message_Number, int data1, int data2)
```

③ 设置串口以及模拟串口的波特率为`9600`，初始化DS18B20库代码

④ 读取DS18B20温度数据并赋值给变量`Temp`，使用串口打印变量`Tenp`方便监控温度数据，延时500毫秒

⑥ 使用`if`判断变量`Temp`中的温度值进行判断是否大于25，如果大于25就发送播报警告的消息号以及温度数据给语音模块，语音模块便会播报出“警告，温度过高，当前温度为"xx"摄氏度”，延时10s钟目的是在警报触发的时候每10秒才发出一次警告播报。（注意：温度值的是可以自行调节的你可以调节到你想要的温度值，当前温度值是方便课程实验现象展示）

## 2.6.1.6 代码结果

上传测试代码成功，打开串口查看打印的温度值，如果温度低于25摄氏度就可以用手握住加热使他高于25摄氏度，如果高于25摄氏度则可以调整温度值为高于你当前环境温度值2摄氏度的样子以便于你现象展示，课程代码当温度高于25摄氏度时，就会发出温度警报提示“警告，温度过高，当前温度是 xx 摄氏度”

