Доброго всем времени суток.
Собственно, выполняю
обещание. Кратко — необходим термометр с термопарой и возможностью записи лога температуры. Было
предложено готовое устройство, но можно собрать самому в два раза дешевле.
Кому интересно — добро пожаловать под кат.
Начнем по порядку.
Термопара… как термопара. Метр ровно, К типа, 0-800C
Можно врезать в корпус, имеется резьбовая часть, которая вращается свободно. Диаметр 5,8мм, шаг — 0,9~1.0мм, похоже М6 x 1,0 мм. Под ключ на 10
Это все хорошо, дальше что делать? Нужно преобразовать сигнал
термопары (термоэдс) в цифровой или аналоговый сигнал, чтоб читать ардуиной. В этом нам поможет
MAX6675. Это преобразователь сигнала термопары K-типа в цифру, имеет
SPI интерфейс, что нас устраивает.
А вот и наш герой —
MAX6675ISA ($4.20)
Стоил $4.10, но того лота больше нет (продавец тот же).
Подключать будем к ардуине, можно взять простенькую
Arduino Pro Mini ($5.25, можно найти дешевле, здесь Вы видите именно эту)
Данные будем писать на карту памяти (и заодно слать в порт) с помощью
SD Card Module $1.25.
Интерфейс, тоже, кстати, SPI. Только не все карточки его поддерживают. Не завелось — попробуйте сначала другую.
В теории все линии SPI устройств (MOSI или SI, MISO или SO, SCLK или SCK), кроме CS (CS или SS — выбор микросхемы), можно подключить к одним контактам ардуины, но тогда MAX6675 работает неадекватно. Поэтому я все разнес по разным пинам.
В основу скетча лег пример по работе с картами памяти с
хабра.
Библиотека и скетч для MAX6675
тут. Схема подключения MAX6675:
Плата делалась ЛУТом на
гетинаксе ($4.39 10 шт., тратим одну):
Устройство на раз, поэтому сделано не на текстолите и с возможностью легкого извлечения всех компонентов. Качество гетинакса хорошее, тонер держится мертво, обрабатывается легко.
Плата разводилась в Sprint-Layout.
Скачать .lay6.
Предварительный просмотр (сильно не пинать)
В сборе:
В работе:
На термопаре относительно много металла, поэтому она «заторможена». Кроме того пришлось значительно погрузить ее в лед, иначе до 0 не остывала
Подключение к ПК необязательно, достаточно подать 5V питания на ардуину. Устройство пишет данные на карточку в
CSV и шлет в порт, поэтому можно мониторить состояние в реальном времени.
С 23C до 0C термопара остыла за 50 секунд. Обратно нагрелась за 6 минут.
Собственно, вот эти строки:
1;22.75
48;0.00
410;22.25
Из них понятен формат записи — время в секундах от старта; температура.
Сам файл
TEMP.CSV
Да, температура отображается с шагом 0,25. Меня это устраивает.
Если добавить модуль реального времени, устройство станет на порядок круче. Всего $1.79:
Модуль не сильно точный, но для наших целей хватит. Еще можно сделать автономное питание на каком-нибудь UP конвертере. Вот, $1.65:
Еще стоит убрать перезапись файла… Много чего можно сделать. Я просто оставлю все исходники здесь
Скетч
/*
Схема подключения
* SD:
** MOSI — pin 11
** MISO — pin 12
** CLK — pin 13
** CS — pin 10
* MAX6675:
** MISO — pin 8;
** SCK — pin 7;
** CS — pin 9;
Основано на коде David A. Mellis, Tom Igoe, Gleb Devyatkin
habrahabr.ru/post/115176/
*/
#include <MAX6675.h>
#include <SD.h>
File myFile;
int time = 0;
int units = 1; // Units to readout temp (0 = F, 1 = C)
float error = 0.0; // Temperature compensation error
float temp_out = 0.0; // Temperature output varible
MAX6675 temp0(9,8,7,units,error);
void setup()
{
Serial.begin(9600);
Serial.print(«Initializing SD card...»);
pinMode(10, OUTPUT);
if (!SD.begin(10)) {
Serial.println(«initialization failed!»);
return;
}
Serial.println(«initialization done.»);
// Проверяем, существует ли на карте файл data.csv, если существует, то удаляем его.
if(SD.exists(«temp.csv»)) {
SD.remove(«temp.csv»);
}
// открываем файл. заметьте, что только один файл может быть открыт за раз,
// поэтому вы должны закрыть этот, чтобы открыть другой.
myFile = SD.open(«temp.csv», FILE_WRITE); // открыть на запись
// если файл нормально открылся, запишем в него:
if (myFile) {
Serial.print(«Writing to temp.csv...»);
// закрываем файл:
myFile.close();
Serial.println(«done.»);
}
else {
// а если он не открылся, то печатаем сообщение об ошибке:
Serial.println(«error opening temp.csv»);
}
}
void loop()
{
temp_out = temp0.read_temp(5); // Read the temp 5 times and return the average value to the var
time = time + 1; // Увеличиваем время на 1
myFile = SD.open(«temp.csv», FILE_WRITE);
// если файл нормально открылся, запишем в него:
if (myFile) {
// записываем время
myFile.print(time);
Serial.print(time);
// добавляем точку с запятой
myFile.print(";");
Serial.print(";");
// пишем температуру и перевод строки
myFile.println( temp_out );
Serial.println( temp_out );
// закрываем файл:
myFile.close();
}
else {
// а если он не открылся, то печатаем сообщение об ошибке:
Serial.println(«error opening temp.csv»);
}
delay(1000); // Ждем секунду
}
Скачать:
скетч, библиотеку
MAX6675
Я вот делаю для себя логгер сетевого напряжения.
Взял Ардуино нано, модуль реального времени и модуль для карт памяти.
Для питания раскурочил и приколхозил начинку от китайского БП на 5В.
Для задания напряжения на входе в ардуино сделал резисторный делитель, диодный мост с конденсатором.
Еще приделал дисплей 16*2.
Все это засунул в распредкоробку.
Скетчи написал, осталось поправочные коэффициенты ввести и в путь.
Даже для китайского БП — ничто.
Модуль карты памяти
Модуль блютус\вайфай для подключения к сети.
Можете минусить но меня тошнит от поделок на ардуине которые выглядят как куча говноплат.
И код ужасный. И либы медленные.
Используйте STM или PIC
Да и то нужно постараться
А как с компенсацией температуры холодного спая?
Есть и программа для мониторинга — Temp Keeper
У меня такой датчик уже почти 2 года работает через этот переходник, правда программа самописная.
Хотя конечно термопара по диапазону всё же куда шире, но это зависит от области применения какой датчик лучше использовать
Вот мне интересно, кулибины-электронщики, занимающиеся сборкой всяких самодельных штук — они по образованию этим занимаются или самоучки в большинстве? Был курс ВУЗовской электротехники, конечно, понимания прибавила, но не так чтобы прям все стало ясно. И поэтому для себя сделал вывод — что или нужно чтобы к этому делу душа лежала, иначе ему не обучиться (обучать самого себя неинтересному — есть пытка и мазохизм), или профессионально на это учиться.
Автору +1.
А в чем преимущество термопары над уже готовым датчиком, например DHT22?
Там провод специальный термопарный?
У данной термопары — 800°С.
dht22: -40 — 80 degrees C temperature range
даташит на DHT11:
Measuring range humidity 20-90%RH;
temperature 0-50 Celsius
даташит на DHT22:
Measuring range humidity 0-100%RH; temperature -40~125Celsius
А не ткнёте носом новичка, в блоки, из которых можно собрать штуку для управлением времени нагрева до определённой температуры. Типа нагреть тэном до определённой температуры жидкость, подержать при этой температуре (любое заданное количество) минут, затем возможно ещё нагреть (или остудить) на другое время и т.д.
Грубо говоря как в мультиварках, стиралках, хлебопечках и т.п. только чтоб программу и параметры температуры и времени можно было задавать.
Если на реле — руководств полно, и все упрощается.
1 ВКЛ — ждем достижения нужной температуры.
2 Достигли? да — ВЫКЛ, иначе — п.1.
3 Температура понизилась — п.1
Симистор или релешка. С релешкой только не забыть сделать чуток побольше дельту, чтобы по 20 раз в секунду не щелкала. С симистором интереснее — можно что-то типа шим намутить для поддержания температуры, т.е. открывать короткими импульсами, но это не с любой нагрузкой проканает.
www.owen.ru/uploads/trm151.pdf
Или делать самому вроде monitor.espec.ws/section44/printview207327p680.html
Если мощности по нагрузки не хватит, то можно использовать твердотельное реле на нужную мощность
Лучше бы взяли Dallas'овские DS18B20:
aliexpress.com/snapshot/219876111.html
Датчик полностью цифровой, цепляется по шине OneWire — т.е. вы хоть десять штук к Ардуине подцепите — всё равно будет занимать только один цифровой pin. Преимущества — длина — тот же метр, влагозащита, нержавейка, «цифра».
Что с ним станет, если я его до 480°C нагрею?
А термопара до 800°C держит, от DS18B20 кроме ножек что-нибудь останется?
У DS18B20 преобразование показаний в «цифру» происходит рядом с точкой замера, т.е. искажений меньше, что делает его для бытовых случаев гораздо более предпочтительным. Бонус — никакого ЛУТа.
А если у вас пром.применения — тут уже обычно за экономией в $10 не гонятся, себе дороже.
Возьму за основу!
Если нужен именно такой:
Читаем: 7-сегментный-индикатор и вот это.
Может взять готовый?
Обзор
Обращаясь к этим именам получаете температуру как в строке Можно попробовать подключить MISO/MOSI/SCK линии датчиков параллельно, и только CS развести по разным пинам, но не все устройства полноценно поддерживают SPI, некоторым нужен только «железный» и т.п. Поэтому желательно предварительно проверить такой способ подключения.
Как Вы видите, я использовал SOP-8 -> DIP-переходник, тогда можно использовать макетные провода для проверки и не придется выпаивать SMD в случае чего.
собрать и посмотреть
MAX6675 temp1(1,12,13,units,error);
MAX6675 temp2(2,12,13,units,error);
MAX6675 temp3(3,12,13,units,error);
temp_out1 = temp1.read_temp(5);
temp_out2 = temp2.read_temp(5);
temp_out3 = temp3.read_temp(5);
а как эту термопару прицепить к мультиметру напрямую?
есть ли какая зависимость температуры от сопротивления?
задача поддерживать в тигле нужную температуру (примерно 350 градусов)
в чем будет показывать мультиметр «температуру» (в градусах или омах ) непринципиально.
кароче… есть ли какой график…
Потому что термопара генерирует термо-ЭДС — напряжение в милливольтах. Вот тут есть градуировочные таблицы для термопар. Вряд ли некий абстрактный мультиметр (вероятно, 830) даст нужную точность. Нужен усилитель.
з.ы. взял инфу с termopara.org