цифровая электроника
вычислительная техника
встраиваемые системы

 

Arduino и датчик температуры термопары на основе MAX6675

Автор: Mike(admin) от 12-03-2019, 11:05

Термопара типа K является наиболее распространенным типом термопар. Она недорогая, точная, надежная и имеет широкий температурный диапазон. В этой статье показано, как использовать микроконтроллер Arduino Uno / Nano с модулем дисплея OLED для считывания данных термопары типа K. Как и следовало ожидать, существует аналоговый интерфейс MAX6675 для прямого цифрового преобразования выходных данных термопары типа K. Программное обеспечение, выполняемое в фоновом режиме, переводит показания термопары в воспринимаемые значения температуры в градусах Цельсия или Фаренгейта.


Arduino и датчик температуры термопары на основе MAX6675

Микросхема MAX6675, доступная в 8-контактном корпусе SO, выполняет компенсацию холодного спая и оцифровывает сигнал от термопары типа K. Окончательный вывод данных производится в 12-разрядном формате, совместимом с SPI.


Arduino и датчик температуры термопары на основе MAX6675

Микросхема также имеет функцию обнаружения открытой термопары. Для быстрого создания прототипа было бы лучше использовать предварительно смонтированную плату MAX6675, а не чистую микросхему, припаянную к адаптеру SMD, потому что отладочная плата обычно доступна в виде экономичного комплекта, который включает термопару типа K. Выше приведено изображение такого модуля.


Подключение данного модуля с MAX6675 к Arduino выполняется довольно просто: Vcc к 5 V, Gnd к Gnd, SO к D4, CS/SS к D5, CSK к D6. Термопара подключается к модулю MAX6675 с противоположной стороны от контактов, ведущих к Arduino.


Arduino и датчик температуры термопары на основе MAX6675

Ниже приведен простой скетч для теста. Для работы с модулем вам понадобится библиотека 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);
}

Окно последовательного монитора при запуске программы может выглядеть следующим образом:


Arduino и датчик температуры термопары на основе MAX6675

Теперь подключим к полученной конструкции OLED-дисплей 128 × 64 к Arduino по шине I2C (OLED SDA к A4, OLED SCL к A5).


Arduino и датчик температуры термопары на основе MAX6675

Код программы приведен далее. Как видно из кода, он усредняет выходную информацию оборудования термопары в 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 – это простой и недорогой способ создания простого, но надежного ручного цифрового термометра.


Arduino и датчик температуры термопары на основе MAX6675



© digitrode.ru


Теги: Arduino, датчик температуры, термопара



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий