2. Специальный раздел
терморегулятор микроконтроллер инициализация схема
2.1 Конструкция устройства
Блок управления собран на печатной плате из фольгированного
стеклотекстолита толщиной 1 мм. Её размер 123х82мм . Следует устанавливать на
плату в первую очередь следует те детали, выводы которых должны быть припаяны к
печатным проводникам на ее верхней стороне. Необходимо хорошо залудить
проводники на плате, все таки по ним протекает значительный импульсный ток..
Для удобства монтажа на плате показано расположение элементов.
2.2 Блок схема работы программы и подпрограмм
2.3 Описание работы блоков программы
Блок Инициализации микроконтроллера: Определение работоспособности микроконтроллера, запуск микроконтроллера.
Блок Старта программы, установка даты и времени: Запуск программы, установка часов реального времени.
Блок Подключение опроса: производится поиск всех датчиков на шине 1-wire. Предусмотрена возможность установки одного и того же датчика на несколько каналов управления.
Блок Включения нагрузки: включение нагрузки в определенном промежутке
времени, по определенным дням недели, дням в месяце, или по выбранным месяцам.
2.4 Код программы
$regfile = "m32def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 10
$framesize = 40
'$sim
$lib "ds1307clock.lib" ' modified lib
$lib "lcd4busy.lib"
$lib "Double.lbx"
Config Lcd = 16 * 2 ' Определяем тип дисплея 16 знаков на 2 строки
Cursor Off Noblink ' Выключаем курсур на LCD
'Определяем константы
_lcdport = Portb ' Порт для работы LCD дисплея
Const _lcdddr = Ddrb_lcdin = Pinb_lcd_e = 0 ' pin для сигнала E LCD_lcd_rw = 1 ' pin для сигнала RW LCD_lcd_rs = 2 ' pin для сигнала RS LCDRepeatstart = 15Speed = 1
'Определяем scl и sda выводы для работы DS1307Sda = Portc.1Scl = Portc.0
'Определяем куда шина 1wire подключена1wire = Portd.7
'адреса ds1307Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
' Константы коды клавиатуры
Const Key_enter = 0Key_arr_up = 1Key_arr_lf = 2Key_arr_rt = 3Key_arr_dn = 4Key_menu = 5Key_pwr = 6Key_no = 255Key_yes = 254Key_fast = 128
Const Channel = 1 'Канал АЦП к которому подключена клавиатураClock = User
' Запускаем АЦП микроконтроллера
Config Adc = Single , Prescaler = 8 , Reference = AvccAdc
'Декларируем функцииSub Findds18b20Function Gettemperature(byval Numds As Integer) As SingleSub Convallt ' Convert T on ALL sensorsFunction Decigrades(byval Sc(9) As Byte) As SingleFunction Getkey() As ByteFunction Readkeyboard() As ByteSub Lcd_print_cp(byval Txt As String)
'декларируем переменные
'Массив 8 * 8Dsidm(64) As Byte
Dim Dsid(8) As ByteDg As Integer 'DECIgrades, I call it, cause I have no space for commas on the display....Temperature As SingleL As IntegerB As IntegerSc(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20
'Sc(1) 'Temperature LSB
'Sc(2) 'Temperature MSB
'Sc(3) 'TH/user byte 1 also SRAM
'Sc(4) 'TL/user byte 2 also SRAM
'Sc(5) 'config also SRAM x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care
'Sc(6) 'res
'Sc(7) 'res
'Sc(8) 'res
'Sc(9) '8 CRC
'DALLAS DS18B20 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite....
'&H 33 read rom - single sensor
'&H 55 match rom, followed by 64 bits
'&H CC skip rom
'&H EC alarm search - ongoining alarm >TH <TL
'&H BE read scratchpad
'&H 44 convert T
'begin Переменные для клавиатуры
Dim Key_old As Byte ' Код ранее нажатой клавиши
Dim Clockcounter As Integer ' СчётчикKey_delay_repeat As Integer ' Задержка повтораKey_delay_start_repeat As Integer ' Задержка запуска повтора
'end Перемненные для клавиатурыWeekday As Byte
Dim Dscount As ByteKeys As BytePulses As Word , Periods As Word ' Переменные для пищалки
Pulses = 130 : Periods = 20 ' устанавливаем кол - во импульсов и период их следования для пищалкиAlias Portd.5 ' Ссылка на порт динамика
Int0 Int0_int 'Инициализируем и запускаем перывание INT0
Enable InterruptsInt0 'включаем прерыввания
Clockcounter = 0
'''' Основной текст программы
'Cls
'Locate 1 , 1
'Lcd_print_cp "Привет"
'Lcd_print_cp
"Всего датчиков"
'Waitms 1000
' Установка даты и времени в DS1307
'Time$ = "23:58:59" ' приваиваем время
'Date$ = "11-13-02" ' устанавливаем дату 13 november 2002
' Определяем количество датчиков и ищем их всех
Findds18b201 , 1_print_cp "Приветсвую Вас"2 , 1_print_cp "Датчиков:"2 , 11Hex(dscount)5000
Dim S As String * 16
' Основной бесконечный цикл программы
Do1 , 1"Date:" ; Date$"Time:" ; Time$1000
2 , 15= Readkeyboard()Keys = Key_no Then Lcd_print_cp " "Keys = Key_pwr Then Lcd_print_cp "PW"Keys = Key_arr_up Then Lcd_print_cp "UP"Keys = Key_arr_dn Then Lcd_print_cp "DN"Keys = Key_arr_lf Then Lcd_print_cp "LT"Keys = Key_arr_rt Then Lcd_print_cp "RT"Keys = Key_menu Then Lcd_print_cp "MU"Keys = Key_enter Then Lcd_print_cp "ET"
30' "Convert ALL T on the 1w-bus"200 : Waitus 200 : Waitus 200 : Waitus 200 'if you use 2-wire, could be reduced to 200us1 , 1_print_cp "1"1 , 10_print_cp "2"2 , 1_print_cp "3"2 , 10_print_cp "4"
1 , 3Dscount > 0 Then= Gettemperature(1)= Fusing(temperature , "#.#")S" ""---- "If
1 , 12Dscount > 1 Then= Gettemperature(2)= Fusing(temperature , "#.#")S" ""---- "If
2 , 3Dscount > 2 Then= Gettemperature(3)= Fusing(temperature , "#.#")S" ""---- "If
2 , 12Dscount > 3 Then= Gettemperature(4)= Fusing(temperature , "#.#")S" ""---- "If
4000
Loop
''''
'''' Далее пошли процедуры и функции
''''Findds18b20B1 As Integer L1 As Integer
'Определяем количесво подключенных датчиков
Dscount = 1wirecount()
'Ищем первый датчик(1) = 1wsearchfirst()1 = Memcopy(dsid(1) , Dsidm(1) , 8)
'Ищем остальные датчики
For L1 = 2 To Dscount(1) = 1wsearchnext()= L1 - 1= B1 * 8= B1 + 1= Memcopy(dsid(1) , Dsidm(b1) , 8)L
Sub
Gettemperature(byval Numds As Integer)B1 As Integer= 0= Numds - 1= B1 * 8= B1 + 1= Memcopy(dsidm(b1) , Dsid(1) , 8)
wverify Dsid(1)Err = 1 Then"Err " 'Err = 1 if something is wrongErr = 0 Then 'lcd " Sensor found"
wwrite &HBE(1) = 1wread(9) 'read bytes into arraySc(9) = Crc8(sc(1) , 8) Then= Decigrades(sc(9))IfIf
Function
'Makes the Dallas "Convert T" command on the 1w-bus configured in "Config 1wire = Portb. "
'WAIT 200-750 ms after issued, internal conversion time for the sensor''''''''''
'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously
'When leaving this sub, NO sensor is selected, but ALL sensors has the actual
'temperature in their scratchpad ( within 750 ms )Convallt
wreset ' reset the bus
wwrite &HCC ' skip rom
wwrite &H44 ' Convert TSub
'Makes a integer value of the first two bytes in scratchpad'''''''''''''
'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurateDecigrades(byval Sc(9) As Byte)U As Integer= 0= Makeint(sc(1) , Sc(2))= U
' Decigrades = Decigrades * 10= Decigrades / 16Function
' If you have DS1820 or DS18 S 20 , you can use this algo instead:
' Observe that DsId1(1) contains the info value of which
sensor is used.
'(Decigrades(byval Sc(9) As Byte)Tmp As Byte , T As Integer , T1 As Integer
= Sc(1) And 1 ' 0.1C precisionTmp = 1 Then Decr Sc(1)= Makeint(sc(1) , Sc(2))
'Print Hex(t)
'Print T
= T * 50 'here we calculate the 1/10 precision like= T - 25 'DS18S20 data sheet= Sc(8) - Sc(7)= T1 * 100= T1 / Sc(8)= T + T1= T / 10
'As integer, this routine gives T*10, with 1/10 degree precisionFunction
')
'called from ds1307clock.lib:cstart ' Generate start codecwbyte Ds1307w ' send addresscwbyte 0 ' start address in 1307
cstart ' Generate start codecwbyte Ds1307r ' send addresscrbyte _sec , Ackcrbyte _min , Ack ' MINUTEScrbyte _hour , Ack ' Hourscrbyte Weekday , Ack ' Day of Weekcrbyte _day , Ack ' Day of Monthcrbyte _month , Ack ' Month of Yearcrbyte _year , Nack ' Yearcstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)cstart ' Generate start codecwbyte Ds1307w ' send addresscwbyte 4 ' starting address in 1307cwbyte _day ' Send Data to SECONDScwbyte _month ' MINUTEScwbyte _year ' Hourscstop
:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)cstart ' Generate start codecwbyte Ds1307w ' send addresscwbyte 0 ' starting address in 1307cwbyte _sec ' Send Data to SECONDScwbyte _min ' MINUTEScwbyte _hour ' Hours
I2cstop
'Считываем код нажатой кнопки
If= Keyp
Function
' Читаем данные
с клавиатурыReadkeyboard() As ByteIfres As IntegerResult As ByteKey As
Byte
= Getkey()Key <> Key_old Then_old = Key_delay_repeat = Clockcounter_delay_start_repeat = Key_delay_repeat
Key <> 255 Then Sound Speaker , Pulses , Periods= Key= ResultFunction
If
= Clockcounter - Key_delay_start_repeat
Ifres > Repeatstart Then= Clockcounter - Key_delay_repeatIfres > Speed Then
_delay_repeat = ClockcounterKey <> 255 Then Sound Speaker , Pulses , Periods
= Key Or 128= ResultFunction
IfIf
= 255
Readkeyboard = Result
Function
''' Функция выводит в заданную позицию руссифицированное сообщение
Sub Lcd_print_cp(byval Txt As String * 16)I As IntegerDlina As IntegerC As String * 1= Len(txt)Dlina > 16 Then Dlina = 16I = 1 To Dlina= Left(txt , I)= Right(c , 1)
Case C"А"
: Lcd "A""Б" : Lcd "
""В" : Lcd
"B""Г" : Lcd "Ў""Д" : Lcd "а""Е" : Lcd "E""Ё" : Lcd "E""Ж" : Lcd "Ј""З" : Lcd "¤""И" : Lcd "Ґ""Й" : Lcd "Ґ""К" : Lcd "K""Л" : Lcd "§""М" : Lcd "M""Н" : Lcd "H""О" : Lcd "O""П" : Lcd "Ё""Р" : Lcd "P""С" : Lcd "C""Т" : Lcd "T""У" : Lcd "©""Ф" : Lcd "Є""Х" : Lcd "X""Ц" : Lcd "б""Ч" : Lcd "«""Ш" : Lcd "¬""Щ" : Lcd "в""Ъ" : Lcd """Ы" : Lcd "®""Ь" : Lcd "b""Э" : Lcd "®""Ю" : Lcd "°""Я" : Lcd "±""а" : Lcd "a""б" : Lcd "І""в" : Lcd "і""г" : Lcd "ґ""д" : Lcd "г""е" : Lcd "e""ё" : Lcd "e""ж" : Lcd "¶""з" : Lcd "·""и" : Lcd "ё""й" : Lcd "ё""к" : Lcd "є""л" : Lcd "»""м" : Lcd "ј""н" : Lcd "Ѕ""о" : Lcd "o""п" : Lcd "ѕ""р" : Lcd "p""с" : Lcd "c""т" : Lcd "ї""у" : Lcd "y""ф" : Lcd "д""х" : Lcd "x""ц" : Lcd "е""ч" : Lcd "А""ш" : Lcd "Б""щ" : Lcd "ж""ъ" : Lcd "В""ы" : Lcd "Г""ь" : Lcd "Д""э" : Lcd "Е""ю" : Lcd "Ж""я" : Lcd "З"Else Lcd CSelect
Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''
''' Работа с прерываниями
'''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''_int: Clockcounter
Return
На основе этого устройства управления можно легко реализовать систему управления и контроля как у вас в квартире, так и на даче или же применить устройство в собственных разработках. В рамках этой статьи предлагается вариант использования 4-х канального микропроцессорного устройства для автоматизации вашего тепличного хозяйства.
Автоматизация вашей дачной теплицы
Для этой цели устройство управления подходит, практически, идеально. Сейчас многие садоводы, не только профессионалы, но и любители предпочитают содержать на своем дачном участке собственное тепличное хозяйство. Ухаживая за произрастающими в теплице культурами, человек получает не только моральное удовлетворение и отдых от суеты мирской, а еще овощи, фрукты и зелень к столу, практически, круглый год. Вместе с тем, каждый садовод, конечно же, знает, что для хорошего роста культур немаловажной задачей будет являться поддержание оптимальной температуры в теплице. Практически это оказывается чрезвычайно трудно, поскольку ее круглосуточный контроль невозможен без специального оборудования в силу понятных причин.
Неплохим решением подобной проблемы может быть использование 4-х канального микропроцессорного устройства управления. Именно с его помощью садовод может организовать круглосуточное поддержание оптимальной температуры в своей теплице. Для этого, прежде всего, конструкцию необходимо правильно собрать и настроить. Информацию о том, как правильно это сделать, можно найти в интернете.
Для начала, обе собранные печатные платы устройства управления было бы
разумным установить в корпус FB-04, который можно приобрести отдельно. В этих
целях вам необходимо будет самостоятельно прорезать в нем несложные отверстия
для индикатора, кнопок и разъемов. Платы крепятся в корпус винтами, которые
входят в комплект корпуса FB-04. Общий вид печатных плат показан на Рис. 2
Рис 2.
Для удобства подключения питающего напряжения и датчиков температуры на печатной плате устройства управления предусмотрены разъемы XS2 и XS3 соответственно.
Когда блок управления собран и работоспособен, можно непосредственно приступить к построению самой системы управления теплицей.
Прежде всего, вам необходимо определить место для размещения блока управления (он показан на Рис. 1). Его расположение должно быть таким, чтобы обеспечить не только свободный обзор текстового индикатора, но и доступ к кнопкам управления.
Затем нужно правильно выбрать место установки термодатчика DS18B20.
Именно от его в большей мере будет зависеть точность поддержания заданной
температуры в теплице. Лучше всего датчик разместить подальше от стен. После
того, как датчик надежно закреплен, его подключают к блоку управления шлейфом
через разъем XS3. Как правильно это сделать, иллюстрирует Рис. 3
Рисунок 3. Подключение термодатчиков DS18B20 к блоку управления
Теперь можно к блоку управления подсоединить и обогревательное
оборудование. Однако тут есть некоторая особенность, на которую вам обязательно
нужно обратить внимание. Дело в том, что все силовые выходы устройства NM8036,
подключенные к разъемным контактам XS5-XS12, рассчитаны на максимальный ток 1
А. Если суммарный потребляемый ток ваших тепличных обогревателей превосходит
это значение, конструкцию устройства управления необходимо немного
доработать.[2] Проще всего это сделать, если к используемым выходам XS5-XS12
подключить мощные силовые симисторы (в комплект набора NM8036 не входят) по
схеме, приведенной на Рис. 4.
Рисунок 4. Способ подключения силовых симисторов
В схеме можно применять симисторы с током включения не более 1 А в пике.
Ток постоянной нагрузки при этом не должен превышать 100 мА. Для такой цели
хорошо подойдут симисторы MAC223-MAC224 или BT134-BT139 в зависимости от
мощности подключаемо нагрузки (см. табл. 1). Если мощность нагрузки превышает
500 Вт, то симисторы требуется установить на радиатор, площадь которого должна
обеспечить достаточный отвод тепла от корпуса прибора.
Таблица 1. Применение дополнительных симисторов для подключения мощной нагрузки
|
Максимальная мощность подключаемой нагрузки, кВт |
Тип симистора |
Максимальный ток симистора, А |
|
0,80 |
BT134, BT136 |
4 |
|
1,80 |
BT137 |
8 |
|
2,50 |
BT138 |
12 |
|
3,50 |
BT139 |
16 |
|
5,50 |
MAC223 |
25 |
|
8,80 |
MAC224 |
40 |
Так как в устройстве реализована возможность установки одного и того же датчика на несколько каналов управления, можно подключить часть обогревателей к другим выходным каналам, используя дополнительные симисторы, что даст повышение надежности работы силовой части конструкции за счет перераспределения суммарного тока нагрузки по другим каналам устройства управления. На этом установку «железа» для вашей системы управления теплицей можно считать оконченной. Но для нормальной работы термостата этого пока недостаточно. Его еще необходимо запрограммировать, иными словами, проделать ряд действий, предписывающих микропроцессорному устройству термостата, как действовать при определенных условиях и по какому алгоритму. Эти действия представляют собой, своего рода, «обучение» нашего «железа».
Убедившись, что все подключения сделаны верно, подайте напряжение питания
на схему устройства управления через гнездо XS2. На индикаторе правильно
настроенного блока управления вы должны будете увидеть поочередное переключение
между режимами вывода времени (с полной датой) и выводом температур на все 4
канала. Оба режима показаны на Рис. 5
Рисунок 5. Отображение информации на экране блока управления
Начать программировать термостат следует, зайдя в меню блока управления.
Для этого вам нужно нажать на кнопку «Меню». При этом становятся доступными
следующие режимы: «Установка часов», «Программа», «Поиск датчиков»,
«Параметры», «Подсветка» и «Контрастность». Навигация осуществляется клавишами
«вверх»/«вниз», а клавиша «ввод» позволяет изменять и запоминать
соответствующие параметры для данного пункта меню. На Рис. 6. показана
индикация этих режимов:
Рисунок 6. Индикация режимов работы устройства управления
«Обучение» термостата начинается с предварительной установки текущего времени, для чего вам необходимо зайти в режим «Установка часов». Затем можно перейти и к непосредственной инициализации (обнаружению) температурного датчика DS18B20. С этой целью вам следует выбрать режим «Поиск датчиков». При входе в данное подменю происходит задержка на несколько секунд, поскольку микроконтроллер производит поиск всех датчиков, подключенных к шине.