对于医疗或临床应用,测量人体温度是确定任何个人健康状况的重要参数。然而,有很多方法可以感知温度,但并非所有方法都具有满足临床测温规范的准确度。MAX30205 温度传感器专为此应用而设计。
在本项目中,我们将连接一个 MAX30205 人体温度传感器,该传感器可以轻松连接健身手环或用于医疗用途。我们将使用 Arduino Nano 作为主要的微控制器单元,并使用 7 段显示器以华氏度显示感应温度。
所需组件
阿杜诺纳米
7 段显示器共阴极 - 3 个
74HC595 - 3 个
680R电阻 - 24个
MAX30205模块板
5V电源
面包板
很多连接线
Arduino IDE
一根微型 USB 数据线
带 Arduino 的 MAX30205 – 电路图
将Arduino 与体温传感器MAX30205连接的完整电路图如下所示。电路很简单,但由于我们使用的是7段显示器,所以看起来有点复杂。带有 Arduino 的 7 段显示器是一种以非常低的成本显示您的价值的好方法。但如果您愿意,也可以在 OLED 或 LCD 上显示这些值。
Arduino Nano 与三个 74HC595 相连。三个 74HC595 级联在一起,以节省 Arduino Nano 的额外输出引脚,用于连接三个 7 段显示器。我们之前曾在许多其他项目中使用74HC595 和 Arduino ,例如Arduino 时钟、LED 板显示、Arduino 蛇游戏等。
MAX30205 模块板需要额外的上拉电阻,因为它使用I2C 协议进行通信。然而,很少有模块板不需要额外的上拉电阻,因为模块内部已经提供了上拉电阻。因此,需要确认模块板是否有内部上拉电阻,或者是否需要额外的外部上拉。该项目中使用的电路板已经在模块板内内置了上拉电阻。
连接 Arduino 与 MAX30205 体温传感器
这里使用的传感器是 maxim Integrated 的 MAX30205。MAX30205 温度传感器以0.1°C 的精度(37°C 至 39°C)精确测量温度。该传感器使用 I2C 协议。
模块板可以使用 5 或 3.3V。但是,该板配置为使用 5V 工作电压。它还包括一个逻辑电平转换器,因为传感器本身支持最大 3.3V 作为电源或数据通信相关用途。
在输出端,三个 74HC595、8 位移位寄存器用于将三个 7 段显示器与 Arduino NANO 连接。引脚图如下图所示 -
74HC595的引脚说明见下表-
QA 到 QH 是与 7 段显示器相连的数据输出引脚。由于三个74HC595级联在一起,第一个移位寄存器的数据输入引脚(PIN14)将与Arduino NANO连接,串行数据输出引脚将数据提供给下一个移位寄存器。此串行数据连接将持续到第三个 74HC595。
使用 Arduino 对 MAX30205 进行编程
本教程的完整程序可以在本页底部找到。这段代码的解释如下。首先,我们包含标准的 Arduino I2C 库头文件。
#include 《Wire.h》
上述行将包括来自 protocentral 的 Arduino 贡献库。该库具有与 MAX30205 传感器通信的重要功能。该库取自以下 GitHub 链接-
https://github.com/protocentral/ProtoCentral_MAX30205
导入库后,我们定义MAX30205对象数据如下图-
#include “Protocentral_MAX30205.h”
MAX30205温度传感器;
接下来的两行对于设置参数很重要。如果设置为真,下面的行将提供华氏温度。为了以摄氏度显示结果,需要将该行设置为 false。
const bool fahrenheittemp = true; // 我以华氏度显示温度,如果你想以摄氏度显示温度,请将此变量设为 false。
如果硬件中使用的是共阴极型 7 段显示器,则需要配置下一行。如果使用共阳极,则使其为假。
const bool commonCathode = true; // 如果你使用普通阳极,我使用普通阴极 7 段然后将值更改为 false。
常量字节数字模式[17] =
{
// 74HC595 带 7 段显示器的 Outpin 连接。
// Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
// abcdefg DP
0b11111100, // 0
0b01100000, // 1
0b11011010, // 2
0b11110010, // 3
0b01100110, // 4
0b10110110, // 5
0b10111110, // 6
0b11100000, // 7
0b11111110, // 8
0b11110110, // 9
0b11101110, // 一个
0b00111110, // b
0b00011010, // C
0b01111010, // d
0b10011110, // E
0b10001110, // F
0b00000001 // 。
};
上述数组用于存储 7 段显示器的数字模式。
在 setup 函数中,设置好 74HC595 引脚的引脚模式后,初始化 I2C 协议和温度传感器读数。
无效设置(){
// 把你的设置代码放在这里,运行一次:
// 设置串口为 9600
序列号。开始(9600);
延迟(1000);
// 将 74HC595 控制引脚设置为输出
pinMode(latchPin,输出);//74HC595的ST_CP
pinMode(clkPin,输出);//74HC595的SH_CP
pinMode(dtPin,输出);//74HC595的DS
// 初始化 I2C 库
Wire.begin();
// 以连续模式启动 MAX30205 温度读取,激活模式
}
在循环中,温度由函数tempSensor.getTemperature()读取并存储在名为temp的浮点变量中。之后,如果选择华氏温度模式,则数据会从摄氏转换为华氏。然后,来自转换后的感测温度数据的三个数字被进一步分成三个单独的数字。为此,使用以下代码行 -
// 从当前温度中分离出 3 位数字(例如 if temp = 31.23c, )
int dispDigit1=(int)temp/10; // digit1 3
int dispDigit2=(int)temp%10; // digit2 1
int dispDigit3=(temp*10)-((int)temp*10); //数字3 2
现在,使用 74HC595 移位寄存器将分开的三个数字发送到 7 段显示器。由于 LSB 首先通过第三个 74HC595 显示到第三个 7 段显示器中,因此第 3 个数字首先被传输。为此,将锁存引脚拉低,并通过函数shiftOut() 将数据提交给 74HC595;
以同样的方式,剩余的第二个和第一个数字也被发送到各自的 74HC595,从而剩下两个 7 段显示器。发送完所有数据后,释放锁存引脚并拉高以确认数据传输结束。相应的代码如下所示 -
// 将数字显示成 3、7 段显示。
数字写入(latchPin,低);
如果(普通阴极 == 真){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit3]);
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (数字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
}别的{
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit3]));
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16])); // 1. (数字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
Arduino 体温计 – 测试
该电路由两组面包板构成,如下所示。当我们将手指放在传感器上时,会感应到温度并将输出显示为 7 段显示器,这里的值为 92.1*F。
/*
* 此程序在 3、7 段显示器上打印温度
* 硬件连接(Breakoutboard 到 Arduino Nano):
* Vin - 5V(允许 3.3V)
* 地线 - 地线
* MAX30205 SDA - A4
* MAX30205 SCL-A5
* 74HC595 ST_CP - D5
* 74HC595 SH_CP - D6
* 74HC595 DS - D7
*
*/
#include
#include "Protocentral_MAX30205.h" // Arduino 贡献库 (https://github.com/protocentral/ProtoCentral_MAX30205)
//定义MAX30205 objectData
MAX30205温度传感器;
// 显示华氏温度
const bool fahrenheittemp = true; // 我以华氏温度显示温度,如果你想以摄氏度显示温度,则将此变量设为 false。
// 设置7segment类型(普通Cathode或Anode)
const bool commonCathode = true; // 如果你使用普通阳极,我使用普通阴极 7 段然后将值更改为 false。
// 用于 7 段显示的字母数字模式
常量字节数字模式[17] =
{
// 74HC595 输出连接,带 7 段显示器。
// Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
// abcdefg DP
0b11111100, // 0
0b01100000, // 1
0b11011010, // 2
0b11110010, // 3
0b01100110, // 4
0b10110110, // 5
0b10111110, // 6
0b11100000, // 7
0b11111110, // 8
0b11110110, // 9
0b11101110, // 一个
0b00111110, // b
0b00011010, // C
0b01111010, // d
0b10011110, // E
0b10001110, // F
0b00000001 // .
};
//引脚连接到74HC595的ST_CP
int 闩锁销 = 5;
//引脚连接到74HC595的SH_CP
int clkPin = 6;
//引脚连接到74HC595的DS
int dtPin = 7;
无效设置(){
// 把你的设置代码放在这里,运行一次:
// 设置串口为 9600
序列号.开始(9600);
延迟(1000);
// 将 74HC595 控制引脚设置为输出
pinMode(latchPin,输出);//74HC595的ST_CP
pinMode(clkPin,输出);//74HC595的SH_CP
pinMode(dtPin,输出);//74HC595的DS
// 初始化 I2C 库
Wire.begin();
// 以连续模式、主动模式启动 MAX30205 温度读取
tempSensor.begin();
}
无效循环(){
浮动温度 = tempSensor.getTemperature(); // 每 5ms 读取一次温度
如果(华氏温度 == 真){
温度 = (温度 * 1.8) + 32 ; // 使用公式 [ T(°C) × 1.8 + 32 ] 将温度从摄氏度转换为法伦海特
Serial.print(temp ,2);
Serial.println("°f");
}别的{
Serial.print(temp ,2);
序列号.println("°c");
}
// 从当前温度中分离出 3 位数字(例如 if temp = 31.23c, )
int dispDigit1=(int)temp/10;// 数字1 3
int dispDigit2=(int)temp%10; // 数字2 1
int dispDigit3=(temp*10)-((int)temp*10); //数字3 2
/*
序列号.print(temp);
序列号.print("");
Serial.print(dispDigit1);
序列号.print("");
Serial.print(dispDigit2);
序列号.print("");
Serial.println(dispDigit3);
*/
// 将数字显示成 3、7 段显示。
数字写入(latchPin,低);
如果(普通阴极 == 真){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit3]);
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (数字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
}别的{
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit3]));
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16])); // 1. (数字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
延迟(500);
}
评论
查看更多