Проект PICO TEMPERATURE GUN представляет собой самодельный инфракрасный термометр, созданный с использованием микроконтроллерной платы Raspberry Pi Pico (в данном случае использовался Pico 2) и инфракрасного температурного сенсора GY-906. Результаты измерений выводятся на OLED-дисплей SSD1306 124×32.
Цель проекта
Целью разработки было создание функционального бесконтактного термометра с открытым исходным кодом, используя PICO 2 и GY-906 (MLX90614) — инфракрасный датчик температуры с высокой точностью ±0,5°C.
Сенсор поддерживает два режима выхода: PWM (широтно-импульсная модуляция) и SMBus (I2C). В режиме PWM (10-бит) разрешение составляет 0,14°C, а в режиме I2C — 0,02°C. В данном проекте используется режим I2C.
Необходимые компоненты
Для реализации проекта использовались следующие компоненты:
- RASPBERRY PI PICO 2
- GY-906 (MLX90614) инфракрасный сенсор температуры
- OLED-дисплей 124×32
- Соединительные провода
- Кнопка-переключатель
- Макетная плата
- Прототипная печатная плата (PCB)
- Разъемы для PICO 2
- Испытательные горячие и холодные среды
Модуль инфракрасного температурного сенсора GY-906
Сенсор GY-906 (MLX90614) — это высокоточный инфракрасный датчик, применяемый для бесконтактного измерения температуры. Он работает в широком диапазоне температур: от -70°C до +380°C для объектов и от -40°C до +125°C для самого сенсора.

Датчик обладает высокой точностью ±0,5°C и разрешением 0,02°C. Возможность работы в двух режимах (PWM и I2C) делает его универсальным для различных применений. Устройство поддерживает напряжение от 3,3В до 5В.
Сенсор использует инфракрасную технологию для измерения температуры поверхности без физического контакта, что особенно полезно при работе с движущимися объектами, чувствительными поверхностями или опасными веществами.
Во время пандемии COVID-19 такие сенсоры широко применялись в производстве бесконтактных термометров.
Принцип работы основан на том, что все объекты излучают инфракрасный свет в зависимости от температуры. Сенсор фиксирует это излучение, преобразует его в напряжение, обрабатывает данные и передает информацию микроконтроллеру через интерфейс I2C.
Макетная версия
Работа над проектом началась с создания макетной версии устройства. Все четыре компонента — PICO 2, кнопка, OLED-дисплей и температурный сенсор — были размещены на макетной плате.
- Подключение питания:
- GND контроллера PICO соединен с GND кнопки.
- GND OLED-дисплея также подключен к GND контроллера и датчика температуры.
- VCC дисплея и сенсора подключены к 5V контроллера PICO.
- Подключение кнопки:
- Второй вывод кнопки соединен с GPIO0 контроллера PICO.
- Подключение интерфейса I2C:
- SDA (GPIO4) контроллера соединен с SDA дисплея и сенсора.
- SCL (GPIO5) контроллера соединен с SCL дисплея и сенсора.

После подключения всех проводов в микроконтроллер был загружен код, который отображает текущую температуру при нажатии кнопки.
Код проекта
Программа начинает работу с инициализации связи с сенсором GY-906 и запроса данных о температуре. Сенсор возвращает 16-битное значение, которое затем преобразуется в градусы Цельсия по формуле:
float temperature = tempData * 0.02 - 273.15;
При нажатии кнопки код считывает температуру с сенсора и отображает её на OLED-экране. Дополнительно в Serial Monitor передаются данные о состоянии кнопки и текущей температуре.
Перед загрузкой кода необходимо установить библиотеки для OLED-дисплея.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#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;
}
Итоговый результат
Конечный результат проекта — рабочий инфракрасный термометр, измеряющий температуру поверхностей по тепловому излучению, регистрируемому сенсором GY-906.
Для проверки работы устройства были проведены испытания с горячим черным американо и холодным кофе. Измерения показали 45°C для горячего напитка и 20°C для холодного, подтверждая работоспособность термометра.