對于醫療或臨床應用,測量人體溫度是確定任何個人健康狀況的重要參數。然而,有很多方法可以感知溫度,但并非所有方法都具有滿足臨床測溫規范的準確度。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);
}
評論