Терморегулятор для холодильника на микроконтроллере ATMEGA8 и термодатчике DS18B20. Схема, плата, прошивка » Журнал практической электроники Датагор (Datagor Practical Electronics Magazine)

Здравствуйте, дорогие читатели Датагор.ру! Сегодня я расскажу о своём проекте, который родился на свет, благодаря выходу из строя одной из важнейшей части моего холодильника — терморегулятора.

Камрад, рассмотри датагорские рекомендации

🌻 Купон до 1000₽ для новичка на Aliexpress

Никогда не затаривался у китайцев? Пришло время начать!
Камрад, регистрируйся на Али по нашей ссылке. Ты получишь скидочный купон на первый заказ. Не тяни, условия акции меняются.

🌼 Полезные и проверенные железяки, можно брать

Куплено и опробовано читателями или в лаборатории редакции.

Функции цифрового термостата

Термостат может быть запрограммирован с 8 рабочими параметрами, это рабочий режим, имеется 5 режимов:

  • режим 1 — два независимых канала охлаждения
  • режим 2 — два независимых канала, один охлаждающий, один нагревательный
  • режим 3 — два независимых канала нагрева
  • режим 4 — один дифференциальный канал охлаждения
  • режим 5 — один дифференциальный канал нагрева

Пороговые значения температуры от T1 до T4 для включения или выключения выходов, в зависимости от режима работы. Ошибка I1, Ошибка I2, программирование выходное действие после отключения или выхода из строя датчика.

Двухканальный цифровой термостат: схема на контроллере Atmega8

Подсветка дисплея также управляемая: включить подсветку, выключить подсветку, включить подсветку на 30 секунд после нажатия клавиши.

Двухканальный цифровой термостат: схема на контроллере Atmega8

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

Двухканальный цифровой термостат: схема на контроллере Atmega8

Как выглядит алгоритм работы? Алгоритм просто сравнивает фактическую температуру с пороговыми значениями, установленными пользователем. При установке пороговых значений температуры программа следит за тем, чтобы:

  • диапазон датчиков не превышался
  • температура включения была выше температуры выключения (режим охлаждения) не менее чем на 0,5 C.

Все меню (8 параметров и возможность выхода из режима программирования) вместе с проверкой введенных параметров с учетом режима работы занимало больше места в памяти, чем основная программа. Основная программа — поддержка датчиков — считывание температуры, преобразование данных, отображение данных на дисплее. И соответствующее управление выходами с учетом: считываемой температуры, рабочего режима и заданных пользователем пороговых значений. Все это заняло 8 кБ памяти.

Термостат на PIC контроллере

Термостат

– поддерживает заданную температуру, в определённой среде.

Задумка

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

Термостат на PIC контроллере

Характеристики:

– Номинальное напряжение, частота сети, В/Гц __220 / 50; – Потребляемая мощность, кВт ____ 1 / 2 кВт; – Отдача тепла, м3/час _____200;

Управление

Тепловентилятор есть, теперь необходимо сделать умную систему управления и контроля. Поискав в интернете нашлась схема из журнала Р-К №11/2008г., – «Цифровой термостат». Конструкция оказалась простой, как по мне, с двухстрочным цифровым экранчиком. Ниже приведена схема, нарисованная в программе SPlan 7.0.


По характеристикам термостат способен задавать температуру от -25 до +75°С, при шаге 0,25°С. Так же можно задать в предустановках меню спад и нарастание температуры шагом по 0,1°С.
Работа с термостатом осуществляется с помощью кнопок. Кнопками «+» и «-» (S1 и S2) определяется значения температуры или спада (нарастания), кнопка «MODE» (S3) – режим установки.

Для того чтобы задать температуру поддержания, нажимаем кнопку S3 и удерживаем её пока на экране не засветится «SET TEMPERATURE».


Кнопкой S1 и S2 устанавливаем необходимый спад (нарастание).


При последующем нажатии кнопки S3, происходит возврат к отображению текущей температуры.


Контроль температуры осуществляется при помощи цифрового термометра А1 – DS1820. Это готовый элемент, не нуждающийся в настройке. Термодатчик изготовлен в виде отдельного элемента, присоединяемого к основному блоку экранированным проводом со штекером 3,5мм (аудио).


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


