Для электронщиков и радиолюбителей

Бесконтактный термометр на основе Raspberry Pi Pico

Бесконтактный термометр на основе Raspberry Pi Pico

Проект 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, а в режиме I2C0,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-дисплей и температурный сенсор — были размещены на макетной плате.

  1. Подключение питания:
    • GND контроллера PICO соединен с GND кнопки.
    • GND OLED-дисплея также подключен к GND контроллера и датчика температуры.
    • VCC дисплея и сенсора подключены к 5V контроллера PICO.
  2. Подключение кнопки:
    • Второй вывод кнопки соединен с GPIO0 контроллера PICO.
  3. Подключение интерфейса 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 для холодного, подтверждая работоспособность термометра.