На МК. Сердцем его является микроконтроллер PIC16F628A. В схеме термометра используется 4-х значный или 2+2 светодиодный индикатор с общим анодом. Датчик температуры используется типа DS18B20, и в моем случае показания датчика отображаются с точностью 0,5*С. Термометр имеет пределы измерения теемпературы от -55 до +125*С, что достаточно на все случаи жизни. Для питания термометра была использована обычная зарядка от мобилы на ИП с транзистором 13001.

Принципиальная схема термометра на микроконтроллере PIC16F628A:

Для прошивки PIC16F628A я использовал программу ProgCode, установив её на компьютер и собрав программатор ProgCode по известной схеме:

Обозначение выводов используемого микроконтроллера и цоколёвка некоторых других аналогичных МК:

Программа ProgCode и инструкции с фотографиями пошаговой прошивки находятся в архиве на форуме. Там же и все необходимые для этой схемы файлы. В программе открываем и нажимаем на кнопку "записать всё”. В моем изготовленном устройстве, как видно из фотографий, собрано 2 термометра сразу в одном корпусе, верхний индикатор показывает температуру дома, нижний - на улице. Размещается он в любом месте помещения и соединяется с датчиком гибким проводом в экране. Материал предоставил ansel73. Прошивку редактировал: [)еНиС

Термометр на ATmega8 и датчике температуры DS18B20

Схема термометра на ATmega8 и DS18B20

Цифровой термометр DS18B20
Семисегментный светодиодный индикатор
Алгоритм программы термометра
Программа цифрового термометра на DS18B20

Схема и программа очень простого цифрового термометра с использованием микроконтроллера ATmega8 и датчика температуры DS18B20 . Термометр позволяет измерять температуру от 0 до 99 градусов с точностью до 0,5 градусов с разрешением 0,1 градуса

Термометр по своим характеристикам очень прост, и его можно использовать только как термометр для измерения «комнатной» температуры. Использовать в этой конструкции микроконтроллер с памятью 8 килобайт конечно расточительно, можно применить микроконтроллер и попроще. Но дело в том, что эта конструкция — основа для дальнейшего развития проекта с использованием цифрового датчика температуры DS18B20. В следующей статье будет опубликована конструкция другого термометра — на двух датчиках DS18B20, что позволит измерять температуру не только в комнате, но и «за бортом». Естественно, будет добавлена возможность измерять и отрицательные температуру. В дальнейшем в конструкцию будет добавлена функция термостата, часы, возможность работы с различными нагрузками, что позволит уже собрать несложную конструкцию — основу «умного дома». Ну а сегодня первая статья из этой серии.

Схема термометра на ATmega8 и датчике температуры DS18B20

Давайте посмотрим на схему термометра:

Как видите, схема очень проста, используется только необходимый минимум деталей.
В схеме, для индикации показаний, применен семисегментный трехразрядный светодиодный индикатор .

Напряжение питания конструкции — 5 вольт. Если вы примените микроконтроллер с низковольтным питанием , то можно и понизить питающее напряжение конструкции, но в этом случае, возможно придется уменьшить номинал гасящих сопротивлений в сегментах индикатора. Приблизительно номиналы сопротивлений можно брать:
— при питании 5 вольт — 200-300 Ом
— при питании 2,7 — 3 вольта — 100-150 Ом


Транзисторы — любые, маломощные, структуры NPN.
Датчик температуры — DS18B20
Семисегментный индикатор — любой трехразрядный с общим катодом. Если вы захотите применить другие, с общим анодом, тогда придется заменить транзисторы на PNP и внести изменения в программу (заменить массив двоичных кодов для вывода цифр на индикатор). Я применил индикатор красного цвета свечения, и заодно, для следующей схемы, приготовил такой-же, но голубого цвета свечения.

Детали термометра на микроконтроллере ATmega и DS18B20



Распиновка микроконтроллера ATmega8:

