基于GY-906紅外溫度模塊的樹(shù)莓派PICO 2動(dòng)力溫度槍
大家好,歡迎回來(lái)。這里有一些有用的東西。
PICO溫度槍項(xiàng)目是一個(gè)自己動(dòng)手的溫度槍項(xiàng)目,使用PICO 2和GY-906紅外溫度傳感器采集溫度讀數(shù),并將其顯示在SSD1306 124x32 OLED屏幕上。
目標(biāo)是使用PICO 2和GY-906 (MLX90614)從零開(kāi)始創(chuàng)建一個(gè)開(kāi)源的功能溫度槍?zhuān)珿Y-906是一種非接觸式紅外溫度傳感器,精度為±0.5°C。
它提供兩種輸出模式:PWM(脈寬調(diào)制)和SMBus (I2C)。10位PWM輸出的分辨率為0.14°C,而I2C接口的分辨率為0.02°C。我們現(xiàn)在使用I2C模式。
對(duì)于這個(gè)項(xiàng)目,我們創(chuàng)建了兩個(gè)變體:一個(gè)用于簡(jiǎn)單設(shè)置的面包板版本和一個(gè)將所有組件連接到漂亮PCB上的原型PCB版本,使整個(gè)設(shè)置更容易和更實(shí)用。
對(duì)于這個(gè)項(xiàng)目的版本2,我們將設(shè)計(jì)一個(gè)定制的PCB,帶有溫度槍式外殼作為外殼和板載電池組。
目前,本文將介紹面包板和原型PCB版本的基本設(shè)置和構(gòu)建過(guò)程,因此讓我們開(kāi)始這個(gè)項(xiàng)目。
材料要求
這些是在這個(gè)項(xiàng)目中使用的組件。
?PICO 2
?GY-906紅外溫度傳感器
?OLED顯示屏124x32
?跳線
?按鈕開(kāi)關(guān)
?電路試驗(yàn)板
?PCB原型
?PICO 2的母頭引腳
?連接電線
?用于測(cè)試的熱、冷介質(zhì)
GY-906紅外溫度傳感器模塊
GY-906 (MLX90614)紅外溫度傳感器是一種非常精確和適應(yīng)性強(qiáng)的設(shè)備,通常用于非接觸式溫度讀數(shù)。它的工作溫度范圍很廣,物體溫度范圍為-70°C至+380°C,傳感器溫度范圍為-40°C至+125°C。
該傳感器精度高,分辨率為0.02°C,環(huán)境溫度精度為±0.5°C。
該傳感器的雙輸出技術(shù)(PWM和I2C)允許在各種應(yīng)用中的多功能性。用戶可以使用10位PWM輸出和I2C接口獲得0.14°C和0.02°C的分辨率。
它可以在3.3V到5V的電壓范圍內(nèi)正常工作。
這種傳感器采用紅外技術(shù)來(lái)確定表面的溫度,而不需要進(jìn)行物理接觸。這在不能直接接觸的情況下尤其有益,例如移動(dòng)物品、敏感表面或有害化合物。
有趣的事實(shí):在COVID期間,這些傳感器通常用于制造溫度槍。
所有物體都會(huì)發(fā)出紅外光,這是溫度的函數(shù)。紅外溫度傳感器檢測(cè)物體發(fā)出的紅外輻射,將其轉(zhuǎn)換為電壓,處理該信號(hào)以計(jì)算溫度,然后通過(guò)I2C接口將該信息傳遞給微控制器。
這種非接觸式方法可以實(shí)現(xiàn)準(zhǔn)確可靠的溫度測(cè)量,而無(wú)需與被測(cè)量對(duì)象進(jìn)行物理接觸。
PCBWAY Giftshop
至于采購(gòu)GY906溫度傳感器以及我們?cè)谶@個(gè)項(xiàng)目中使用的PICO 2,我們從PCBWAY的禮品店得到了它們。
PCBWAY禮品店是一個(gè)在線市場(chǎng),在那里你可以以正價(jià)獲得各種電子模塊和電路板,或者你可以使用PCBWAY貨幣,也就是所謂的豆子。
從PCBWAY訂購(gòu)一些東西后,您可以獲得豆子作為獎(jiǎng)勵(lì)積分,或者您也可以通過(guò)在PCBWAY社區(qū)發(fā)布任何項(xiàng)目來(lái)獲得豆子。
此外,PCBWAY正在組織一場(chǎng)PCB徽章制作比賽,以紀(jì)念其成立11周年,邀請(qǐng)?jiān)O(shè)計(jì)師和制造商通過(guò)設(shè)計(jì)徽章來(lái)展示他們的創(chuàng)造力,以慶祝公司的傳統(tǒng)并展望大膽的未來(lái)。參賽者必須將元素“PCBWay”和數(shù)字“11”納入其設(shè)計(jì)中,并可以使用PCB, PCB+SMT/THT或PCB+3D打印技術(shù)。提交的作品可以在評(píng)論中發(fā)布,通過(guò)電子郵件發(fā)送,或者在社交媒體上以#PCBWay11BadgeContest的標(biāo)簽分享。
獎(jiǎng)品包括現(xiàn)金、PCBway優(yōu)惠券和所有合格參賽作品的免費(fèi)原型設(shè)計(jì)服務(wù)。
試驗(yàn)板的版本
我們通過(guò)設(shè)置面包板版本開(kāi)始項(xiàng)目。我們首先將所有四個(gè)組件放在面包板上:PICO 2,開(kāi)關(guān),OLED屏幕和溫度傳感器。
接下來(lái),我們將PICO的GND連接到開(kāi)關(guān)1輸入;OLED屏幕的GND同樣連接到PICO和溫度傳感器的GND。
接下來(lái),我們將顯示器和溫度傳感器的VCC連接到PICO的5V電源。
然后將按鈕的第二個(gè)終端連接到GPIO0。
現(xiàn)在,我們將PICO的I2C, GPIO4 (SDA)和GPIO5 (SCL)并聯(lián)連接到顯示器和溫度傳感器的SDA和SCL引腳。
連接好電線后,我們將主代碼輸入到設(shè)備中,它只顯示按下按鈕時(shí)溫度傳感器測(cè)量到的當(dāng)前溫度。
代碼
這是這個(gè)項(xiàng)目的代碼,它很簡(jiǎn)單。
項(xiàng)目代碼首先啟動(dòng)與GY-906傳感器的接觸并請(qǐng)求溫度數(shù)據(jù)。傳感器然后返回16位原始溫度讀數(shù),通過(guò)應(yīng)用計(jì)算tempData * 0.02 - 273.15將其轉(zhuǎn)換為攝氏度。
當(dāng)你按下按鈕時(shí),代碼從傳感器讀取溫度并顯示在OLED面板上。此外,按鈕狀態(tài)和溫度值被發(fā)送到串行監(jiān)視器進(jìn)行故障排除。
在使用此草圖之前,請(qǐng)確保您已經(jīng)安裝了OLED屏幕庫(kù)。
臨時(shí)PCB版本
我們現(xiàn)在正在準(zhǔn)備臨時(shí)PCB版本,其中包括將所有組件安裝在我們的特殊原型PCB上并將它們連接起來(lái)以創(chuàng)建一個(gè)工作原型。
?要安裝PICO 2,我們首先將母頭引腳放在PCB上。
?然后將OLED屏幕和開(kāi)關(guān)放置在頂部。
?我們將溫度傳感器連接到PCB的背面。
?在安裝完所有組件后,我們開(kāi)始使用連接線將它們的焊盤(pán)連接在一起。我們首先將所有組件的GND連接在一起。
?接下來(lái),我們將5V的PICO連接到溫度傳感器和OLED面板的VCC。
?PICO的SDA (GPIO4)和SCL (GPIO5)現(xiàn)在分別連接到溫度傳感器和OELD屏幕的SDA和SCL引腳。
?最后,我們將GPIO0添加到按鈕終端。
接線過(guò)程現(xiàn)在已經(jīng)完成,我們的溫度槍的原型電路已經(jīng)準(zhǔn)備好了。
結(jié)果/結(jié)論
這個(gè)基本但有用的項(xiàng)目的最終結(jié)果是一個(gè)工作溫度槍?zhuān)@示使用GY-906傳感器檢測(cè)到的熱輻射介質(zhì)的溫度。對(duì)于精確的表面溫度測(cè)量,通常推薦大約1厘米的距離,但這取決于介質(zhì)的大小和比例。
為了對(duì)這臺(tái)設(shè)備進(jìn)行最后的測(cè)試,我們制作了兩種不同的咖啡:一種是熱黑美式咖啡,另一種是冷咖啡。首先,我們測(cè)量了熱咖啡,得到了45°C的溫度讀數(shù)。接著,我們從冷的介質(zhì),也就是冷的咖啡中取讀數(shù),它的溫度是二十?dāng)z氏度。冷咖啡不太冷,熱咖啡不溫不熱。
溫度槍原型已經(jīng)開(kāi)始工作,我們現(xiàn)在可以計(jì)劃該項(xiàng)目的第二次迭代,它將采用熱槍3D打印外殼,并包括一個(gè)帶有鋰電池的定制PCB,使設(shè)置更方便,更便于使用。
代碼
#include
#include
#include
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int buttonPin = 0; // GPIO0 pin for button
const int sensorAddress = 0x5A; // GY-906-BAA I2C address
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
Wire.begin();
// SSD1306 OLED display initialization
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000); // Pause for 2 seconds
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Press button");
display.display();
}
void loop() {
int buttonState = digitalRead(buttonPin);
Serial.print("Button State: ");
Serial.println(buttonState);
if (buttonState == LOW) { // Button is pressed when LOW with INPUT_PULLUP
Serial.println("Button Pressed");
float temperature = readTemperature();
Serial.print("Temperature: ");
Serial.println(temperature);
display.clearDisplay();
display.setCursor(0, 0);
display.print("Temp: ");
display.print(temperature);
display.print(" C");
display.display();
} else {
display.clearDisplay();
display.setCursor(0, 0);
display.print("Press button");
display.display();
}
delay(100);
}
float readTemperature() {
Wire.beginTransmission(sensorAddress);
Wire.write(0x07);
Wire.endTransmission(false);
Wire.requestFrom(sensorAddress, 3);
int16_t tempData = Wire.read();
tempData |= Wire.read() << 8;
float temperature = tempData * 0.02 - 273.15;
return temperature;
}
本文編譯自hackster.io