Термометр на avr своими руками

Термометр дом-улица на микроконтроллере AVR

Charalampos / Haris Andrianakis, Греция

В статье мы рассмотрим устройство, которое предназначено для установки в помещении для отображения внутренней и внешней температуры и относительной влажности на двухстрочном символьном ЖК индикаторе. Отличительной особенностью схемы является использование цифрового датчика температуры и относительной влажности DHT-11 (DHT-22), который подключается к микроконтроллеру по интерфейсу 1-Wire.

12

3

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

Управление устройством осуществляется с помощью одной кнопки. Программа для микроконтроллера написана на Си, снабжена комментариями, и пользователи могут модифицировать ее под свои конкретные задачи, или же расширить функционал. Для управления ЖК индикатором используется готовая библиотека Peter Fleury (архив для скачивания доступен в разделе загрузок). Дополнительно, данные могут отображаться в градусах Цельсия или Фаренгейта. Имеется несколько режимов управления подсветкой индикатора.

Также стоит отметить еще один важный момент: устройство может осуществлять беспроводную передачу данных по протоколу Bluetooth посредством специального модуля (опционально).

Принципиальная схема

С точки зрения схемотехники устройство несложное, и мы рассмотрим отдельно составляющие элементы.

Источник питания термометра выполнен на базе интегрального регулятора напряжения LM7805 в стандартном включении (с соответствующими фильтрующими конденсаторами). Регулятор напряжения 3.3 В AMS1117 включен в состав схемы, но применяться может в случае использования Bluetooth модуля, т.к. зачастую питание таких модулей 3.3 В.

Индикатор используемый в устройстве – это стандартный двухстрочный индикатор на контроллере HD44780. Транзистор BC547 предназначен для управления подсветкой индикатора логическими сигналами с микроконтроллера или же ШИМ сигналом с микроконтоллера. Резистор R3 ограничивает ток через базу транзистора, резистор R1 подтягивает базу к нулевому потенциалу.

Основа термометра – микроконтроллер Atmel ATmega8, работающий на частоте 8 МГц и управляющий все окружающей периферией.

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

DHT 11 inside 1

DHT 11 inside 2

Основные характеристики:

Следует отметить, что в продаже можно найти датчик DHT-22, который имеет тот же интерфейс, но лучшие характеристики.

Датчик подключается к микроконтроллеру по шине 1-Wire (на схеме кннектор JP3) с использованием подтягивающего резистора по линии данных и блокирующего конденсатора по питанию.

В качестве внутреннего датчика используется широко распространенный аналоговый датчик температуры LM35 IC5, который подключается к каналу 1 АЦП микроконтроллера.

Коннектор J1 интерфейса внутрисхемного программирования микроконтроллера позволяет быстро сменить программный код или обновить ПО. Для подключения термометра по интерфейсу UART используется коннектор JP1. Кнопка управления SW1 подключена ко входу внешнего прерывания микроконтроллера, данный вход подтянут к питанию внутренним резистором порта.

Bluetooth модуль для беспроводной передачи данных, на схеме обозначен как IC3, GP-GC021 также подключается к интерфейсу UART микроконтроллера и позволяет передавать данные на ПК, мобильный телефон или web-сервер. На печатной плате предусмотрено место для установки модуля. В разделе загрузок имеется описание модуля, процесс взаимодействия и команды.

ЖК индикатор устанавливается на лицевую часть печатной платы в коннектор, скрываяя, таким образом, установленные на основной платее компоненты, и мы получаем компактное устройство. Место для установки Bluetooth модуля находится на тыльной стороне печатной платы (см. фото платы).

Внешний вид готовой печатной платы для термометра

AVR termo PCB 1AVR termo PCB 2

Рисунок печатной платы в САПР Eagle

AVR termo PCB 3

Плата с установленными компонентами

AVR termo PCB 4(1)

Плата с установленным Bluetooth модулем

AVR termo PCB 5(1)

Загрузки