Трехразрядный семисегментный индикатор FYT-5631AUR-21:

Датчик температуры DS18B20:

Транзисторы BC547C:

Алгоритм работы программы термометра на ATmega и DS18B20

Все установки микроконтроллера заводские, FUSE-биты трогать не надо.

Для работы программы задействовано два таймера/счетчика микроконтроллера:
восьмиразрядный Т0
шестнадцатиразрядный Т1
С помощью восьмиразрядного таймера Т0 настроенного на вызов прерывания по переполнению, с внутренней частотой СК/8 (период 2 миллисекунды) организован:
— расчет текущей температуры
— динамический вывод результатов измерения температуры датчиком DS18B20
С помощью шестнадцатиразрядного таймера Т1 настроенного на вызов прерывания по переполнению, с внутренней частотой СК/64 (период 4 секунды) организованно:
— подача команды датчику DS18B20 на измерение температуры
— считывание измеренной температуры с датчика
В принципе, можно задействовать и один восьмиразрядный таймер/счетчик, также настроенный на вызов прерывания по переполнению, с внутренней частотой СК/8, и всю работу схемы организовать в процессе обработки прерывания. Но дело в том, что смысла в этом нет — датчику DS18B20 необходимо чуть меньше 1 секунды (при 12-ти битном разрешении) для конвертирования (определения) температуры, т.е., чаще чем 1 раз в секунду мы не сможем обновлять данные температуры. Кроме того, столь частое обновление температуры приведет к нагреву датчика и, соответственно, к искажению реальных данных. Использование второго счетчика позволяет отдельно задавать промежутки времени измерения температуры.

Вот так выглядит основная часть программы в Algorithm Builder:

Где:

SP — настройка начального адреса стека

Timer 0 — настройка таймера T0:

Timer 1 — настройка таймера Т1:

TIMSK — настройка прерываний от таймеров:

Init_Display — подпрограмма настройки разрядов портов, участвующих в динамической индикации вывода данных на трехразрядный семисегментный индикатор

1 —> I — глобальное разрешение прерываний

Если возникнут вопросы, если что-то изложено не понятно или есть вопросы по программе, пишите — отвечу.

(2,4 KiB, 7 012 hits)

Но можно собрать самому в два раза дешевле.
Кому интересно - добро пожаловать под кат.

Начнем по порядку.
Термопара… как термопара. Метр ровно, К типа, 0-800C

Можно врезать в корпус, имеется резьбовая часть, которая вращается свободно. Диаметр 5,8мм, шаг - 0,9~1.0мм, похоже М6 x 1,0 мм. Под ключ на 10


Это все хорошо, дальше что делать? Нужно преобразовать сигнал (термоэдс) в цифровой или аналоговый сигнал, чтоб читать ардуиной. В этом нам поможет . Это преобразователь сигнала термопары K-типа в цифру, имеет интерфейс, что нас устраивает.
А вот и наш герой - ($4.20)


Стоил $4.10, но того лота больше нет (продавец тот же).

Подключать будем к ардуине, можно взять простенькую ($5.25, можно найти дешевле, здесь Вы видите именно эту)


Данные будем писать на карту памяти (и заодно слать в порт) с помощью $1.25.


Интерфейс, тоже, кстати, SPI. Только не все карточки его поддерживают. Не завелось - попробуйте сначала другую.
В теории все линии SPI устройств (MOSI или SI, MISO или SO, SCLK или SCK), кроме CS (CS или SS - выбор микросхемы), можно подключить к одним контактам ардуины, но тогда MAX6675 работает неадекватно. Поэтому я все разнес по разным пинам.
В основу скетча лег пример по работе с картами памяти с .
Библиотека и скетч для MAX6675 . Схема подключения MAX6675:

#include
#include

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 {


}

}
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); // Ждем секунду
}


Скачать:

