№ вывода
|
Порт: разряд
|
Подключенное
устройство
|
|
Порт А
|
|
40
|
0
|
Кнопка
"режим 1"
|
39
|
1
|
Кнопка
"режим 2"
|
38
|
2
|
Кнопка
"режим 3"
|
37
|
3
|
Кнопка
"режим 4"
|
36
|
4
|
Кнопка
"режим 5"
|
35
|
5
|
датчик
влажности
|
34
|
6
|
симистор
управления клапаном для воды
|
|
Порт В
|
|
1
|
0
|
младшая цифра
двухразрядного индикатора
|
2
|
1
|
первая цифра
трехразрядного индикатора
|
3
|
2
|
симистор для
обогрева теплицы
|
4
|
3
|
симистор для
управления ФК
|
5
|
4
|
симистор для
управления ФБ
|
6
|
5
|
симистор для
управления дверью
|
6
|
вторая цифра
трехразрядного индикатора
|
8
|
7
|
третья цифра
трехразрядного индикатора
|
|
Порт С
|
|
22
|
0
|
Температурный
датчик
|
23
|
1
|
Температурный
датчик
|
|
Порт D
|
|
14
|
0
|
Сегмент
индикатора (выход)
|
15
|
1
|
Сегмент
индикатора (выход)
|
16
|
2
|
Сегмент
индикатора (выход)
|
17
|
3
|
Сегмент
индикатора (выход)
|
18
|
4
|
Сегмент
индикатора (выход)
|
19
|
5
|
Сегмент
индикатора (выход)
|
20
|
6
|
Сегмент
индикатора (выход)
|
21
|
7
|
старшая цифра
двухразрядного индикатора
|
6.
Программное обеспечение для микроконтроллера
Писать программу для микроконтроллера будем на языке С, так
как такая программа более проста в написании, наглядна и не требует
специфических знаний ассемблера и особенностей данного микроконтроллера.
Программировать будем в CodeVisionAVR. Эта программа бесплатна, создана специально для
работы с микроконтроллерами AVR, есть библиотеки для каждого микроконтроллера (в
том числе и для Atmega8535), а также есть инструмент начального создания кода. С помощью
этого инструмента мы можем настроить порты ввода/вывода, настроить работу по
интерфейсу I2C, а также таймер и АЦП
преобразователь.
Четыре процедуры являются стандартными: main, read_adc,
ds1621_temperature_10 (0), timer0_ovf_isr.
· read_adc - процедура для считывания данных
с датчика влажности, поддерживает связь с АЦП.
· ds1621_temperature_10 (0) - стандартная
процедура для обмена с датчиком ds1621 по интерфейсу i2c.
· timer0_ovf_isr - прерывание таймера по
переполнению. Позволяет отображать режим и температуру на семисегментных
индикаторах таким образом, чтобы не возникало мерцаний и пропадений цифр с
индикатора.
· main - главная процедура, в
нее входит пользовательские процедуры:
· zapoln - процедура,
осуществляющая запоминание критических параметров по выбранному режиму.
· indik, otobr_chif - процедуры для
отображения данных на семисегментных индикаторах, подавая на выводы A-G и транзисторные ключи
соответствующие сигналы.
Заключение
Разработанная микропроцессорная система управления
микроклиматом в теплице полностью удовлетворяет поставленным требованиям.
Осуществляется мониторинг и индикация температуры и влажности, в соответствии с
выбранным режимом работы происходит управление фрамугами, капельным поливом и
нагревателем.
Результаты моделирования на персональном компьютере показали,
разработанная микропроцессорная система функционирует правильно и выполняет
возложенные на нее задачи.
Библиографический
список
1) Баранов
В.Н. Применение микроконтроллеров AVR: схемы, алгоритмы, программы. - М. Ж
Издательский дом "Додэка XXI", 2004
2) Тигранян
Р.Э. Микроклимат. Электронные системы обеспечения. - ИП. Радиософт, 2005
) Гребнев
В.В. Микроконтроллеры семейства AVR фирмы Atmel. - М.: ИП РадиоСофт, 2002 - 176с.
4) Datasheet: Atmel 8-bit AVR Microcontroller
5) Datasheet: BT 139 Series.
) Datasheet: LM340 Series.
7) <http://www.teplitsa-urojay.ru/rasta/ogurtsy/>
) http://www.zooclub.ru/flora/rouse/14.
shtml
) http://www.greeninfo.ru/vegetables/capsicum_annuum.html/Article/_/aID/3354
10) http://www.sadovod.
spb.ru/TextShablon. php? LinkPage=222
<http://www.sadovod.spb.ru/TextShablon.php?LinkPage=222>
) attachment:
/26/ds1621. htm
) attachment:
/15/6. htm
) <http://easyelectronics.ru/>
) http://www.superfilter.ru/manual.
htm <http://www.superfilter.ru/manual.htm>
) <http://www.ruselectric.ru/info/shop/transformatori/2084>
) http://www.chip-dip.ru/product0/874599444.
aspx <http://www.chip-dip.ru/product0/874599444.aspx>
17) http://www.elfa.
lv/cgi-bin/index. cgi? artnr=73-092-06&lng=rus
<http://www.elfa.lv/cgi-bin/index.cgi?artnr=73-092-06&lng=rus>
) <http://clip2net.com/u/the_ghost/rezus/page-62729-mos3041/>
19) http://catalog.compel.ru/triac/info/BT139-600.127%20
(NXP) <http://catalog.compel.ru/triac/info/BT139-600.127%20(NXP)>
) http://www.pcports.ru/articles/avr4.
php <http://www.pcports.ru/articles/avr4.php>
21) <http://www.gaw.ru/>
Приложения
Приложение А
Листинг программы для микроконтроллера
/*****************************************************
Chip type: Atmega8535
Program type: Application
AVR Core Clock frequency: 1,000000 MHz
Memory model: Small
External RAM size: 0
Data Stack size: 128
*****************************************************/
#include <mega8535. h>
#include <delay. h>
// I2C Bus functions
#asm
. equ __i2c_port=0x15; PORTC
. equ __sda_bit=1
. equ __scl_bit=0
#endasm
#include <i2c.
h>
// DS1621 Thermometer/Thermostat functions
#include <ds1621. h>
#define ADC_VREF_TYPE 0x20
// объявление глобальных переменных
int temp_v,T_max,T_min,buf;
int I;char V,V_max,V_min; char rezim,pr;
// процедура отображение цифры на одном из разряде
void otobr_chif (int buf)
{switch (buf)
{case 0: PORTD=0xbb;1: PORTD=0x82;2:
PORTD=0x3e;3: PORTD=0xae;4: PORTD=0x87;5: PORTD=0xad;6: PORTD=0xbd;7:
PORTD=0x22;8: PORTD=0xbf; 9: PORTD=0xaf;
} }
// процедура индикации температуры и режима
void indik (void)
{
// отображение температуры
// отображение знака
if (temp_v<0) {PORTB.1=1;=1; }{PORTB.1=0; }_us
(10);.1=0;
// отображение младшей цифры
buf=temp_v %10;
otobr_chif (buf);.7=1;_us (10);.7=0;
// вывод старшей цифры
buf=temp_v %100;
otobr_chif (buf);.6=1;_us (10);.6=0;
// отображение младшей цифры влажности
buf=V %10;
otobr_chif (buf);.7=1;_us (10);.7=0;
// вывод старшей цифры влажности
buf=V /10;
otobr_chif (buf);.7=1;_us (10);.7=0;
}
// функция выполнения задержки и поддержания индикации
// minut - количество времени по 15 минутdelay_my
(unsigned char minut)
{unsigned char j;(j=1; j<=minut; j++)
{for (i=1; i<=10000; i++) {_ms (20);(); }}
}
// считывание с АЦПchar read_adc (unsigned char
adc_input)
{=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC
input voltage_us (10);
// Start the AD conversion|=0x40;
// Wait for the AD conversion to complete(
(ADCSRA & 0x10) ==0);|=0x10; ADCH;
}
// процедура заполнения значений max min температуры и влажности
void zapoln (unsigned char rezim)
{ switch (rezim)
{case 1: T_max=22;_min=17;_max=60;_min=30;=1;;2:
T_max=23;_min=19;_max=80;_min=60;;3: T_max=21;_min=18;_max=65;_min=35;
pr=1;;4: T_max=24;
T_min=21;_max=90;_min=70;;5:
T_max=30;_min=25;_max=65;_min=40;
break;
default: break; }}
// функция работы с термодатчиком
void izm_temp (int temp_v)
{
// считываем температуру_start
(0);_v=ds1621_temperature_10 (0);
// температурный датчик переводим в режим пониженного
энергопотребления
ds1621_stop (0);
// сравниваем с нормой
if (temp_v>T_max) { // охлаждение теплицы
if (PINB.5==0) {PORTB.5=1; }if (PINB.3==0)
{PORTB.3=1; }{if (rezim==1) {PORTB.4=1; }(rezim==5) {PORTB.4=1; }} } (temp_v<T_min) { // нагревание теплицы
if (PINB.4==1) {PORTB.4=0; }if (PINB.3==1)
{PORTB.3=0; }if (PINB.5==1) {PORTB.5=0; }{ PINB.2=1;_my (2); // задержка на 30
минут
}
}
}
// функция прерывания таймера по переполнению
interrupt [TIM0_OVF] void timer0_ovf_isr (void)
{indik ();
}
void main (void)
{
// инициализация портов
// Port A initialization=0x00;=0x08;
// Port B initialization=0x00;=0xFF;
// Port C initialization=0x00;=0x00;
// Port D
PORTD=0x00;
DDRD=0x7F;
// инициализация таймера 0; частота работы 15,625 КГц
TCCR0=0x03;=0x00;=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by
Timer/Counter 1: Off=0x80;=0x00;
// ADC initialization
// ADC Clock frequency: 500,000 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: ADC Stopped
// Only the 8 most significant bits of
// the AD conversion result are
used=ADC_VREF_TYPE & 0xff;=0x81;
SFIOR&=0xEF;
// инициализация порта i2c
i2c_init ();
// инициализация термодатчика
ds1621_init (1,0,0,0); // адрес термодатчика 1
#asm ("sei")
while (1)
{
// проверяем нажата ли клавиша выбора режима
if (PINA.0==1) {rezim=1; }
if (PINA.1==1) {rezim=2; }
if (PINA.2==1) {rezim=3; }
if (PINA.3==1) {rezim=4; }
if (PINA.4==1) {rezim=5; }(rezim! =0) {
zapoln (rezim);
// если нет, то считываем температуру
izm_temp (temp_v);
// считываем влажность
V=read_adc (5);(V<V_min) {
// полив для помидор и перца
if (pr==1) {while (V<V_max) {
PORTA.6=1;(i=1; i<=900; i++) delay_ms (1000);.6=0;
// считываем влажность
V=read_adc (5);
}}{ PORTA.6=1;_my (1); // задержка в 15 минут.6=0;
} }
// задержка на 30 минут
delay_my (2); }
}
}