Принципиальная схема и печатная плата (Eagle), ПО (исходный код, прошивка) – скачать
Библиотека для работы с ЖК индикатором на контроллере HD44780 – скачать
Техническое описание на Bluetooth модуль GP-GC021 – скачать

Перевод: Vadim по заказу РадиоЛоцман

Источник

Термометр на Attiny85 и термопаре

thermocouplewater

Используя оверсемплинг можно добитсья разрешения менее 1°C, что более чем достаточно для многих задач.

Получение температуры

Как преобразовать напряжение на термопаре в температуру?

Для максимальной точности можно вычислчть полином 9го прядка, используя специальные коэффициенты для К-термопары. Однако для данного проекта это не актуально.

Значение ADC Напряжение (mV) Температура(°C)
0 0 0
128 6.875 168.36
256 13.750 337.02
384 20.625 499.55
512 27.500 661.26
640 34.375 826.91
768 41.250 999.34
896 48.125 1180.53
1024 55.000 1375.09

Затем они были закодированы в виде следующего массива констант, в десятых долях градуса, для линейной интерполяции температуры:

Принцип работы термопары

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

Если термопара подсоединена к электрической цепи, то величина генерируемого напряжения будет отображаться на шкале измерительного прибора. Затем показания прибора могут быть преобразованы в температурные показания с помощью таблицы. На некоторых приборах шкала откалибрована непосредственно в градусах.

Спаи термопары

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

Два спая соединены таким образом, что их напряжение противодействует друг другу. Таким образом, на обоих спаях генерируется одна и та же величина напряжения и показания прибора будут равны нулю. Так как существует прямо пропорциональная зависимость между температурой и величиной напряжения, генерируемой спаем термопары, то два спая будут генерировать одни и те же величины напряжения, когда температура на них будет одинаковой.

Когда спай термопары нагревается, величина напряжения повышается прямо пропорционально. Поток электронов от нагретого спая протекает через другой спай, через измерительный прибор и возвращается обратно на горячий спай. Прибор показывает разницу напряжения между двумя спаями. Разность напряжения между двумя спаями. Разность напряжения, показываемая прибором, преобразуется в температурные показания либо с помощью таблицы, либо прямо отображается на шкале, которая откалибрована в градусах.

Холодный спай термопары

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

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

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

Рабочий спай термопары (горячий)

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

Схема термометра на термопаре

Вот схема термометра на Attiny85, термопере и OLED дисплее:

tinythermocouple

Для индикациия выбран I2C 128×32 OLED-дисплей. Резистор 33kΩ и конденсатор 0.1 µF обеспечивают сброс дисплея при подаче питания, хотя они могут и не понадобиться.

Использована термопара K-типа.

thermocoupleprobe

Программа

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

Измерение внутренней температуры

Процедура настройки АЦП для измерения внутренней температуры заключается в следующем:

Процедура ReadInternal() выполняет чтение; она просто переводит процессор в спящий режим. АЦП генерирует прерывание для пробуждения процессора после завершения преобразования, после чего программа считывает и возвращает значение регистра АЦП:

Измерение напряжения термопары

Аналогичная процедура настраивает АЦП для измерения термопары:

Процедура ReadThermocouple () фактически производит чтение:

Преобразование термоэлектрического напряжения в температуру

Значение АЦП из ReadThermocouple () преобразуется в температуру с помощью кусочно-линейной интерполяции, как описано в разделе Получение температуры выше. Для большей точности используется сумма четырех последовательных показаний АЦП; процедура Convert () принимает это значение и использует значения в массиве Temperature[] для преобразования его в температуру, в градусах::

Если параметр для Convert() является точным кратным n от 512, то температур равнаs Temperature[n]/10. В противном случае температура интерполируется между Temperature[n] и Temperature[n+1].

Отображение информации

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

Повышение точности

Есть два фактора, которые влияют на точность термометра, и вы можете откалибровать каждый из них, чтобы улучшить точность.

Внутренний датчик температуры

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

