一、项目描述
该项目使用Grove - Temperature Sensor温度传感器模块检测环境温度,当温度超过设定阈值时,通过DFRobot数字蜂鸣器模块发出警报。传感器采集的温度数据通过模拟输入口连接至Arduino控制板,Arduino控制板通过PWM输出口控制DFRobot数字蜂鸣器模块的发声频率和持续时间,实现警报功能。温度监控系统的阈值可以通过修改Arduino代码中的变量进行设置,用户可以根据需要调整阈值。本项目使用PlatformIO作为开发工具,能够方便地进行编译、调试和上传操作。
该系统可以广泛应用于家庭、实验室等需要进行温度监控的场景,如监控宠物窝的温度、实验室仪器的温度等。其优点包括操作简单、精度高、实时性好、易于维护等。
二、代码说明
本项目硬件部分接线图如下:
本项目基于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 = 4275
和const 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对象,该对象可以通过串口连接到计算机或其他设备,将数据传输出来进行调试或记录。
具体地,我们使用Serial1
的print()
和println()
函数将温度信息输出到串口。在setup()
函数中,我们使用Serial1.begin()
函数初始化串口的波特率为115200。在loop()
函数中,我们先使用analogRead()
函数读取温度传感器的模拟值,然后根据公式计算出实际温度。最后,我们使用Serial1.print()
和Serial1.println()
函数将温度信息输出到串口。
在实际使用中,我们可以通过连接串口线将开发板和电脑连接起来,在串口监视器软件中实时查看温度信息。这样可以方便我们进行调试和测试,确保温度传感器能够正常工作。
3.2 温度报警
在本项目中,我们使用温度传感器检测环境温度,并且当温度超过一定阈值时,通过蜂鸣器和LED灯发出报警信号。这部分代码主要集中在loop()
函数中的条件语句中。
在loop()
函数中,我们首先使用analogRead()
函数读取温度传感器的模拟值,并根据公式计算出实际温度。然后,我们通过判断温度是否超过设定的阈值(在本项目中设定为30摄氏度)来决定是否发出报警信号。如果温度超过了阈值,我们就通过digitalWrite()
函数将蜂鸣器和LED灯设置为高电平,发出报警信号;否则,将蜂鸣器和LED灯设置为低电平,停止报警。
具体来说,在代码中,我们通过digitalWrite()
函数控制BuzzePin
和LedPin
引脚的电平,让它们分别控制蜂鸣器和LED灯的开关。当温度超过阈值时,digitalWrite(BuzzePin, HIGH)
和digitalWrite(LedPin, HIGH)
会将BuzzePin
和LedPin
引脚的电平设置为高电平,从而开启蜂鸣器和LED灯;当温度低于阈值时,digitalWrite(BuzzePin, LOW)
和digitalWrite(LedPin, LOW)
会将BuzzePin
和LedPin
引脚的电平设置为低电平,从而关闭蜂鸣器和LED灯。
这样,当环境温度超过一定阈值时,我们就可以及时发现并采取相应措施,以避免温度过高导致设备损坏或者安全事故发生。
四、心得体会
本项目使用Arduino开发较为简单,但是可以通过增加模块实现一些进一步的功能,以下是一些可能的改进方向。
-
添加LCD显示模块,以便更直观地显示当前温度和报警状态。
-
添加一个WiFi模块或者蓝牙模块,使得可以通过手机或者电脑远程监控温度变化和报警状态。
-
将系统扩展为可以同时监控多个温度传感器,以便对更大范围的温度变化进行监控。
-
添加存储功能,以记录历史温度数据并进行分析。
-
添加自适应报警功能,根据历史数据和当前趋势来判断报警阈值和报警方式。
-
添加能耗管理功能,比如通过进一步优化代码、降低运行频率等方式来减少系统能耗,延长电池寿命等。
-
对硬件进行优化,比如优化供电、增加抗干扰能力、减小尺寸等。
-
添加用户管理功能,比如通过密码保护等方式保证系统的安全性和可靠性。
-
添加声音和光线传感器,以便对环境噪声和亮度进行检测并进行相应的处理。
在未来,我希望能够将这个温度监控系统与其他嵌入式系统进行集成,以实现更加复杂和实用的功能。比如,将温度监控系统与灯光控制、空调控制等系统进行集成,实现自动化的温度控制。基于物联网的智能家居系统是一个快速发展的领域,我希望能够深入研究这个领域,并将温度监控系统与其他智能家居设备进行集成,以实现更加智能和便捷的家居控制。
五、问题说明
编译报错
-
首先需要从github下载AVR64DD32的Arduino核心,DxCore
[DxCore - Arduino 支持 AVR DA、DB 系列和 DD 系列] https://github.com/SpenceKonde/DxCore -
下载完毕后解压文件夹,同时在本地目录中找到
C:\Users\***\.platformio\packages\framework-arduino-megaavr-dxcore
文件夹,***为个人用户名,如下图。 -
接着修改
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
,即可编译成功。