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

 



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, датчик температуры, термопара




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

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

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