Смещение АЦП

При отсутствии входного сигнала на дифференциальном входе x20 обычно имеется небольшое смещение, которое добавляется к каждому показанию. Чтобы измерить его:

Тестирование

Обратите внимание, что перед использованием термометра термопары в точных задачах вы должны протестировать его при известных температурах. Этот термометр проверялся с помощью промышленного термометра в кипящей воде при 100°C и в оливковым масле при 220°C, и показания были в пределах 5°C в каждом случае.

thermocouple2

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

Компиляция программы

Компилировалась программа с помощью Spence Konde’s ATTiny Core. Нужно выбрать контроллер ATtiny25/45/85 в разделе ATTinyCore меню Board. Затем проверьте, что следующие параметры установлены данным образом (игнорируйте другие параметры):

Chip: «ATtiny85»
Clock: «1 MHz (internal)»
B.O.D: «B.O.D. Disabled»
Timer 1 Clock: «CPU»

Это настройки фьюхов по умолчанию для нового ATtiny85, но если вы ранее использовали ATtiny85 с другими настройками, выберите Burn Bootloader, чтобы установить фьюзы соответствующим образом.

Затем загрузите программу с помощью ISP (внутрисистемное Программирование);

Источник

Урок 12. Измерение температуры при помощи AVR. Простой термометр на AVR.

termoПродолжаем осваивать периферию, на очереди измерение температуры. Рассмотрим вариант измерения, при помощи датчика температуры DS18b20.

les12 2

Для сборки схемы понадобится жк дисплей, датчик и резистор на 4,7кОм. Теперь перейдем непосредственно к прошивке.

Теперь обо всем по порядку:

Данный код означает, что датчик подключен к порту В, PB2 ножке

Используется протокол 1wire, тип датчика ds18b20

float temper; w1_init(); ds18b20_init(0,-20,50,DS18B20_12BIT_RES);

temper=ds18b20_temperature(0); sprintf(lcd_buf,»t=%.1f\xdfC»,temper); lcd_clear(); lcd_puts(lcd_buf); delay_ms(1500);

temper=ds18b20_temperature(0); — читаем значение температуры с датчика
sprintf(lcd_buf,»t=%.1f\xdfC»,temper); преобразовываем к понятному для lcd виду %.1f — вывод числа с плавающей точкой 1 знак после запятой, не забываем в свойствах проекта указать (s)printf features float.
\xdf — вывод на экран значка градуса.

В результате должно получиться нечто похожее
les12 4

Отрицательной температуры поблизости не было :D, поэтому попробовал остудить бутылочкой соуса из холодильника, результат что то не сильно впечатлил.
les12 5

Зато от нагрева рукой, температура довольно быстро повысилась.
les12 3
Проект доступен тут
Проект для DS18s20
Проект для двух датчиков
Проект для DS18b20 на семисегментниках
Проект Алексея(Alyes)для Atmega16 и шести сегментов + бонус видео устройства

249 комментариев: Урок 12. Измерение температуры при помощи AVR. Простой термометр на AVR.

no avatar

no avatar

это нормально 🙂 попробуйте реже опрашивать для начала.

no avatar

Здравствуйте Уважаемый Admin! Подскажите пожалуйста как в Codevisionavr 2.05 сделать проект с двумя и более температурными датчиками DS18B20? В конце Вашей статьи есть Проект Алексея(Alyes), выполненный в CVAVR 2.05, но заставить работать его с двумя датчиками никак не могу добиться. Подскажите пожалуйста куда какие стоки нужно добавить?
Спасибо.

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

// 1 Wire Bus interface functions
#include

// DS1820 Temperature Sensor functions
#include

void main(void)
<
// Declare your local variables here
float temper;
unsigned int x;

// 1 Wire Bus initialization
// 1 Wire Data port: PORTD
// 1 Wire Data bit: 7
// Note: 1 Wire port settings must be specified in the
// Project|Configure|C Compiler|Libraries|1 Wire IDE menu.
w1_init();
ds18b20_init(0,-20,50,DS18B20_12BIT_RES);