Управление схемой происходит микроконтроллером PIC16F628. Тактовая частота организована кварцом ZQ1 с частотой резонанса – 4МГц.

Управление тепловентилятором происходит с симистором VS1 – BT136. Управление симистором осуществляется при помощи оптопары MOC3043. Силовую схему управления тепловентилятора я дополнил промежуточным реле. Катушка реле стала играть роль нагрузки симистора, а её контакты запараллелил и скомутировал в цепь питания тепловентилятора.

Схема оперативного питания выполнена на малогабаритном герметичном трансформаторе, у него сдвоенная вторичная обмотка, 9V-0-9V, на номинальный ток 100mA. Выпрямитель исполнен на на двух диодах VD1и VD2. Если трансформатор с одной понижающей обмоткой необходимо применить схему моста. Контроллер и дисплей запитан от +5V через стабилизатор напряжения А2 (7805).

Для отключения подсветки пин 16 экрана можно отключить, или как я поставил выключатель. Печатная плата термостата, чисто моя разработка.


Собранный вид платы управления:


В файле термостат.lay есть несколько страниц.

Корпус

Третья задача – корпус. Выбрал Z20. Ниже приведена технология подгонки корпуса и изготовления отверстий при помощи шаблонов.

Всё поместилось в корпус. Установлена розетка для подключения коммутируемой нагрузки.

Файлы:

datasheet.rar [4.08 Mb] (скачиваний: 631) plata-spl.rar [70.96 Kb] (скачиваний: 683) rk_2008_11.rar [2.79 Mb] (скачиваний: 779) termo.hex.rar [2.31 Kb] (скачиваний: 761)

Источник (Source)

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

Терморегулятор на микроконтроллере PIC16F676

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

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

Принципиальная схема разделена на блоки.


Принципиальная схема термометра на PIC16F628 и DHT11 Блок питания Приводит входное напряжение к значению 5 вольт. Использует стабилизатор напряжения LM7805. ICSP Это 5-пиновый разъем, подключенный к выводам программирования микроконтроллера. Мы используем этот разъем для прошивки микроконтроллера. DHT11 Это 3-пиновый разъем, к которому подключен датчик. Средний вывод подключен к микроконтроллеру для передачи данных. MCU Это PIC16F628, который принимает данные от DHT11 и выводит их на LCD дисплей. Дисплей LCD дисплей (2 строки по 16 символов), который показывает влажность и температуру воздуха.

Микроконтроллер у нас будет работать от внутреннего тактового генератора с частотой 4 МГц. Поэтому на схеме нам не нужен кварцевый резонатор.

Eagle сгенерировала нам следующий перечень элементов:
Термометр на PIC16F628 и DHT11. Перечень элементов

Позиционное обозначение Номинал Элемент Корпус Библиотека Лист
C1 0.1uF C-EU025-050X050 C025-050X050 rcl 1
C2 100uF CPOL-EUE2.5-5 E2,5-5 rcl 1
C3 0.1uF C-EU025-050X050 C025-050X050 rcl 1
C4 100uF CPOL-EUE2.5-5 E2,5-5 rcl 1
C5 0.1uF C-EU025-050X050 C025-050X050 rcl 1
D1 1N4004 1N4004 DO41-10 diode 1
IC2 7805TV 7805TV TO220V linear 1
IC3 PIC16F628 DIL18 DIL18 ic-package 1
JP1 ICSP PINHD-1X5 1X05 pinhead 1
JP2 16×02 LCD PINHD-1X16 1X16 pinhead 1
JP3 DHT11 PINHD-1X3 1X03 pinhead 1
R1 10K R-EU_0204/7 0204/7 rcl 1
R2 5K TRIM_EU-LI10 LI10 pot 1
R3 4K7 R-EU_0204/7 0204/7 rcl 1
S1 Reset TAC_SWITCHPTH TACTILE-PTH SparkFun 1
X1 7-35vDC W237-10 W237-102 con-wago-500 1

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

Конструкция и сборка

Регулятор температуры построен на односторонней плате размером 65 x 100 мм, разработана в EAGLE. Несколько элементов, например микроконтроллер, расположены под дисплеем.

