$regfile = "m8def.dat" 'Мега8 $crystal = 8000000 '10МГц $hwstack = 32 ' default use 32 for the hardware stack $swstack = 20 ' default use 10 for the SW stack $framesize = 20 Dim T_ds1 As Byte Dim T_ds2 As Byte Dim T_ds3 As Byte Dim T_ds4 As Byte Dim Ss As String * 6 Dim Ss1 As String * 6 Dim Ss2 As String * 6 Dim Ss3 As String * 6 Dim Ss4 As String * 6 Dim I1 As Integer Dim I2 As Byte Dim Dsid1(8) As Byte Dim Dsid2(8) As Byte Dim Dsid3(8) As Byte Dim Dsid4(8) As Byte 'переменная для организации меню Dim A As Byte 'переменные для хранения значений влажности и температуры 'Dim Hum_eeprom As Eram Byte 'значение порога влажности в еепром 'Dim Temp_eeprom As Eram Byte 'значение порога температуры в еепром Dim Temp_eeprom_ds1 As Eram Byte Dim Temp_eeprom_ds2 As Eram Byte Dim Temp_eeprom_ds3 As Eram Byte Dim Temp_eeprom_ds4 As Eram Byte Dim Temp_eeprom_control_floor As Eram Byte 'Dim Temp As Byte 'порог температуры в оперативной памяти 'Dim Hum As Byte 'порог влажности в оперативной памяти Dim Temp_ds1 As Byte 'порог температуры в оперативной памяти Dim Temp_ds2 As Byte Dim Temp_ds3 As Byte Dim Temp_ds4 As Byte Dim Temp_control_floor As Byte 'Dim Tdispl As Byte 'температура на экране настройки 'Dim Hdispl As Byte 'влажность на экране настройки Dim Tdispl_ds1 As Byte Dim Tdispl_ds2 As Byte Dim Tdispl_ds3 As Byte Dim Tdispl_ds4 As Byte Dim Tdispl_control_floor As Byte 'Dim Tsave As Byte 'температура для записи в еепром 'Dim Hsave As Byte 'влажность для записи в еепром Dim Tsave_ds1 As Byte Dim Tsave_ds2 As Byte Dim Tsave_ds3 As Byte Dim Tsave_ds4 As Byte Dim Tsave_control_floor As Byte Config Watchdog = 2048 Start Watchdog Reset Watchdog 'Dim Error As Byte 'флаг ошибки считывания датчика 'Hum = Hum_eeprom 'достаем влажность изпамяти 'Temp = Temp_eeprom 'достаем температуру из памяти Temp_ds1 = Temp_eeprom_ds1 Temp_ds2 = Temp_eeprom_ds2 Temp_ds3 = Temp_eeprom_ds3 Temp_ds4 = Temp_eeprom_ds4 Temp_control_floor = Temp_eeprom_control_floor Dim Flag1 As Bit 'флаг включенности первого реле Dim Flag2 As Bit 'влаг включенности второго реле Dim Flag3 As Bit 'флаг включенности третьего реле Dim Flag4 As Bit 'влаг включенности четвертого реле 'Dim Ttemp As Byte 'временная переменная хранения температуры 'Dim Htemp As Byte 'временная переменная хранения влажности Dim Ttemp_ds1 As Byte Dim Ttemp_ds2 As Byte Dim Ttemp_ds3 As Byte Dim Ttemp_ds4 As Byte Config Timer1 = Timer , Prescale = 1024 On Timer1 Overflow: Stop Timer1 'настройка внешних прерываний Config Int0 = Falling Config Int1 = Falling Config Portd.4 = Input 'для подключения второго выхода энкодера On Int0 Button 'прерывание от кнопки энкодера On Int1 Encod 'прерывание от поворота энкодера 'конфигурация подключения дисплея к портам МК Config Lcd = 16 * 2 'Config Lcdpin = Pin , Rs = Portd.6 , E = Portd.5 , Db4 = Portb.1 , Db5 = Portb.0 , Db6 = Portb.2 , Db7 = Portd.7 ' Config Lcdpin = Pin , E = Portd.7 , Rs = Portb.0 , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 Gosub Init_lcd 'настройка остальной периферии Pir Alias Pinc.0 Pir_io_set Alias Ddrc.0 Reset Pir_io_set Config Portd.1 = Output 'светодиод рабочего состояния Led Alias Portd.0 'Моргало светодиодное Buzz Alias Portd.1 'Пищало пъезокерамическое Config Portd.0 = Output 'светодиод ошибки и прочей индикации Ledred Alias Portd.0 Config Portc.1 = Output 'подсветка дисплея Backlight Alias Portc.1 Config Portc.2 = Output 'выход реле нагревателя Config Portc.3 = Output 'выход реле вентилятора Config Portc.4 = Output 'выход реле нагревателя локальный морозилки Config Portc.5 = Output 'выход реле нагревателя нагреватель пола Rele1 Alias Portc.2 'подключение реле 1, тут будет нагреватель овощей Rele2 Alias Portc.3 'подключение реле 2, а здесь будет вентилятор овощей Rele3 Alias Portc.4 'подключение реле 3, тут будет нагреватель локальный морозилки Rele4 Alias Portc.5 'подключение реле 4, тут будет нагреватель пола Rele1 = 0 Rele2 = 0 Rele3 = 0 Rele4 = 0 Sound , Buzz , 600 , 500 Reset Watchdog 'Конфигурация датчиков 18b20 Config 1wire = Portb.1 1wreset I1 = 1wirecount() Cls 1wreset Dsid1(1) = 1wsearchfirst() Dsid2(1) = 1wsearchnext() Dsid3(1) = 1wsearchnext() Dsid4(1) = 1wsearchnext() 1wreset If Err = 1 Then Cls Locate 1 , 1 Lcd "18B20 is broken" Else Locate 1 , 1 Lcd "18B20 is good" Locate 2 , 1 Lcd "Count is: " Lcd I1 End If Reset Watchdog Wait 1 Reset Watchdog Flag1 = 0 Flag2 = 0 Flag3 = 0 Flag4 = 0 Cls 'Stop Watchdog 'тест и вывод информации при запуске '##################################################################################### Rem ТЕСТ НАГРЕВАТЕЛЯ 'Lcd "TEST HEATING" 'Rele1 = 1 'Wait 3 'Rele1 = 0 'Waitms 800 'Cls Rem Установленная Rem температура: Lcd "Temperature DS1" Lowerline Lcd "set:" Locate 2 , 6 Lcd Temp_ds1 ; Chr(0) ; "C" Wait 1 Reset Watchdog Wait 1 Reset Watchdog Cls Rem Установленная Rem температура: Lcd "Temperature DS2" Lowerline Lcd "set:" Locate 2 , 6 Lcd Temp_ds2 ; Chr(0) ; "C" Wait 1 Reset Watchdog Wait 1 Reset Watchdog Cls Rem Установленная Rem температура: Lcd "Temperature DS3" Lowerline Lcd "set:" Locate 2 , 6 Lcd Temp_ds3 ; Chr(0) ; "C" Wait 1 Reset Watchdog Wait 1 Reset Watchdog Cls Rem Установленная Rem температура: Lcd "Temperature DS4" Lowerline Lcd "set:" Locate 2 , 6 Lcd Temp_ds4 ; Chr(0) ; "C" Wait 1 Reset Watchdog Wait 1 Reset Watchdog Cls Rem Режим работы Rem нагревателя пола: Lcd "Control floor" Lowerline Lcd "set:" Locate 2 , 6 If Temp_control_floor = 1 Then Lcd "constantly" Else Lcd "presence" End If Wait 1 Reset Watchdog Wait 1 Reset Watchdog Cls '##################################################################################### 'конец тестовой информации 'разрешаем прывания Enable Interrupts Enable Int0 Enable Int1 Enable Timer1 'Главный цикл '================================================================================================ Backlight = 0 'вырубаемм подстветку Do Disable Interrupts 'Start Watchdog 1wreset I1 = 1wirecount() Reset Watchdog If I1 <> 4 Then ' кол-во датчиков Sound , Buzz , 600 , 500 End If Reset Watchdog 1wreset 'запускаем опрос всех датчиков 1wwrite &HCC 1wwrite &H44 Wait 1 Reset Watchdog 'после ожидания начинаем считывать датчики '--------------------------------- 1wreset 1wwrite &H55 1wverify Dsid1(1) 1wwrite &HBE I1 = 1wread(2) Gosub Conversion T_ds1 = I2 Ss1 = Ss Gosub Compare_ds1 1wreset 1wwrite &H55 1wverify Dsid2(1) 1wwrite &HBE I1 = 1wread(2) Gosub Conversion T_ds2 = I2 Ss2 = Ss Gosub Compare_ds2 1wreset 1wwrite &H55 1wverify Dsid3(1) 1wwrite &HBE I1 = 1wread(2) Gosub Conversion T_ds3 = I2 Ss3 = Ss Gosub Compare_ds3 1wreset 1wwrite &H55 1wverify Dsid4(1) 1wwrite &HBE I1 = 1wread(2) Gosub Conversion T_ds4 = I2 Ss4 = Ss Gosub Compare_ds4 If T_ds1 > 80 Or T_ds1 < 0 Then ' перегрев компрессора Sound , Buzz , 600 , 500 Reset Watchdog End If If T_ds2 > 50 Or T_ds2 < 0 Then ' ящик 1 Sound , Buzz , 600 , 500 Reset Watchdog End If If T_ds3 > 50 Or T_ds3 < 0 Then ' ящик 2 Sound , Buzz , 600 , 500 Reset Watchdog End If If T_ds4 > 50 Then ' перегрев пола Sound , Buzz , 600 , 500 Reset Watchdog End If Enable Interrupts If A = 0 Then 'выводим на дисплей информацию Gosub Init_lcd Cls Ledred = 0 Locate 1 , 1 Lcd Chr(3) ; " " ; Ss1 ; Chr(0) If Flag1 = 1 Then Locate 1 , 7 Lcd Chr(2) 'значёк того что нагрузка включена End If Locate 1 , 9 Lcd Chr(4) ; " " ; Ss2 ; Chr(0) If Flag2 = 1 Then Locate 1 , 15 Lcd Chr(2) 'значёк того что нагрузка включена End If Locate 2 , 1 Lcd Chr(5) ; " " ; Ss3 ; Chr(0) If Flag3 = 1 Then Locate 2 , 7 Lcd Chr(2) 'значёк того что нагрузка включена End If Locate 2 , 9 Lcd Chr(6) ; " " ; Ss4 ; Chr(0) If Flag4 = 1 Then Locate 2 , 15 Lcd Chr(2) 'значёк того что нагрузка включена End If If Pir = 1 Then ' детектор присутствия включен Locate 2 , 16 Lcd Chr(7) 'значёк того что детектор включен End If Wait 1 Reset Watchdog Wait 1 Reset Watchdog Wait 1 Reset Watchdog If Pir = 1 Then ' детектор присутствия включен Sound , Buzz , 200 , 200 End If End If If A = 1 Then Timer1 = 0 Do Cls 'Порог Т Lcd "Temperature DS1" Lowerline Lcd "threshold" Locate 2 , 11 Lcd Tdispl_ds1 ; Chr(0) ; "C" Waitms 400 Reset Watchdog Loop Until A <> 1 End If If A = 2 Then Timer1 = 0 Do Cls 'Порог T Lcd "Temperature DS2" Lowerline Lcd "threshold" Locate 2 , 11 Lcd Tdispl_ds2 ; Chr(0) ; "C" Waitms 400 Reset Watchdog Loop Until A <> 2 End If If A = 3 Then Timer1 = 0 Do Cls 'Порог Т Lcd "Temperature DS3" Lowerline Lcd "threshold" Locate 2 , 11 Lcd Tdispl_ds3 ; Chr(0) ; "C" Waitms 400 Reset Watchdog Loop Until A <> 3 End If If A = 4 Then Timer1 = 0 Do Cls 'Порог Т Lcd "Temperature DS4" Lowerline Lcd "threshold" Locate 2 , 11 Lcd Tdispl_ds4 ; Chr(0) ; "C" Waitms 400 Reset Watchdog Loop Until A <> 4 End If If A = 5 Then Timer1 = 0 Do Cls 'Порог Т Lcd "Control floor" Lowerline Lcd "set:" Locate 2 , 6 If Tdispl_control_floor = 1 Then Lcd "constantly" Else Lcd "presence" End If Waitms 400 Reset Watchdog Loop Until A <> 5 End If Loop End 'работа с датчиком DS18b20 '************************************************************************************************** Conversion: I1 = I1 * 10 Shift I1 , Right , 4 ' I1 = I1 \ 16 Ss = Str(i1) Ss = Format(ss , "+0.0") I2 = Val(ss) Ss = Str(i2) Ss = Format(ss , "+00") Reset Watchdog Return 'включение/выключение нагрузки '************************************************************************************************** Compare_ds1: 'сравниваем значения и вкл/выкл нагрузку ' холодильник If Flag1 = 0 Then 'если реле1 не включено If T_ds1 < Temp_ds1 Then 'если температура понизилась меньше установленной Rele1 = 1 'включаем нагреватель Flag1 = 1 'ставим флаг End If 'End If Else 'If Flag1 = 1 Then 'смотрим включено ли реле1, если да Ttemp_ds1 = Temp_ds1 + 2 'гистерезис температуры 3 градусa If T_ds1 >= Ttemp_ds1 Then 'если температура повысилась Rele1 = 0 'отключим нагрузку Flag1 = 0 'и сбросим флаг End If End If Return Compare_ds2: 'сравниваем значения и вкл/выкл нагрузку ' шкаф1 If Flag2 = 0 Then 'если реле2 не включено If T_ds2 < Temp_ds2 Then 'если температура понизилась меньше установленной Rele2 = 1 'включаем нагреватель Flag2 = 1 'ставим флаг End If 'End If Else 'If Flag2 = 1 Then 'смотрим включено ли реле2, если да Ttemp_ds2 = Temp_ds2 + 1 'гистерезис температуры 3 градусa If T_ds2 >= Ttemp_ds2 Then 'если температура повысилась Rele2 = 0 'отключим нагрузку Flag2 = 0 'и сбросим флаг End If End If Return Compare_ds3: 'сравниваем значения и вкл/выкл нагрузку ' шкаф2 If Flag3 = 0 Then 'если реле3 не включено If T_ds3 < Temp_ds3 Then 'если температура понизилась меньше установленной Rele3 = 1 'включаем нагреватель Flag3 = 1 'ставим флаг End If 'End If Else 'If Flag3 = 1 Then 'смотрим включено ли реле3, если да Ttemp_ds3 = Temp_ds3 + 1 'гистерезис температуры 3 градусa If T_ds3 >= Ttemp_ds3 Then 'если температура повысилась Rele3 = 0 'отключим нагрузку Flag3 = 0 'и сбросим флаг End If End If Return Compare_ds4: 'сравниваем значения и вкл/выкл нагрузку '************************************************************************************************** ' пол If Flag4 = 0 Then 'если реле4 не включено If T_ds4 < Temp_ds4 Then 'если температура понизилась меньше установленной If Pir = 1 Or Temp_control_floor = 1 Then ' детектор присутствия включен или установлен постоянный режим Rele4 = 1 'включаем нагреватель Flag4 = 1 'ставим флаг End If End If 'End If Else 'If Flag4 = 1 Then 'смотрим включено ли реле4, если да Ttemp_ds4 = Temp_ds4 + 1 'гистерезис температуры 3 градусa If T_ds4 >= Ttemp_ds4 Then 'если температура повысилась Rele4 = 0 'отключим нагрузку Flag4 = 0 'и сбросим флаг End If End If Return 'прерывание по переполнению таймера '************************************************************************************************** Overflow: Stop Timer1 'останавливаем и сбрасываем таймер Timer1 = 0 A = 0 'обнуляем переменную Backlight = 0 'выключаем подсветку Return 'обработка прерываний энкодера '************************************************************************************************** Encod: Reset Watchdog Backlight = 1 'врубаем подсветку дисплея Stop Timer1 Timer1 = 0 Start Timer1 If A > 0 Then Waitms 20 'ждем пока утихнет дребезг контактов If Pind.3 = 0 Then If Pind.4 = 0 Then 'если на ноге единица (импульс не пришел) тогда If A = 1 Then Incr Tdispl_ds1 If Tdispl_ds1 > 50 Then Tdispl_ds1 = 0 End If End If If A = 2 Then Incr Tdispl_ds2 If Tdispl_ds2 > 30 Then Tdispl_ds2 = 0 End If End If If A = 3 Then Incr Tdispl_ds3 If Tdispl_ds3 > 30 Then Tdispl_ds3 = 0 End If End If If A = 4 Then Incr Tdispl_ds4 If Tdispl_ds4 > 30 Then Tdispl_ds4 = 0 End If End If If A = 5 Then Incr Tdispl_control_floor If Tdispl_control_floor > 1 Then Tdispl_control_floor = 0 End If End If Else If A = 1 Then Decr Tdispl_ds1 If Tdispl_ds1 > 51 Then Tdispl_ds1 = 50 End If End If If A = 2 Then Decr Tdispl_ds2 If Tdispl_ds2 > 31 Then Tdispl_ds2 = 30 End If End If If A = 3 Then Decr Tdispl_ds3 If Tdispl_ds3 > 31 Then Tdispl_ds3 = 30 End If End If If A = 4 Then Decr Tdispl_ds4 If Tdispl_ds4 > 31 Then Tdispl_ds4 = 30 End If End If If A = 5 Then Decr Tdispl_control_floor If Tdispl_control_floor > 1 Then Tdispl_control_floor = 1 End If End If End If End If Gifr = 128 'сбрасываем регистр хранения прерывания INT1 End If Return Button: 'нажали кнопку Reset Watchdog Timer1 = 0 'сбросили таймер Start Timer1 'запустили таймер Backlight = 1 'включили подсветку дисплея 'немного черной магии, no comments ;) If A = 5 Then A = 0 'здесь организована проверка изменения данных и запись их в энергонезависимую память If Tdispl_ds1 <> Temp_ds1 Then Temp_ds1 = Tdispl_ds1 Temp_eeprom_ds1 = Tdispl_ds1 Cls 'Темп записана Lcd "Temperatura DS1" Lowerline Lcd " saved" Ledred = 1 Waitms 50 Ledred = 0 Wait 1 Reset Watchdog End If If Tdispl_ds2 <> Temp_ds2 Then Temp_ds2 = Tdispl_ds2 Temp_eeprom_ds2 = Tdispl_ds2 Cls 'Темп записана Lcd "Temperatura DS2" Lowerline Lcd " saved" Ledred = 1 Waitms 50 Ledred = 0 Reset Watchdog Wait 1 End If If Tdispl_ds3 <> Temp_ds3 Then Temp_ds3 = Tdispl_ds3 Temp_eeprom_ds3 = Tdispl_ds3 Cls 'Темп записана Lcd "Temperatura DS3" Lowerline Lcd " saved" Ledred = 1 Waitms 50 Ledred = 0 Reset Watchdog Wait 1 End If If Tdispl_ds4 <> Temp_ds4 Then Temp_ds4 = Tdispl_ds4 Temp_eeprom_ds4 = Tdispl_ds4 Cls 'Темп записана Lcd "Temperatura DS4" Lowerline Lcd " saved" Ledred = 1 Waitms 50 Ledred = 0 Reset Watchdog Wait 1 End If If Tdispl_control_floor <> Temp_control_floor Then Temp_control_floor = Tdispl_control_floor Temp_eeprom_control_floor = Tdispl_control_floor Cls 'Темп записана Lcd "Control mode" Lowerline Lcd " saved" Ledred = 1 Waitms 50 Ledred = 0 Reset Watchdog Wait 1 End If Waitms 30 Gifr = 64 Reset Watchdog Sound , Buzz , 600 , 500 Goto Argh 'перепрыгивает на конец подпрограммы, чтобы пропустить остальные ифы End If Reset Watchdog Sound , Buzz , 200 , 500 If A = 4 Then A = 5 Tdispl_control_floor = Temp_control_floor End If If A = 3 Then A = 4 Tdispl_ds4 = Temp_ds4 End If If A = 2 Then A = 3 Tdispl_ds3 = Temp_ds3 End If If A = 1 Then A = 2 Tdispl_ds2 = Temp_ds2 End If If A = 0 Then A = 1 Tdispl_ds1 = Temp_ds1 End If Argh: ' Ledred = 1 ' Waitms 30 ' Ledred = 0 Waitms 50 'ожидание затихания дребезга Gifr = 64 'сброс флага последующего прерывания Return Init_lcd: Initlcd 'нарисуем нестандартные символы Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32 'знак градуса Deflcdchar 1 , 32 , 4 , 14 , 14 , 29 , 29 , 31 , 14 'капелька Deflcdchar 2 , 14 , 10 , 10 , 10 , 14 , 31 , 31 , 14 'термометр Deflcdchar 3 , 31 , 27 , 19 , 27 , 27 , 27 , 17 , 31 'инверсная 1 Deflcdchar 4 , 31 , 17 , 21 , 29 , 27 , 23 , 17 , 31 'инверсная 2 Deflcdchar 5 , 31 , 17 , 29 , 25 , 29 , 29 , 17 , 31 'инверсная 3 Deflcdchar 6 , 31 , 23 , 21 , 21 , 17 , 29 , 29 , 31 'инверсная 4 Deflcdchar 7 , 4 , 5 , 15 , 20 , 4 , 14 , 10 , 27 ' человечек Cursor Off Return End