// Global enable interrupts
#asm(«sei»)

while (1)
<
temper=ds18b20_temperature(0);
if (temper>1000)
<
temper=4096.0-temper;
minus=1;
>

x=temper*10;
nom4=x%10;//разборка целого числа на отдельный сегмент…
x=x/10;
nom3=x%10;
nom2=x/10;
nom5=10;
nom6=11;
if(minus==0)
<
nom1=12;
>
else
<
nom1=13;
>
>
>

Источник

Термометр на ATTINY2313+DS18B20 доработанный

4a4919

При перегрузке портов МК, яркость свечения индикатора может снизиться, а также можно пожечь ножки микроконтроллера. Несколько лет назад я собирал термометр на ATtiny2313+DS18B20 по схеме с интернета. Схема была без ключевых транзисторов. При температуре 18 градусов, цифра «1» светилась ярко, а цифра «8» светилась заметно тусклее, надеюсь всем понятно почему всё происходит именно так. Поэтому я пообещал себе в будущем не перегружать ножки МК. Вот кстати фотка того термометра, собранного по схеме из инета, думаю что в комментариях не нуждается:

bcb3de

Также хотелось сделать несколько доработок:
* вывести на индикатор символ градуса (десятые доли градуса мне были не так критичны);
* затактировать микроконтроллер от внешнего кварца, так как протокол «1-Wire», который использует датчик, критичен к формированию временнЫх интервалов (тайм-слотов), поэтому молиться о стабильности встроенного тактового генератора мне не хотелось;
* ввести в программу проверку контрольной суммы, при несовпадении контрольной суммы выводить на индикатор: «Crc»;
* добавить в схему диод (для защиты схемы от переполюсовки питания);
* при подаче питания в течении 1 секунды засветить все сегменты (так называемый тест сегментов).

Проект я написал в среде AVR Studio 5, функции работы с датчиком нашёл где-то в инете, а остальное переписал на свой лад, обильно снабдив комментраиями исходный код. В конце статьи есть ссылка на скачивание прошивки и исходника.

Семисегментный индикатор я использовал на 3 знакоместа, сегменты с общим анодом. Также в архиве (в конце статьи) есть прошивки под индикатор с общим катодом. Общие выводы сегментов я подключил сразу к двум выводам МК, соединённым параллельно. Таким образом, каждый общий вывод сегментного индикатора использует 2 ножки МК для повышения нагрузочной способности выводов.

ff4e18

Микроконтроллер я использовал ATtiny2313A (также можно использовать ATtiny2313 или ATtiny2313L), задействовал практически все свободные ножки (за исключением ножки сброса). Если собирать термометр на ATmega8, то можно соединять параллельно по 3 или по 4 ножки для повышения нагрузочной способности портов.

910958

Прилагаю фотографии собранного термометра. Корпуса покачто нет, так как термометр будет встраиваться в корпус ПК.

7f2b8e

a69f85

f30f89

bfb3dc

a4563e

Индикация.
Не подключен датчик температуры, либо короткое замыкание на линии данных:
722c16

Ошибка контрольной суммы (CRC):
32cd4a

Подключен датчик температуры, температура от 0 до 9 градусов:
a1e0fe

Подключен датчик температуры, температура от 10 до 99 градусов:
efd0a6

Подключен датчик температуры, температура от 100 до 125 градусов:
9f2c8a

Частота динамической индикации — несколько килогерц, благодаря чему мерцание на глаз не заметно даже при броском взгляде на индикатор.
Для желающих повторить конструкцию я скомпилировал несколько прошивок под разные кварцы: 4 МГц, 8 МГц, 10 МГц, 12 МГц, 16 МГц.
Также сделал прошивки под индикаторы с общим анодом (ОА), и с общим катодом (ОК). Все прошивки в архиве (см. ниже).

г.Вельск, Апрель 2014г.
P.S. Первоначально материал разместил тут.

