Термопара типа K является наиболее распространенным типом термопар. Она недорогая, точная, надежная и имеет широкий температурный диапазон. В этой статье показано, как использовать микроконтроллер Arduino Uno / Nano с модулем дисплея OLED для считывания данных термопары типа K. Как и следовало ожидать, существует аналоговый интерфейс MAX6675 для прямого цифрового преобразования выходных данных термопары типа K. Программное обеспечение, выполняемое в фоновом режиме, переводит показания термопары в воспринимаемые значения температуры в градусах Цельсия или Фаренгейта.
Микросхема MAX6675, доступная в 8-контактном корпусе SO, выполняет компенсацию холодного спая и оцифровывает сигнал от термопары типа K. Окончательный вывод данных производится в 12-разрядном формате, совместимом с SPI.
Микросхема также имеет функцию обнаружения открытой термопары. Для быстрого создания прототипа было бы лучше использовать предварительно смонтированную плату MAX6675, а не чистую микросхему, припаянную к адаптеру SMD, потому что отладочная плата обычно доступна в виде экономичного комплекта, который включает термопару типа K. Выше приведено изображение такого модуля.
Подключение данного модуля с MAX6675 к Arduino выполняется довольно просто: Vcc к 5 V, Gnd к Gnd, SO к D4, CS/SS к D5, CSK к D6. Термопара подключается к модулю MAX6675 с противоположной стороны от контактов, ведущих к Arduino.
Ниже приведен простой скетч для теста. Для работы с модулем вам понадобится библиотека MAX6675 (https://github.com/adafruit/MAX6675-library).
int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
void setup()
{
Serial.begin(9600);
Serial.println("MAX6675 SERIAL TEST");
// time for stabilization
delay(1000);
}
void loop()
{
// current temperature readout
Serial.print("Deg C = ");
Serial.println(thermocouple.readCelsius());
Serial.print("\t Deg F = ");
Serial.println(thermocouple.readFahrenheit());
Serial.println();
delay(1000);
}
Окно последовательного монитора при запуске программы может выглядеть следующим образом:
Теперь подключим к полученной конструкции OLED-дисплей 128 × 64 к Arduino по шине I2C (OLED SDA к A4, OLED SCL к A5).
Код программы приведен далее. Как видно из кода, он усредняет выходную информацию оборудования термопары в 25 раз, чтобы получить разумные показания термометра. Следует отметить, что это замедлит обновление дисплея, но не повлияет на реакцию термопары. На экране дисплея отображается максимальная температура в верхнем левом углу, минимальная температура в верхнем правом углу и текущая температура в нижней строке.
#include "U8glib.h"
#include <SPI.h>
#include <Wire.h>
#include "max6675.h"
boolean centigrade = true; // по шкале Цельсия
// boolean centigrade = false; // о шкале Фаренгейта
// настроить объект u8g
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C
double max = 215; // Максимальная температура
double min = -215; // Минимальная температура
float currentTemp = 0.00;
String thisTemp = "";
int maxTemp = 0; // Максимальная температура достигнута
int minTemp = 0; // Минимальная температура достигнута
int pad = 0;
// Модуль термопары MAX6675
int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
int vccPin = 3;
int gndPin = 2;
void draw(void) {
u8g.setFont(u8g_font_profont12);
u8g.drawStr(20, 10, "Temperature");
u8g.setFont(u8g_font_profont12);
// Показать максимальную достигнутую температуру
u8g.drawStr(10, 25, "max");
if (maxTemp <= int(currentTemp)) {
maxTemp = int(currentTemp);
}
thisTemp = String(maxTemp);
if (centigrade) {
thisTemp = thisTemp + "\260C";
}
else {
thisTemp = thisTemp + "\260F";
}
const char* maxTempC = (const char*) thisTemp.c_str();
u8g.drawStr(30, 25, maxTempC);
// Показать минимально достигнутую температуру
u8g.drawStr(70, 25, "min");
if (minTemp >= int(currentTemp)) {
minTemp = int(currentTemp);
}
thisTemp = String(minTemp);
if (centigrade) {
thisTemp = thisTemp + "\260C";
}
else {
thisTemp = thisTemp + "\260F";
}
const char* minTempC = (const char*) thisTemp.c_str();
u8g.drawStr(90, 25, minTempC);
u8g.setFont(u8g_font_profont29);
if (currentTemp > 99) {
pad = 2;
}
if (currentTemp > 9 && currentTemp < 100) {
pad = 10;
}
if (currentTemp < 10) {
pad = 18;
}
thisTemp = String(currentTemp);
if (centigrade) {
thisTemp = thisTemp + "\260C";
}
else {
thisTemp = thisTemp + "\260F";
}
const char* newDispC = (const char*) thisTemp.c_str();
u8g.drawStr(pad, 50, newDispC);
}
void setup(void) {
pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);
Serial.begin(9600); // Последовательная передача данных
Wire.begin();
delay(500); // Время стабилизации
if (centigrade) {
currentTemp = thermocouple.readCelsius();
minTemp = int(thermocouple.readCelsius());
maxTemp = int(thermocouple.readCelsius());
}
else {
currentTemp = thermocouple.readFahrenheit();
minTemp = int(thermocouple.readFahrenheit());
maxTemp = int(thermocouple.readFahrenheit());
}
}
void loop(void) {
currentTemp = 0;
for (int f = 0; f < 25; f++) {
if (centigrade) {
currentTemp = thermocouple.readCelsius() + currentTemp;
}
else {
currentTemp = thermocouple.readFahrenheit() + currentTemp;
}
}
currentTemp = currentTemp / 25; // Усредняем 25 считываний
// Draw
u8g.firstPage();
do {
draw();
} while ( u8g.nextPage() );
delay(50); // Время обновления
}
Использование Arduino и термопары с MAX6675 – это простой и недорогой способ создания простого, но надежного ручного цифрового термометра.
© digitrode.ru