风筝
发表于: 2020-8-24 20:47:50 | 显示全部楼层

在医学或临床应用中,测量人体温度是确定健康状况的重要参数。有很多方法可以感测温度,但并非所有方法都具有满足临床测温规范的准确性。 MAX30205温度传感器是专门为该应用而设计的。请注意,该传感器不是非接触式温度传感器,如果您正在寻找非接触式红外测量温度,请查看我们之前设计的MLX90614温度计


在本篇文章中,我们将连接一个MAX30205人体温度传感器,该传感器可轻松连接到健身手环或用于医疗目的。我们将使用Arduino Nano作为主要的微控制器单元,还将使用7段数码管来显示华氏温度。一旦知道了如何使用传感器,您就可以在任何喜欢的应用程序中使用它。


所需的组件

●     Arduino Nano开发板

●     共阴极7段数码管

●     74HC595

●     MAX30205模块扩展板

●     5V电源

●     面包板

●     Arduino IDE

MAX30205-with-Arduino.jpg


Arduino连接MAX30205的电路图

Arduino开发板与体温传感器MAX30205连接的完整电路图如下所示。电路非常简单,但是由于我们使用了7段数码管,因此看起来有点复杂。使用Arduino连接7段数码管一种成本非常低且亮度高的好方法。您也可以根据需要在OLED或LCD上显示这些值。

Arduino-Body-Temperature-Meter-Circuit-Diagram.png


Arduino Nano连接了三个74HC595。三个74HC595级联在一起,以节省来自Arduino Nano的其他输出引脚,用于连接三个7段数码管。

MAX30205模块扩展板通过I2C协议通信,因此需要额外的上拉电阻。但是,有些模块不需要额外的上拉电阻,因为模块内部已经提供了上拉电阻。因此,需要确认模块板上是否具有内部上拉电阻,或者是否需要额外的外部上拉电阻。


Arduino与MAX30205体温传感器的连接

此处使用的传感器是美信公司的MAX30205。 MAX30205温度传感器以0.1°C的精度(37°C至39°C)准确测量温度。该传感器使用I2C协议。

Interfacing-Arduino-with-MAX30205.jpg


该模块板可以在5V或3.3V电压下工作。但是,该板配置为在5V工作电压下使用。它还具有逻辑电平转换器,因为传感器本身支持最大3.3V的电压。


在输出上,三个74HC595、8位移位寄存器用于将三个7段数码管与Arduino NANO连接。引脚图如下图所示:

74HC595-IC.jpg


下表中列出了74HC595的引脚说明-

74HC595-Pin-description.png


QA至QH是与7段数码管连接的数据输出引脚。由于三个74HC595级联在一起,因此第一个移位寄存器的数据输入引脚(PIN14)将与Arduino NANO连接,而串行数据输出引脚会将数据提供给下一个移位寄存器。此串行数据连接将一直持续到第三个74HC595。


Arduino使用MAX30205的程序

在本文末尾处提供了完整程序。该代码的说明如下。首先,我们包含标准的Arduino I2C库头文件。

  1. #include <Wire.h>
复制代码

接下来将包含MAX30205库,该库是由protocentral贡献的Arduino库。该库具有与MAX30205传感器通信的重要函数。以下是该库的GitHub链接:https://github.com/protocentral/ProtoCentral_MAX30205


导入库后,我们定义MAX30205对象数据,如下所示-

  1. #include "Protocentral_MAX30205.h"
  2. MAX30205 tempSensor;
复制代码

接下来的两行代码对于设置参数很重要。如果设置为真,则下一行代码将以华氏温度提供温度。为了以摄氏度显示结果,需要将该行设置为false。

  1. const bool fahrenheittemp = true; // I'm showing the temperature in Fahrenheit, If you want to show the temperature in Celsius the make this variable false.
复制代码

如果硬件中使用了共阴极7段数码管,则需要配置以下代码。

  1. const bool commonCathode = true; // I'm using common Cathode 7segment if you use common Anode then change the value into false.
  2. const byte digit_pattern[17] =
  3. {
  4.   // 74HC595 Outpin Connection with 7segment display.
  5.   // Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
  6.   // a  b  c  d  e  f  g  DP
  7.   0b11111100,  // 0
  8.   0b01100000,  // 1
  9.   0b11011010,  // 2
  10.   0b11110010,  // 3
  11.   0b01100110,  // 4
  12.   0b10110110,  // 5
  13.   0b10111110,  // 6
  14.   0b11100000,  // 7
  15.   0b11111110,  // 8
  16.   0b11110110,  // 9
  17.   0b11101110,  // A
  18.   0b00111110,  // b
  19.   0b00011010,  // C
  20.   0b01111010,  // d
  21.   0b10011110,  // E
  22.   0b10001110,  // F
  23.   0b00000001   // .
  24. };
复制代码

上面的数组用于存储7段数码管的数字模式。


在setup函数中,设置74HC595引脚的引脚模式后,将初始化I2C协议和温度传感器读数。

  1. void setup() {
  2.   // put your setup code here, to run once:
  3.   // set the serial port at 9600
  4.   Serial.begin(9600);
  5.   delay(1000);
  6.   // set the 74HC595 Control pin as output
  7.   pinMode(latchPin, OUTPUT);    //ST_CP of 74HC595
  8.   pinMode(clkPin, OUTPUT);      //SH_CP of 74HC595
  9.   pinMode(dtPin, OUTPUT);       //DS of 74HC595
  10.   // initialize I2C Libs
  11.   Wire.begin();
  12.   // start MAX30205 temperature read in continuos mode, active mode
  13.   tempSensor.begin();  
  14. }
复制代码

在loop函数中,温度由函数tempSensor.getTemperature()读取,并存储在名为temp的浮点变量中。之后,如果选择了华氏温度模式,则将数据从摄氏温度转换为华氏温度。然后,将来自转换后的感测温度数据的三位数字进一步分成三位单独的数字。

  1. // saperate 3 digits from the current temperature (like if temp = 31.23c, )
  2.   int dispDigit1=(int)temp/10;      // digit1 3
  3.   int dispDigit2=(int)temp%10;      // digit2 1
  4.   int dispDigit3=(temp*10)-((int)temp*10);  //digit3 2
复制代码

现在,使用74HC595移位寄存器将分隔的三位数字发送到7段数码管。由于LSB首先通过第三74HC595显示在第三7段数码管中,因此首先发送了第三位数字。为此,将锁存的引脚拉低,并通过函数shiftOut()将数据提交到74HC595。


同样,剩余的第二位和第一位数字也被发送到相应的74HC595,从而剩下两个7段数码管。发送完所有数据后,释放锁存引脚并将其拉高以确认数据传输结束。

  1. // display digits into 3, 7segment display.
  2.   digitalWrite(latchPin, LOW);
  3.   if(commonCathode == true){
  4.     shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit3]);
  5.     shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]);   // 1. (Digit+DP)
  6.     shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
  7.   }else{
  8.     shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit3]));
  9.     shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16]));   // 1. (Digit+DP)
  10.     shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
  11.   }
  12.   digitalWrite(latchPin, HIGH);
复制代码

测试Arduino体温计

电路在两组面包板上进行搭建,如下所示。当我们将手指放在传感器上时,将感测温度,并且输出将显示在7段数码管中,此处的值为92.1 * F。

Arduino-Body-Temperature-Meter.jpg


代码

本文使用的完整代码如下所示: main.rar (1.35 KB, 下载次数: 54)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 10:52 , Processed in 0.086657 second(s), 10 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表