UPD. Обновил прошивку. Мелкие исправления, мелкие плюшечки. Из основного — stdint типы данных, гибкая настройка ног под сегменты. Все изменения описаны в шапке исходника.
В связи с большим наплывом желающих выкинуть кварц из схемы, и не читающих зачем он в схеме нужен, отключил комментарии.

Источник

Цифровой термометр на ATMega8

Добрый день! Хочу поделиться с сообществом своей реализацией цифрового бытового термометра на контроллере ATMega8 и датчиках DS18x20.

Вступление
Немного предистории…
Это не первая конструкция электронного термометра, собранного мною. Несколько ранее (когда я был знаком только с PIC контроллерами) я собрал бытовой термометр на PIC16F628, датчиках DS18S20 и 2-х строчном ЖК индикаторе на основе контроллера HD44780. Программу писал, на C с использованием среды PIC C Compiler. Использовал готовые библиотеки кода для общения с датчиками и LCD дисплеем. Электронную схему выполнил на макетке, все детали в DIP корпусах.

70a23b

Этот термометр до сих пор исправно работает (установлен на кухне) и показывает температуру «за бортом» и на балконе.
Спустя некоторое время, после знакомства с AVR и освоения ЛУТ технологии в связке с SMD компонентами у меня и зародилась идея создать более компактную и более дешевую версию такого цифрового термометра.
Вот что из этого получилось.

Конструкция
Схема электрическая принципиальная:

12edb6

fb80f2

Размеры телефонной розетки наложили жесткие ограничения на размер печатной платы. Поэтому всю разводку электрической схемы на дорожках выполнить не удалось — пришлось применять некоторое количество коротких отрезков провода МГТФ. Также я отказался от применения внешнего кварцевого резонатора и использовал внутренний RC генератор 1МГц.
Два разъема RJ11 служат для подключения внешнего источника питания и выносного датчика температуры DS18x20. Причем оба разъема равнозначны и их нельзя перепутать, т.к. цепи питания и шина 1-Wire разнесены на разные контакты (получилась небольшая защита от «дурака»). Блок питания и выносной датчик (можно и не один) подключаются обычными телефонными 4-х жильными проводами с разъемом RJ11. Датчики DS18x20 необходимо хорошенько изолировать от воздействия окружающей среды при работе на открытом воздухе. В своей конструкции я вывел 2-ой датчик температуры из корпуса прибора наружу на коротком проводнике (измерение температуры в комнате).
Далее приведу фото получившейся конструкции:

fc1f57

c83f42

5e13c8

Для индикации минусовой температуры служит отдельный светодиод. Первоначально я хотел поставить прямоугольный советский светодиод (не помню марку, вроде КИПМО какой-то), но мощность излучения оставляла желать лучшего… Поэтому я его заменил на SMD светодиод красного свечения:

67dd2c

Программная часть
Код писался в CV AVR. Использовал библиотеку «ds18b20.h». Использовалась динамическая индикация. Переключение между индикаторами происходит программно по прерыванию таймера.
Полностью приводить код не буду. Покажу только главный цикл:

Внимание! Прошивка и исходный код написаны для индикатора с общим катодом.
Некоторые пояснения по коду:
Временное отключение прерываний в коде связано с тем, что необходимо точно соблюсти временные интервалы при работе с датчиками 1-Wire. В моменты, когда прерывания отключаются также теряется динамическая индикация светодиодного индикатора, поэтому на это время индикатор нужно гасить.

Для более детального изучения работы с температурными датчиками DS18x20 обратитесь к даташитам. Также имеется пример работы с ними в среде CV AVR.

Заключение
Демонстрация работы:

Все замечания и предложения приветствуются. Надеюсь, для кого-нибудь данная статья окажется полезной.
Также, привожу все файлы (схема, плата, исх. код) проекта.
Даташит на DS18S20.
Даташит на DS18B20.

Источник

Поделиться с друзьями
admin
Здоровая спина
Adblock
detector