基于AVR64DD32的温度报警系统
该项目使用Grove - Temperature Sensor温度传感器模块检测环境温度,当温度超过设定阈值时,通过DFRobot数字蜂鸣器模块发出警报。
标签
嵌入式系统
Funpack活动
数字逻辑
退役熬夜选手
更新2023-05-06
802

一、项目描述

该项目使用Grove - Temperature Sensor温度传感器模块检测环境温度,当温度超过设定阈值时,通过DFRobot数字蜂鸣器模块发出警报。传感器采集的温度数据通过模拟输入口连接至Arduino控制板,Arduino控制板通过PWM输出口控制DFRobot数字蜂鸣器模块的发声频率和持续时间,实现警报功能。温度监控系统的阈值可以通过修改Arduino代码中的变量进行设置,用户可以根据需要调整阈值。本项目使用PlatformIO作为开发工具,能够方便地进行编译、调试和上传操作。

该系统可以广泛应用于家庭、实验室等需要进行温度监控的场景,如监控宠物窝的温度、实验室仪器的温度等。其优点包括操作简单、精度高、实时性好、易于维护等。

二、代码说明

本项目硬件部分接线图如下:

image1795

本项目基于Arduino框架,主要是用于实现温度监控系统的功能。以下是代码的详细说明:

#define F_CPU 24000000
​
#include <Arduino.h>
​
const int B = 4275;                // B value of the thermistor
const int R0 = 100000;             // R0 = 100k
const int pinTempSensor = PIN_PD1; // Grove - Temperature Sensor connect to A0
#define LedPin   PIN_PF5
#define BuzzePin PIN_PF4
void setup()
{
  // 将时钟设置为 24MHz
  CCP = CCP_IOREG_gc;
  CLKCTRL.OSCHFCTRLA = CLKCTRL_FREQSEL_24M_gc;
  // 初始化串口通信,波特率为115200
  Serial1.begin(115200);
  // 初始化BuzzePin和LedPin引脚为输出模式
  pinMode(BuzzePin, OUTPUT);
  pinMode(LedPin, OUTPUT);
  // 开启全局中断
  sei();
}
​
​
void loop()
{
  int a = analogRead(pinTempSensor); // 读取模拟输入的温度传感器数值
​
  float R = 1023.0 / a - 1.0;
  R = R0 * R; // 根据模拟输入的数值计算出热敏电阻的阻值
​
  float temperature = 1.0 / (log(R / R0) / B + 1 / 298.15) - 275.15; // 通过热敏电阻的阻值计算出温度
​
  Serial1.print("temperature = "); // 串口输出
  Serial1.println(temperature);
  if (temperature > 30) { // 判断温度是否超过阈值
    digitalWrite(BuzzePin, HIGH); // 开启蜂鸣器
    digitalWrite(LedPin, HIGH); // 开启LED指示灯
  }
  else {
    digitalWrite(BuzzePin, LOW); // 关闭蜂鸣器
    digitalWrite(LedPin, LOW); // 关闭LED指示灯
  }
  delay(100); // 延时100毫秒
}

第一行代码#define F_CPU 24000000用于定义芯片的主频为24MHz。

const int B = 4275const int R0 = 100000分别定义了热敏电阻的B值和标准电阻值。

const int pinTempSensor = PIN_PD1定义了Grove - Temperature Sensor温度传感器模块的引脚连接到AVR64DD32控制板的D1引脚上。

#define LedPin PIN_PF5#define BuzzePin PIN_PF4分别定义了数字LED灯和数字蜂鸣器模块的引脚连接。

void setup()函数用于进行系统初始化操作,包括设置时钟频率为24MHz、初始化串口通信、设置数字LED灯和数字蜂鸣器模块的引脚连接方式等。

void loop()函数用于实现主要的温度监控功能。首先通过analogRead(pinTempSensor)函数读取模拟输入引脚的电压值,然后根据公式计算出当前的温度值。如果温度值超过30℃,则通过digitalWrite(BuzzePin, HIGH)digitalWrite(LedPin, HIGH)打开数字蜂鸣器和数字LED灯,发出警报信号。否则关闭数字蜂鸣器和数字LED灯。

在代码的最后,通过delay(100)函数实现每隔100毫秒进行一次温度检测。

三、功能展示

3.1 串口温度打印

在代码中,串口打印温度的部分使用了Arduino库中的Serial1对象,该对象可以通过串口连接到计算机或其他设备,将数据传输出来进行调试或记录。

具体地,我们使用Serial1print()println()函数将温度信息输出到串口。在setup()函数中,我们使用Serial1.begin()函数初始化串口的波特率为115200。在loop()函数中,我们先使用analogRead()函数读取温度传感器的模拟值,然后根据公式计算出实际温度。最后,我们使用Serial1.print()Serial1.println()函数将温度信息输出到串口。

在实际使用中,我们可以通过连接串口线将开发板和电脑连接起来,在串口监视器软件中实时查看温度信息。这样可以方便我们进行调试和测试,确保温度传感器能够正常工作。

image-20230401160507736

3.2 温度报警

在本项目中,我们使用温度传感器检测环境温度,并且当温度超过一定阈值时,通过蜂鸣器和LED灯发出报警信号。这部分代码主要集中在loop()函数中的条件语句中。