Двухканальный цифровой термостат: схема на контроллере Atmega8

Выходы термостата представляют собой два реле 250 В 16 А, поэтому можно легко подключить к ним потребители на приличную мощность. Всё питается от 12 В постоянного тока. Термостат уже долго работает без сбоев.

  • Файлы проекта во вложении

Фото и видео


Макет термометра на PIC16F628A и DHT11 с LCD


Макет термометра на PIC16F628A и DHT11 с LCD (микроконтроллер)


Макет термометра на PIC16F628A и DHT11 с LCD (дисплей)


Макет термометра на PIC16F628A и DHT11 с LCD (датчик температуры и относительной влажности воздуха)
Оригинал статьи:

  • How to Use a DHT11 with a PIC16F628A and LCD

Позиционный принцип терморегулирования

Для регулирования температуры какого-либо объекта можно на выбор использовать несколько алгоритмов. В промышленных системах наиболее часто встречается позиционное управление, либо управление по ПИ или ПИД закону. Наиболее просто реализуется позиционный принцип. Его можно встретить в огромном количестве устройств. Практически все современные полупроводниковые датчики температуры имеют встроенный выход термостатирования, позволяющий максимально упростить итоговую систему. Но подобный подход отличается неинформативностью и сложностью перенастройки. Решить эту проблему можно с применением микроконтроллера и какого-либо индикатора.

Структурная схема терморегулятора

Структурная схема терморегулятора

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

Позиционное управление температурой

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

Программа

При установке компилятора XC8 вы также добавили и некоторые заголовочные и исходные файлы. В этом руководстве мы используем файлы библиотеки по работе с LCD, которые идут с компилятором XC8: XLCD.H и несколько исходных файлов. Чтобы всё немного упростить, я скопировал содержимое всех исходных файлов в один файл. На моей установке Ubuntu исходные файлы XLCD находятся в каталоге:

/opt/microchip/xc8/v1.34/sources/pic18/plib/XLCD

Там было 10 файлов, bysyxlcd.c, openxlcd.c, putrxlcd.c и т.д.. Я поместил содержимое всех этих файлов в один файл и назвал его my_xlcd.c. Этот файл теперь содержит все функции. Файлы my_xlcd.c и xlcd.h необходимо скопировать в каталог проекта (файл xlcd.h находился в каталоге /opt/microchip/xc8/v1.34/include/plib). Файл xlcd.h – это стандартный файл, который нуждается в небольшом редактировании. Нам необходимо изменить данные о подключении LCD к микроконтроллеру, чтобы они совпадали с нашей схемой:

/* DATA_PORT определяет порт, к которому подключены линии данных LCD */ #define DATA_PORT PORTB #define TRIS_DATA_PORT TRISB /* CTRL_PORT определяет порт, к которому подключены линии управления. * Это просто для примера, измените их для вашего приложения. */ #define RW_PIN PORTAbits.RA0 /* PORT для RW */ #define TRIS_RW TRISAbits.TRISA0 /* TRIS для RW */ #define RS_PIN PORTAbits.RA1 /* PORT для RS */ #define TRIS_RS TRISAbits.TRISA1 /* TRIS для RS */ #define E_PIN PORTAbits.RA7 /* PORT для D */ #define TRIS_E TRISAbits.TRISA7 /* TRIS для E */

Теперь связь между LCD дисплеем и микроконтроллером задана. С этими двумя файлами (my_xlcd.h и my_xlcd.c) больше ничего делать не требуется.

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