Термопары широко применяются там где необходимо точно померить высокие температуры, т емпературы вплоть до 2500°C. То есть там, где цифровые датчики бы сразу сдохли от перегрева, применяются термопары. Разновидностей термопар существует достаточно много, но самое большое распространение получили хромель-алюмелевые (тип К) термопары, из-за своей дешевизны и практически линейному изменению термоэдс. Этот вид термопар ставятся в водонагреватели и другие бытовые приборы с контролем температуры, их повсеместно используют для контроля температуры при плавке металла, с помощью этих термопар контролируется нагрев жала в паяльной станции. Поэтому будет весьма полезно познакомиться с ними поближе.

Термопара это два проводника из разных металлов и имеющих общую точку контакта (спай). В точке этого контакта возникает разность потенциалов. Эта разность потенциалов зовется термоэдс и напрямую зависит от температуры, в которой находится спай. Металлы подбираются таким образом, чтобы зависимость термоэдс от температуры нагрева была наиболее линейна. Это упрощает расчет температуры и сокращает погрешность измерений.


Так широко применяемые хромель-алюмелевые термопары имеют достаточно высокую линейность и стабильность показаний на всем диапазоне измеряемых температур.
Ниже приведен график для хромель-алюмелевых термопар (тип К) показывающий, зависимость возникающей термоэдс от температуры спая (в конце статьи будет ссылка на график с большим разряшением):

Таким образом значение термоэдс достаточно умножить на нужный коэффициент и получить температуру, не заморачиваясь с табличными значениями и аппроксимацией - один коэффициент на весь диапазон измерений. Очень просто и понятно.
Но встает вопрос о подключении термопары к микроконтроллеру. Понятно что если на выходе термопары напряжение, тогда задействуем АЦП, но разность потенциалов на выходе термопары слишком мала, чтобы уловить хоть что-то. Поэтому прежде его нужно увеличить, например, применив операционный усилитель.

Берём стандартную схему неинвертирующего включения операционного усилителя:


Отношение входного и выходного напряжений описывается простой формулой:

Vout /Vin = 1 + (R2/R1)

От значений резисторов обратной связи R1 и R2 зависит коэффициент усиления сигнала. Величину усиления сигнала нужно подбирать с учетом того, что будет использоваться в качестве опорного напряжения.

Допустим опорным будет напряжение питания микроконтроллера 5V. Теперь необходимо определится с диапазоном температур, которые собираемся измерять. Я взял пределом измерения 1000 °C. При этом значении температуры на выходе термопары будет потенциал примерно 41,3мВ. Это значение должно соответствовать напряжению в 5 вольт на входе АЦП. Поэтому операционник должен иметь коэффициент усиления не менее 120. В итоге родилась такая схема:


В загашнике у меня нашлась давно собранная плата с этим операционником, собирал как предусилитель для микрофона, ее я и применил:


Собрал на бредборде такую схему подключения двухстрочного дисплея к микроконтроллеру:


Термопара тоже валялась без дела долгое время - она шла в комплекте с моим мультиметром. Спай закрыт в металлическую гильзу.


Код Bascom-AVR для работы с термопарой:

$regfile = "m8def.dat"
$crystal = 8000000

Dim W As Integer

"подключение двухстрочного дисплея

Config Lcdpin = Pin , Rs = Portb . 0 , E = Portd . 7 , Db4 = Portd . 6 , Db5 = Portd . 5 , Db6 = Portb . 7 , Db7 = Portb . 6
Config Lcd = 16 * 2
Cursor Off
Cls

"считывание значения с АЦП по прерыванию от таймера

Config Timer1 = Timer , Prescale = 64
On Timer1 Acp

"конфигурация АЦП

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Enable Interrupts
Enable Timer1

Do

Cls
Rem Температура:
Lcd "Teјѕepaїypa:"
Lowerline
Lcd W


Waitms 200

Loop


"работа с АЦП

Acp :

Start Adc "запуск АЦП
W = Getadc (1 )
W = W / 1 . 28 "подгоняем замеры под действ. температуру
Return

End