loop()函数中,我们首先使用analogRead()函数读取温度传感器的模拟值,并根据公式计算出实际温度。然后,我们通过判断温度是否超过设定的阈值(在本项目中设定为30摄氏度)来决定是否发出报警信号。如果温度超过了阈值,我们就通过digitalWrite()函数将蜂鸣器和LED灯设置为高电平,发出报警信号;否则,将蜂鸣器和LED灯设置为低电平,停止报警。

具体来说,在代码中,我们通过digitalWrite()函数控制BuzzePinLedPin引脚的电平,让它们分别控制蜂鸣器和LED灯的开关。当温度超过阈值时,digitalWrite(BuzzePin, HIGH)digitalWrite(LedPin, HIGH)会将BuzzePinLedPin引脚的电平设置为高电平,从而开启蜂鸣器和LED灯;当温度低于阈值时,digitalWrite(BuzzePin, LOW)digitalWrite(LedPin, LOW)会将BuzzePinLedPin引脚的电平设置为低电平,从而关闭蜂鸣器和LED灯。

这样,当环境温度超过一定阈值时,我们就可以及时发现并采取相应措施,以避免温度过高导致设备损坏或者安全事故发生。

四、心得体会

本项目使用Arduino开发较为简单,但是可以通过增加模块实现一些进一步的功能,以下是一些可能的改进方向。

  1. 添加LCD显示模块,以便更直观地显示当前温度和报警状态。

  2. 添加一个WiFi模块或者蓝牙模块,使得可以通过手机或者电脑远程监控温度变化和报警状态。

  3. 将系统扩展为可以同时监控多个温度传感器,以便对更大范围的温度变化进行监控。

  4. 添加存储功能,以记录历史温度数据并进行分析。

  5. 添加自适应报警功能,根据历史数据和当前趋势来判断报警阈值和报警方式。

  6. 添加能耗管理功能,比如通过进一步优化代码、降低运行频率等方式来减少系统能耗,延长电池寿命等。

  7. 对硬件进行优化,比如优化供电、增加抗干扰能力、减小尺寸等。

  8. 添加用户管理功能,比如通过密码保护等方式保证系统的安全性和可靠性。

  9. 添加声音和光线传感器,以便对环境噪声和亮度进行检测并进行相应的处理。

在未来,我希望能够将这个温度监控系统与其他嵌入式系统进行集成,以实现更加复杂和实用的功能。比如,将温度监控系统与灯光控制、空调控制等系统进行集成,实现自动化的温度控制。基于物联网的智能家居系统是一个快速发展的领域,我希望能够深入研究这个领域,并将温度监控系统与其他智能家居设备进行集成,以实现更加智能和便捷的家居控制。

五、问题说明

编译报错

  1. 首先需要从github下载AVR64DD32的Arduino核心,DxCore

    [DxCore - Arduino 支持 AVR DA、DB 系列和 DD 系列]  https://github.com/SpenceKonde/DxCore 

     

  2. 下载完毕后解压文件夹,同时在本地目录中找到C:\Users\***\.platformio\packages\framework-arduino-megaavr-dxcore文件夹,***为个人用户名,如下图。

    image-20230224173110341

  3. 接着修改platformio.ini如下,编译下载。

    [env:AVR64DD32]
    platform = atmelmegaavr
    ; board = AVR64DD32
    framework = arduino
    board = curiosity_nano_da
    ​
    ; change microcontroller
    board_build.mcu = avr64dd32
    ​
    ; change MCU frequency
    board_build.f_cpu = 24000000L

    编译成功,下载过程中会遇到:

    C:\Users\***\.platformio\packages\framework-arduino-megaavr-dxcore\cores\dxcore\wiring.c: In function 'init_TCBs':
    C:\Users\***\.platformio\packages\framework-arduino-megaavr-dxcore\variants\48pin-standard/pins_arduino.h:123:19: error: 'PORTMUX_TCB3_bm' undeclared (first use in this function); did you mean 'PORTMUX_TCB0_bm'?
    #define TCB3_PINS PORTMUX_TCB3_bm           // TCB3 output on PC1 instead of PB5 (default)
                      ^
    C:\Users\***\.platformio\packages\framework-arduino-megaavr-dxcore\cores\dxcore\wiring.c:1983:27: note: in expansion of macro 'TCB3_PINS'
                            | TCB3_PINS
                              ^~~~~~~~~
    C:\Users\***\.platformio\packages\framework-arduino-megaavr-dxcore\variants\48pin-standard/pins_arduino.h:123:19: note: each undeclared identifier is reported only once for each function it appears in
    #define TCB3_PINS PORTMUX_TCB3_bm           // TCB3 output on PC1 instead of PB5 (default)
                      ^
    C:\Users\***\.platformio\packages\framework-arduino-megaavr-dxcore\cores\dxcore\wiring.c:1983:27: note: in expansion of macro 'TCB3_PINS'
                            | TCB3_PINS
                              ^~~~~~~~~
    *** [.pio\build\AVR64DD32\FrameworkArduino\wiring.c.o] Error 1

    需要修改C:\Users\***\.platformio\packages\framework-arduino-megaavr-dxcore\variants\48pin-standard/pins_arduino.h文件(注意***用户名),将#define TCB3_PINS PORTMUX_TCB3_bm修改为#define TCB3_PINS 0x08,即可编译成功。

 
附件下载
基于AVR64DD32的温度报警系统.zip
源码
团队介绍
退役的熬夜选手
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号