// Заголовочные файлы #include // Стандартная библиотека ввода-вывода #include // Стандартная библиотека функций #include // Библиотека компилятора XC8 #include «my_xlcd.h» // Наша библиотека LCD // Конфигурация #pragma config FOSC = INTOSCIO // Биты выбора тактового генератора (внутренний RC генератор: выводы RA6/OSC2/CLKOUT и RA7/OSC1/CLKIN работают, как входы/выходы) #pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT выключен) #pragma config PWRTE = ON // Бит включения таймера запуска (PWRT включен) #pragma config MCLRE = ON // Выбор режима работы вывода RA5/MCLR (вывод RA5/MCLR действует, как MCLR) #pragma config BOREN = ON // Бит включения сброса при просадке напряжения питания (сброс BOD включен) #pragma config LVP = ON // Бит включения низковольтного программирования (вывод RB4/PGM действует, как PGM, низковольтное программирование включено) #pragma config CPD = OFF // Бит защиты данных EEPROM (защита данных выключена) #pragma config CP = OFF // Биты защиты кода программы (защита кода программы выключена) // Определения #define _XTAL_FREQ 4000000 // Говорим компилятору, что используем 4 МГц #define data PORTAbits.RA2 // Определение RA0, как вывода данных #define data_dir TRISAbits.TRISA2 // Определение TRISA0, как порта данных // Глобальные переменные char message1[] = «Temp = 00.0 c»; char message2[] = «RH = 00.0 %»; unsigned short TOUT = 0, CheckSum, i; unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2; // Прототипы функций void init_XLCD(void); void DelayFor18TCY(void); void DelayPORXLCD(void); void DelayXLCD(void); void Delay10KTCYx(unsigned char); void StartSignal(void); unsigned short ReadByte(); unsigned short CheckResponse();

Чтобы заставить LCD дисплей работать с нашим микроконтроллером, нам необходимо создать несколько функций задержек. В начале вашего файла XLCD.H говорится, что:

Пользователь должен обеспечить три функции задержки:

  • DelayFor18TCY() обеспечивает задержку в 18 циклов;
  • DelayPORXLCD() обеспечивает задержку в 15 мс;
  • DelayXLCD() обеспечивает задержку в 5 мс.

Мы должны добавить еще и четвертую функцию задержки, Delay10KTCYx

Ниже приведены функция инициализации LCD и функции задержек:

// Функции void init_XLCD(void){ OpenXLCD(FOUR_BIT & LINES_5X7); // Установить 4-битный режим и символы 5×7 while(BusyXLCD()); // Проверить, занят ли LCD WriteCmdXLCD(0x06); // Перенести курсов вправо WriteCmdXLCD(0x0C); // Дисплей включить, курсор выключить } void DelayFor18TCY(void){ // как сказано в файле XLCD.H NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); return; } void DelayPORXLCD(void){ // как сказано в файле XLCD.H __delay_ms(15); } void DelayXLCD(void){ // как сказано в файле XLCD.H __delay_ms(5); } void Delay10KTCYx(unsigned char){ // как сказано в файле XLCD.H __delay_ms(10); }

Далее на очереди функции подачи стартового сигнала, чтения байта и проверки ответа:

void StartSignal(){ data_dir = 0; // Установить TRISA2 на выход data = 0; // Установить на RA2 низкий уровень __delay_ms(18); // Ждать 18 мс data = 1; // Установить на RA2 высокий уровень __delay_us(20); // Ждать 20 мс data_dir = 1; // Установить TRISA2 на вход } unsigned short ReadByte(){ unsigned short num = 0, t; data_dir = 1; // Установить TRISA2 на вход for (i=0;i<8;i++){ // Начать цикл while(!data); // Когда данные не действительны TMR2 = 0; // Установить TMR2 в 0 T2CONbits.TMR2ON = 1; // Запустить TMR2 от 0, когда обнаруживается фронт while(data); // импульса, и ждать спада импульса T2CONbits.TMR2ON = 0; // Остановить TMR2, после спада импульса данных if(TMR2>40) num |= 1 << (7-i); // Если время > 40 мкс, то данные равны 1 } return num; // Вернуть 8-бит = 1-байт } unsigned short CheckResponse(){ TOUT = 0; TMR2 = 0; T2CONbits.TMR2ON = 1; // Включить TMR2 while(!data && !TOUT); if (TOUT) return 0; // Вернуть 0 => OK else { TMR2 = 0; // Выключить Timer 2 while(data && !TOUT); if(TOUT) return 0; // Если Tout = 1, вернуть 0 => OK else { T2CONbits.TMR2ON = 0; // Выключить TMR2 return 1; // Вернуть 1 => NOT OK } } }

Чтобы узнать, когда микроконтроллер передает сигнал старта, и когда DHT11 закончил передачу своих 40 бит, нам нужна функция прерывания:

void interrupt tc_int(void){ if(PIR1bits.TMR2IF){ // Если установлен флаг прерывания от совпадения TMR2 и PR2 TOUT = 1; T2CONbits.TMR2ON = 0; // Остановить таймер PIR1bits.TMR2IF = 0; // Очистить флаг прерывания TMR2 } }

И наконец, основная часть программы:

int main(int argc, char** argv) { unsigned short check; TRISB = 0b00000000; // TRISB выход PORTB = 0b00000000; // PORTB низкий уровень TRISA = 0b00000001; // TRISA выход PORTA = 0b00000000; // PORTA низкий уровень CMCON = 0x07; // Компараторы выключены // TIMER INTCONbits.GIE = 1; // Включить глобальное прерывание INTCONbits.PEIE = 1; // Включить прерывание периферии PIE1bits.TMR2IE = 1; // Включить прерывание Timer2 T2CON = 0; // Предделитель 1:1, Timer2 изначально выключен PIR1bits.TMR2IF = 0; // Очистить флаг прерывания TMR INT TMR2 = 0; init_XLCD(); // Инициализация LCD putrsXLCD(» Hello World.»); // Текст приветствия SetDDRamAddr(0x40); // Переместить курсор на строку 2 putrsXLCD(» I’m alive.»); __delay_ms(250); do { __delay_ms(1000); StartSignal(); // Передать сигнал старта check = CheckResponse(); // Присвоить check 0 = OK, или 1 = NOT OK if(!check) { // OK check = 1 => NOT OK WriteCmdXLCD(0x01); // Очистить экран, установить курсор в позицию 0,0 putrsXLCD(«No response.»); // Вывести сообщение об ошибке SetDDRamAddr(0x40); putrsXLCD(«Please check.»); } else { // IF check = 0 => OK RH_Byte1 = ReadByte(); // Прочитать первый байт RH_Byte2 = ReadByte(); // Прочитать второй байт T_Byte1 = ReadByte(); // Прочитать третий байт T_Byte2 = ReadByte(); // Прочитать четвертый байт CheckSum = ReadByte(); // Прочитать контрольную сумму // Проверить, соответствуют ли все байты контрольной сумме if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)) { message1[7] = T_Byte1/10 + 48; // Извлечь десятки message1[8] = T_Byte1 + 48; // Извлечь единицы message1[10]= T_Byte2/10 + 48; // Извлечь десятые доли message1[11] = 223; // ASCII код для символа градусов message2[7] = RH_Byte1/10 + 48; // Извлечь десятки message2[8] = RH_Byte1 + 48; // Извлечь единицы message2[10] = RH_Byte2/10 + 48; // Извлечь десятые доли WriteCmdXLCD(0x01); putrsXLCD(message1); // Записать значение температуры на LCD SetDDRamAddr(0x40); putrsXLCD(message2); // Записать значение влажности на LCD } else { // Контрольная сумма некорректна WriteCmdXLCD(0x01); putrsXLCD(«Checksum error!»); SetDDRamAddr(0x40); putrsXLCD(«Please wait.»); } } } while (1); // Выполнять это постоянно. }

Это был один из способов использования DHT11 совместно с PIC контроллером и LCD дисплеем.

Аппаратная часть

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


Структурная схема термометра на PIC16F628, DHT11 и LCD (может показаться избыточным, составлять структурную схему для каждой мелочи, но это может быть полезно)

Мы хотим, чтобы DHT11 передавал данные микроконтроллеру.

Мы хотим, чтобы микроконтроллер обрабатывал данные и отображал их на LCD дисплее.

Мы хотим, чтобы у нас была возможность прошивать микроконтроллер через ICSP.

Нам потребуется

Чтобы выполнить этот проект вам понадобится следующее:

  • компьютер с установленными MPLAB X IDE и компилятором XC8 версии 1.34 от Microchip (я использую MPLAB X версии 3.05 и XC8 версии 1.34);
  • микроконтроллер PIC16F628;
  • LCD (HD44780 или аналог);
  • датчик температуры и относительной влажности воздуха DHT11;
  • инструмент для прошивки микроконтроллера (я испльзую PICkit3);
  • компоненты, перечисленные в перечне элементов из Eagle;
  • если вы хотите собрать макет схемы, то вам понадобится макетная плата и несколько перемычек.
Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...