基于GY-906红外温度模块的树莓派PICO 2动力温度枪
扫描二维码
随时随地手机看文章
大家好,欢迎回来。这里有一些有用的东西。
PICO温度枪项目是一个自己动手的温度枪项目,使用PICO 2和GY-906红外温度传感器采集温度读数,并将其显示在SSD1306 124x32 OLED屏幕上。
目标是使用PICO 2和GY-906 (MLX90614)从零开始创建一个开源的功能温度枪,GY-906是一种非接触式红外温度传感器,精度为±0.5°C。
它提供两种输出模式:PWM(脉宽调制)和SMBus (I2C)。10位PWM输出的分辨率为0.14°C,而I2C接口的分辨率为0.02°C。我们现在使用I2C模式。
对于这个项目,我们创建了两个变体:一个用于简单设置的面包板版本和一个将所有组件连接到漂亮PCB上的原型PCB版本,使整个设置更容易和更实用。
对于这个项目的版本2,我们将设计一个定制的PCB,带有温度枪式外壳作为外壳和板载电池组。
目前,本文将介绍面包板和原型PCB版本的基本设置和构建过程,因此让我们开始这个项目。
材料要求
这些是在这个项目中使用的组件。
•PICO 2
•GY-906红外温度传感器
•OLED显示屏124x32
•跳线
•按钮开关
•电路试验板
•PCB原型
•PICO 2的母头引脚
•连接电线
•用于测试的热、冷介质
GY-906红外温度传感器模块
GY-906 (MLX90614)红外温度传感器是一种非常精确和适应性强的设备,通常用于非接触式温度读数。它的工作温度范围很广,物体温度范围为-70°C至+380°C,传感器温度范围为-40°C至+125°C。
该传感器精度高,分辨率为0.02°C,环境温度精度为±0.5°C。
该传感器的双输出技术(PWM和I2C)允许在各种应用中的多功能性。用户可以使用10位PWM输出和I2C接口获得0.14°C和0.02°C的分辨率。
它可以在3.3V到5V的电压范围内正常工作。
这种传感器采用红外技术来确定表面的温度,而不需要进行物理接触。这在不能直接接触的情况下尤其有益,例如移动物品、敏感表面或有害化合物。
有趣的事实:在COVID期间,这些传感器通常用于制造温度枪。
所有物体都会发出红外光,这是温度的函数。红外温度传感器检测物体发出的红外辐射,将其转换为电压,处理该信号以计算温度,然后通过I2C接口将该信息传递给微控制器。
这种非接触式方法可以实现准确可靠的温度测量,而无需与被测量对象进行物理接触。
PCBWAY Giftshop
至于采购GY906温度传感器以及我们在这个项目中使用的PICO 2,我们从PCBWAY的礼品店得到了它们。
PCBWAY礼品店是一个在线市场,在那里你可以以正价获得各种电子模块和电路板,或者你可以使用PCBWAY货币,也就是所谓的豆子。
从PCBWAY订购一些东西后,您可以获得豆子作为奖励积分,或者您也可以通过在PCBWAY社区发布任何项目来获得豆子。
此外,PCBWAY正在组织一场PCB徽章制作比赛,以纪念其成立11周年,邀请设计师和制造商通过设计徽章来展示他们的创造力,以庆祝公司的传统并展望大胆的未来。参赛者必须将元素“PCBWay”和数字“11”纳入其设计中,并可以使用PCB, PCB+SMT/THT或PCB+3D打印技术。提交的作品可以在评论中发布,通过电子邮件发送,或者在社交媒体上以#PCBWay11BadgeContest的标签分享。
奖品包括现金、PCBway优惠券和所有合格参赛作品的免费原型设计服务。
试验板的版本
我们通过设置面包板版本开始项目。我们首先将所有四个组件放在面包板上:PICO 2,开关,OLED屏幕和温度传感器。
接下来,我们将PICO的GND连接到开关1输入;OLED屏幕的GND同样连接到PICO和温度传感器的GND。
接下来,我们将显示器和温度传感器的VCC连接到PICO的5V电源。
然后将按钮的第二个终端连接到GPIO0。
现在,我们将PICO的I2C, GPIO4 (SDA)和GPIO5 (SCL)并联连接到显示器和温度传感器的SDA和SCL引脚。
连接好电线后,我们将主代码输入到设备中,它只显示按下按钮时温度传感器测量到的当前温度。
代码
这是这个项目的代码,它很简单。
项目代码首先启动与GY-906传感器的接触并请求温度数据。传感器然后返回16位原始温度读数,通过应用计算tempData * 0.02 - 273.15将其转换为摄氏度。
当你按下按钮时,代码从传感器读取温度并显示在OLED面板上。此外,按钮状态和温度值被发送到串行监视器进行故障排除。
在使用此草图之前,请确保您已经安装了OLED屏幕库。
临时PCB版本
我们现在正在准备临时PCB版本,其中包括将所有组件安装在我们的特殊原型PCB上并将它们连接起来以创建一个工作原型。
•要安装PICO 2,我们首先将母头引脚放在PCB上。
•然后将OLED屏幕和开关放置在顶部。
•我们将温度传感器连接到PCB的背面。
•在安装完所有组件后,我们开始使用连接线将它们的焊盘连接在一起。我们首先将所有组件的GND连接在一起。
•接下来,我们将5V的PICO连接到温度传感器和OLED面板的VCC。
•PICO的SDA (GPIO4)和SCL (GPIO5)现在分别连接到温度传感器和OELD屏幕的SDA和SCL引脚。
•最后,我们将GPIO0添加到按钮终端。
接线过程现在已经完成,我们的温度枪的原型电路已经准备好了。
结果/结论
这个基本但有用的项目的最终结果是一个工作温度枪,显示使用GY-906传感器检测到的热辐射介质的温度。对于精确的表面温度测量,通常推荐大约1厘米的距离,但这取决于介质的大小和比例。
为了对这台设备进行最后的测试,我们制作了两种不同的咖啡:一种是热黑美式咖啡,另一种是冷咖啡。首先,我们测量了热咖啡,得到了45°C的温度读数。接着,我们从冷的介质,也就是冷的咖啡中取读数,它的温度是二十摄氏度。冷咖啡不太冷,热咖啡不温不热。
温度枪原型已经开始工作,我们现在可以计划该项目的第二次迭代,它将采用热枪3D打印外壳,并包括一个带有锂电池的定制PCB,使设置更方便,更便于使用。
代码
#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