對(duì)于醫(yī)療或臨床應(yīng)用,測(cè)量人體溫度是確定任何個(gè)人健康狀況的重要參數(shù)。然而,有很多方法可以感知溫度,但并非所有方法都具有滿足臨床測(cè)溫規(guī)范的準(zhǔn)確度。MAX30205 溫度傳感器專為此應(yīng)用而設(shè)計(jì)。
在本項(xiàng)目中,我們將連接一個(gè) MAX30205 人體溫度傳感器,該傳感器可以輕松連接健身手環(huán)或用于醫(yī)療用途。我們將使用 Arduino Nano 作為主要的微控制器單元,并使用 7 段顯示器以華氏度顯示感應(yīng)溫度。
所需組件
阿杜諾納米
7 段顯示器共陰極 - 3 個(gè)
74HC595 - 3 個(gè)
680R電阻 - 24個(gè)
MAX30205模塊板
5V電源
面包板
很多連接線
Arduino IDE
一根微型 USB 數(shù)據(jù)線
帶 Arduino 的 MAX30205 – 電路圖
將Arduino 與體溫傳感器MAX30205連接的完整電路圖如下所示。電路很簡單,但由于我們使用的是7段顯示器,所以看起來有點(diǎn)復(fù)雜。帶有 Arduino 的 7 段顯示器是一種以非常低的成本顯示您的價(jià)值的好方法。但如果您愿意,也可以在 OLED 或 LCD 上顯示這些值。
Arduino Nano 與三個(gè) 74HC595 相連。三個(gè) 74HC595 級(jí)聯(lián)在一起,以節(jié)省 Arduino Nano 的額外輸出引腳,用于連接三個(gè) 7 段顯示器。我們之前曾在許多其他項(xiàng)目中使用74HC595 和 Arduino ,例如Arduino 時(shí)鐘、LED 板顯示、Arduino 蛇游戲等。
MAX30205 模塊板需要額外的上拉電阻,因?yàn)樗褂?a href="http://www.1cnz.cn/tags/i2c/" target="_blank">I2C 協(xié)議進(jìn)行通信。然而,很少有模塊板不需要額外的上拉電阻,因?yàn)槟K內(nèi)部已經(jīng)提供了上拉電阻。因此,需要確認(rèn)模塊板是否有內(nèi)部上拉電阻,或者是否需要額外的外部上拉。該項(xiàng)目中使用的電路板已經(jīng)在模塊板內(nèi)內(nèi)置了上拉電阻。
連接 Arduino 與 MAX30205 體溫傳感器
這里使用的傳感器是 maxim Integrated 的 MAX30205。MAX30205 溫度傳感器以0.1°C 的精度(37°C 至 39°C)精確測(cè)量溫度。該傳感器使用 I2C 協(xié)議。
模塊板可以使用 5 或 3.3V。但是,該板配置為使用 5V 工作電壓。它還包括一個(gè)邏輯電平轉(zhuǎn)換器,因?yàn)閭鞲衅鞅旧碇С肿畲?3.3V 作為電源或數(shù)據(jù)通信相關(guān)用途。
在輸出端,三個(gè) 74HC595、8 位移位寄存器用于將三個(gè) 7 段顯示器與 Arduino NANO 連接。引腳圖如下圖所示 -
74HC595的引腳說明見下表-
QA 到 QH 是與 7 段顯示器相連的數(shù)據(jù)輸出引腳。由于三個(gè)74HC595級(jí)聯(lián)在一起,第一個(gè)移位寄存器的數(shù)據(jù)輸入引腳(PIN14)將與Arduino NANO連接,串行數(shù)據(jù)輸出引腳將數(shù)據(jù)提供給下一個(gè)移位寄存器。此串行數(shù)據(jù)連接將持續(xù)到第三個(gè) 74HC595。
使用 Arduino 對(duì) MAX30205 進(jìn)行編程
本教程的完整程序可以在本頁底部找到。這段代碼的解釋如下。首先,我們包含標(biāo)準(zhǔn)的 Arduino I2C 庫頭文件。
#include 《Wire.h》
上述行將包括來自 protocentral 的 Arduino 貢獻(xiàn)庫。該庫具有與 MAX30205 傳感器通信的重要功能。該庫取自以下 GitHub 鏈接-
https://github.com/protocentral/ProtoCentral_MAX30205
導(dǎo)入庫后,我們定義MAX30205對(duì)象數(shù)據(jù)如下圖-
#include “Protocentral_MAX30205.h”
MAX30205溫度傳感器;
接下來的兩行對(duì)于設(shè)置參數(shù)很重要。如果設(shè)置為真,下面的行將提供華氏溫度。為了以攝氏度顯示結(jié)果,需要將該行設(shè)置為 false。
const bool fahrenheittemp = true; // 我以華氏度顯示溫度,如果你想以攝氏度顯示溫度,請(qǐng)將此變量設(shè)為 false。
如果硬件中使用的是共陰極型 7 段顯示器,則需要配置下一行。如果使用共陽極,則使其為假。
const bool commonCathode = true; // 如果你使用普通陽極,我使用普通陰極 7 段然后將值更改為 false。
常量字節(jié)數(shù)字模式[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, // 一個(gè)
0b00111110, // b
0b00011010, // C
0b01111010, // d
0b10011110, // E
0b10001110, // F
0b00000001 // 。
};
上述數(shù)組用于存儲(chǔ) 7 段顯示器的數(shù)字模式。
在 setup 函數(shù)中,設(shè)置好 74HC595 引腳的引腳模式后,初始化 I2C 協(xié)議和溫度傳感器讀數(shù)。
無效設(shè)置(){
// 把你的設(shè)置代碼放在這里,運(yùn)行一次:
// 設(shè)置串口為 9600
序列號(hào)。開始(9600);
延遲(1000);
// 將 74HC595 控制引腳設(shè)置為輸出
pinMode(latchPin,輸出);//74HC595的ST_CP
pinMode(clkPin,輸出);//74HC595的SH_CP
pinMode(dtPin,輸出);//74HC595的DS
// 初始化 I2C 庫
Wire.begin();
// 以連續(xù)模式啟動(dòng) MAX30205 溫度讀取,激活模式
}
在循環(huán)中,溫度由函數(shù)tempSensor.getTemperature()讀取并存儲(chǔ)在名為temp的浮點(diǎn)變量中。之后,如果選擇華氏溫度模式,則數(shù)據(jù)會(huì)從攝氏轉(zhuǎn)換為華氏。然后,來自轉(zhuǎn)換后的感測(cè)溫度數(shù)據(jù)的三個(gè)數(shù)字被進(jìn)一步分成三個(gè)單獨(dú)的數(shù)字。為此,使用以下代碼行 -
// 從當(dāng)前溫度中分離出 3 位數(shù)字(例如 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); //數(shù)字3 2
現(xiàn)在,使用 74HC595 移位寄存器將分開的三個(gè)數(shù)字發(fā)送到 7 段顯示器。由于 LSB 首先通過第三個(gè) 74HC595 顯示到第三個(gè) 7 段顯示器中,因此第 3 個(gè)數(shù)字首先被傳輸。為此,將鎖存引腳拉低,并通過函數(shù)shiftOut() 將數(shù)據(jù)提交給 74HC595;
以同樣的方式,剩余的第二個(gè)和第一個(gè)數(shù)字也被發(fā)送到各自的 74HC595,從而剩下兩個(gè) 7 段顯示器。發(fā)送完所有數(shù)據(jù)后,釋放鎖存引腳并拉高以確認(rèn)數(shù)據(jù)傳輸結(jié)束。相應(yīng)的代碼如下所示 -
// 將數(shù)字顯示成 3、7 段顯示。
數(shù)字寫入(latchPin,低);
如果(普通陰極 == 真){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit3]);
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (數(shù)字+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. (數(shù)字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
Arduino 體溫計(jì) – 測(cè)試
該電路由兩組面包板構(gòu)成,如下所示。當(dāng)我們將手指放在傳感器上時(shí),會(huì)感應(yīng)到溫度并將輸出顯示為 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 貢獻(xiàn)庫 (https://github.com/protocentral/ProtoCentral_MAX30205)
//定義MAX30205 objectData
MAX30205溫度傳感器;
// 顯示華氏溫度
const bool fahrenheittemp = true; // 我以華氏溫度顯示溫度,如果你想以攝氏度顯示溫度,則將此變量設(shè)為 false。
// 設(shè)置7segment類型(普通Cathode或Anode)
const bool commonCathode = true; // 如果你使用普通陽極,我使用普通陰極 7 段然后將值更改為 false。
// 用于 7 段顯示的字母數(shù)字模式
常量字節(jié)數(shù)字模式[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, // 一個(gè)
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;
無效設(shè)置(){
// 把你的設(shè)置代碼放在這里,運(yùn)行一次:
// 設(shè)置串口為 9600
序列號(hào).開始(9600);
延遲(1000);
// 將 74HC595 控制引腳設(shè)置為輸出
pinMode(latchPin,輸出);//74HC595的ST_CP
pinMode(clkPin,輸出);//74HC595的SH_CP
pinMode(dtPin,輸出);//74HC595的DS
// 初始化 I2C 庫
Wire.begin();
// 以連續(xù)模式、主動(dòng)模式啟動(dòng) MAX30205 溫度讀取
tempSensor.begin();
}
無效循環(huán)(){
浮動(dòng)溫度 = tempSensor.getTemperature(); // 每 5ms 讀取一次溫度
如果(華氏溫度 == 真){
溫度 = (溫度 * 1.8) + 32 ; // 使用公式 [ T(°C) × 1.8 + 32 ] 將溫度從攝氏度轉(zhuǎn)換為法倫海特
Serial.print(temp ,2);
Serial.println("°f");
}別的{
Serial.print(temp ,2);
序列號(hào).println("°c");
}
// 從當(dāng)前溫度中分離出 3 位數(shù)字(例如 if temp = 31.23c, )
int dispDigit1=(int)temp/10;// 數(shù)字1 3
int dispDigit2=(int)temp%10; // 數(shù)字2 1
int dispDigit3=(temp*10)-((int)temp*10); //數(shù)字3 2
/*
序列號(hào).print(temp);
序列號(hào).print("");
Serial.print(dispDigit1);
序列號(hào).print("");
Serial.print(dispDigit2);
序列號(hào).print("");
Serial.println(dispDigit3);
*/
// 將數(shù)字顯示成 3、7 段顯示。
數(shù)字寫入(latchPin,低);
如果(普通陰極 == 真){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit3]);
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (數(shù)字+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. (數(shù)字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
延遲(500);
}
評(píng)論
查看更多