'**************************************************************** '* Name : Car_comp.BAS * '* Author : =MiX@$= * '* Notice : Copyright (c) 2013 =MiX@$= * '* : All Rights Reserved * '* Date : 29.08.2013 * '* Version : 2.0 * '* Notes : * '* : * '**************************************************************** ' 1. Измерять бортовое напряжение сети || ' 2. Температуру Салона || ' 3. Температуру двигателя || ' 4. Температуру Окружающей среды || ' 5. Измерять Уровень топлива в баке || ' 6. Ручное управление заслонкой рециркуляции : Servo || ' 7. Ручное и автоматическое управление краном печки : Servo || ' 8. Изменять скорость врещения вентилятора печки по средствам энкодера в % 0-100 || ' 9. Демонстрировать все измерения по кругу C ПОМОЩЬЮ ЭНКОДЕРА || ' 10.Притухание дисплея, при ночной езде. || ' 11.ПИД или ПИ РЕГУЛИРОВАНИЕ ПЕЧКОЙ -- 'Схема подключения контроллера: ' PORTA: ' 1. Делитель напряжения для измерения сет напр ' 0. Схема на ОУ для измерения уровня бака ' 2. Вывод кнопки Энкодера ' 3. Резерв ' PORTB: ' 0. Вывод Энкодера ' 1. Вывод Энкодера ' 2. Линия LCD E ' 3. Линия LCD RS ' 4. Данные LCD D4 ' 5. Данные LCD D5 ' 6. Данные LCD D6 ' 7. Данные LCD D7 ' PORTС: ' 0. Servo крана ' 1. Выход на подсветку дисплея ' 2. Выход на Вентилятор отопления - аппаратный ШИМ1 ' 3. Servo заслонка низ- стекло ' 4. Servo заслонка верх- стекло ' 5. Шина OneWire для термометра ' 6. TX - IDE ' 7. RX - IDE ' ' PORTE: ' 0. Вход от фар, для притухания дисплея. ' 1. Резерв ' 2. Резерв ' Экраны бортового измерителя ' 1. Уровень топлива в баке ' 2. Напряжение бортовой сети ' 3. Температура в салоне ' 4. Температура на улице ' 5. Температура двигателя ' 6. Изменение скорости салонного вентилятора ' 7. Температура уставки в салоне ' 8. Ручное открытие крана отопителя ' 9. Ручное открытие заслонки рециркуляции Clear ' Очистить оперативную память Cls Device 16F877A ' Использовать микроконтроллер 16F876A Xtal 20 ' Использовать кварцевый генератор на 20 МГц 'Declare Bootloader = On 'Declare Optimiser_Level = 3 'Declare Dead_Code_Remove = On HPWM 1, 0, 0 ' Сбросить ШИМ '---------------------------------Настройки подключения ЖКИ--------------------------------- Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно-цифровой Declare LCD_DTPin PORTB.4 ' Порт данных ЖКИ Declare LCD_ENPin PORTB.2 ' Управление цепью E Declare LCD_RSPin PORTB.3 ' Управление цепью RS Declare LCD_Interface 4 ' 4-х битная разрядность шины данных Declare LCD_CommandUs 2000 ' Задержка перед посылкой команды Declare LCD_DataUs 50 ' Задержка перед посылкой данных Declare LCD_Lines 2 ' Количество строк ЖКИ '------------------------------------Настройки портов--------------------------------------- ADCON1 = %10000100 ' TRISA = %00000111 ' Сделать каналы (PORTA.0,1) входом TRISE = %00000001 TRISB = %00000011 ' Сделать каналы (PORTB.0,1) входом, остальные выходом TRISC = %00000001 ' Сделать канал (PORTC.0) входом TRISD = %11111111 ' Сделать весь порт на выход '-------------------------------------Настройки АЦП------------------------------------- Declare Adin_Res 10 ' Pазрядность результата преобразования АЦП = 10 Declare Adin_Tad FRC ' Источник тактирования АЦП = FRC Declare Adin_Stime 50 ' Установить время ожидания в 50 мкс перед началом преобразования '=================================Настройка внешнего прерывания========================== Symbol INTF = INTCON.1 ' Флаг внешнего прерывания INT Symbol INTE = INTCON.4 ' Разрешение внешнего прерывания INT Symbol PEIE = INTCON.6 ' Разрешение прерываний от периферийных модулей Symbol GIE = INTCON.7 ' Глобальное разрешение прерываний PEIE = 1 ' разрешить перефирийные прерывания GIE = 1 ' разрешить глобальные прерывания INTE = 1 ' Разрешение внешнего прерывания INT '======================================================================= '======================Настройка прерывания по TMR1 ==================== Symbol TMR1IE = PIE1.0 ' Разрешение прерывания по переполнению TMR1 Symbol T1CKPS1 = T1CON.5 ' ВЫСТАВЛЕНИЕ предделителя Symbol T1CKPS0 = T1CON.4 ' T1CKPS1:T1CKPS0: Выбор коэффициента деления предделителя TMR1 Symbol TMR1CS = T1CON.1 '11 = 1:8 Symbol TMR1ON = T1CON.0 'Вкл таймер '10 = 1:4 Dim TIMER1 As TMR1L.Word '01 = 1:2 '00 = 1:1 ' Объединить TMR1L, и TMR1H в WORD переменную TIMER1 Symbol TMR1IF = PIR1.0 ' Флаг переполнения таймера 1 сбросить програмно TMR1IF = 0 TMR1IE = 1 T1CKPS1 = 1 ' выбран предделитель 1:8 T1CKPS0 = 1 TMR1CS = 0 ' выбор источника тактового сигнала 1- RB6-RB7, '0- внутренний источник Fosc/4 TIMER1 = 3036 ' время вычисленное программой равное 100 мс реального времени '------------------------------------Объявление переменных---------------------------------- Dim DIG_VOLT As Word ' Измеренное значение АЦП Напряжения Dim DIG_Fuel As Word ' Измеренное значение АЦП уровня топлива Dim Volts As Float ' Напряжение в вольтах Dim PAUS As Byte ' Время удержиния кнопки Dim Array_fuel[42] As Word ' Массив и измеренным Dim VOL As Byte ' Объем в литрах, при настройке. Dim But1 As Byte ' Переменная для кнопки Dim Stat As Bit ' Статус Датчиков температуры Dim Temp As Word ' Сохраняет прочитанную температуру Dim Indoor_temp As Float ' Температура в салоне, гр С Dim Erro As Byte ' Хранит код Ошибки Dim Fan_lev As Byte ' Скорость в % вентилятора салона Dim ENK As Byte ' Переменная энкодера (счетчик) Dim Outdoor_temp As Float ' Температура на улице, гр С Dim Engine_temp As Float ' Температура двигателя, гр С Dim A As Byte ' цикл повтор Dim B As Byte ' адрес Eeprom Dim Kran_val As Word ' Открытие крана отопления в % Dim R As Byte ' ПУСТАЯ Dim R1 As Byte ' ПУСТАЯ Dim R2 As Byte ' ПУСТАЯ Dim R3 As Byte ' ПУСТАЯ Dim R4 As Word ' ПУСТАЯ Dim Ki As Float ' Коэффициент Интегрирования Dim TempPower As Float ' Промежуточная переменная Dim P As Float ' пропорциональная составляющая Dim PI As Float ' Интегральная Dim Power As Word ' Выходной результат Dim TError0 As Float ' Ошибка Dim TError1 As Float ' Ошибка Dim Integral As Float ' Интеграл Dim Kd As Float ' Коэф диф Dim Kp As Float ' Коэф пропорционал ' Переменная для хранения значения на 1 градус C Dim TempSet As Byte ' Температура уставки регулятора Dim Temp_conv As Float ' Температура для конвертирования Dim Del As Byte ' Кол-во измерений Dim Up_Glass As Word ' Открытие в % заслонки в верх-стекло Dim Do_Glass As Word ' Открытие в % заслонки в низ-стекло Dim DIG_Fuel1 As Word ' 1Измеренное значение АЦП уровня топлива Dim DIG_Fuel2 As Word ' 2Измеренное значение АЦП уровня топлива Dim DIG_Fuel3 As Word ' 3Измеренное значение АЦП уровня топлива Dim Hz As Word ' частота ШИМ Dim DIG_VOLT1 As Word ' 1Измеренное значение АЦП Напряжения Dim DIG_VOLT2 As Word ' 2Измеренное значение АЦП Напряжения Dim DIG_VOLT3 As Word ' 3Измеренное значение АЦП Напряжения Dim er_flag As Bit ' Флаг ошибки Fan_lev = 0 Hz = 22000 '------------------------------------Присвоение------------------------------------------ Symbol but = PORTA.2 ' Кнопка энкодера Symbol DQ = PORTC.5 ' Шина 1 wire 'Symbol Pz = PORTD.4 ' Вывод динамика Symbol Light= PORTE.0 ' Свет фар Symbol Sv1 = PORTC.0 ' Servo крана Symbol Sv2 = PORTC.3 ' Servo заслонка низ- стекло Symbol Sv3 = PORTC.4 ' Servo заслонка верх- стекло '--------------------------------Главная программа--------------------------------------- HPWM 2, 250, Hz ' Включить подсветку дисплея ' Коэф пропорционал On_Hardware_Interrupt INTER ' Обработка аппаратных и внешних прерываний GoTo Read_eeprom '*********************************************************************************************** INTER: Context Save TMR1IE = 0 ' Запретить прерывания по таймеру PEIE = 0 ' выключить перефирийные прерывания GIE = 0 ' выключить глобальные прерывания INTE = 0 ' выключить внешнего прерывания INT If TMR1IF = 1 Then Inc PAUS ' если прерывание произошло по таймеру, 'то прирастить переменную PAUSE If INTF = 1 Then If PORTB.0 = 1 And PORTB.1 = 0 Then Inc ENK ' Вращение вперед If PORTB.0 = 1 And PORTB.1 = 1 Then Dec ENK ' Вращение назад INTF = 0 ' Сбросить флаг прерывания по изменению уровня сигнала на RB0 Else EndIf TMR1IF = 0 ' Сбросить флаг прерывания по TMR1 TMR1IE = 1 ' Разрешить прерывание по TMR1 PEIE = 1 ' разрешить перефирийные прерывания GIE = 1 ' разрешить глобальные прерывания INTE = 1 ' Разрешение внешнего прерывания INT TMR1ON = 0 Context Restore Read_eeprom: ' Читаем из памяти и заполняем массив A = 0 ' Адрес еепром в данном случае B = 0 ' Адрес массива Repeat Array_fuel[B] = ERead A ' Заполняем массив Inc B ' Инкримент адреса массива A = A + 2 ' Инкримент адреса еепром Т.к. массив Word Until B = 40 '---------------------------- Up_Glass = ERead 106 Do_Glass = ERead 108 Kran_val = ERead 110 TempSet = ERead 112 Kp = ERead 114 Ki = ERead 118 Kd = ERead 122 For A = 0 To 5 Servo Sv1, Kran_val Servo Sv2, Do_Glass Servo Sv3, Up_Glass DelayMS 10 Next A = 0 '------------------------------ '*********************************************************************************************** ' ' Print $FE, $40 ,$04, $0E, $15, $04, $04, $04, $04, $04 ' записать в озу LCD знак вверх ' Print $FE, $48 ,$04, $04, $04, $04, $04, $15, $0E, $04 ' записать в озу LCD знак вниз 'Print $FE, $50 ,$00, $0E, $0E, $04, $15, $1F, $11, $00 ' записать в озу LCD знак кран Main_0: Cls ENK = 1 But1 = 255 ' Для команды буттон Main: 'GoSub ADC_Convert GoSub Temp_Indoor GoSub Temp_Outdoor GoSub Temp_Engine DIG_Fuel = ADIn 0 'Indoor_temp = DIG_Fuel / 25.575 DIG_VOLT = ADIn 1 Inc Del If Del = 1 Then DIG_Fuel1 = DIG_Fuel: DIG_VOLT1 = DIG_VOLT If Del = 2 Then DIG_Fuel2 = DIG_Fuel: DIG_VOLT2 = DIG_VOLT If Del = 3 Then DIG_Fuel3 = DIG_Fuel: DIG_VOLT3 = DIG_VOLT If Del = 3 Then DIG_Fuel = (DIG_Fuel1 + DIG_Fuel2 + DIG_Fuel3)/ 3: GoSub Select_Fuel If Del = 3 Then DIG_VOLT = (DIG_VOLT1 + DIG_VOLT2 + DIG_VOLT3)/ 3: Clear Del: GoSub ADC_Convert If Volts < 11.5 Then Erro = $A2 If Volts < 10.5 Then Erro = $A1 If Volts > 14.8 Then Erro = $A3 'If Light = 0 Then HPWM 2, 50, Hz: Else: HPWM 2, 254, Hz:EndIf If TempSet <> 0 Then GoSub PI_regulator If ENK < 1 Then ENK = 5 If ENK > 5 Then ENK = 1 If ENK = 1 Then Print At 1,1, "Fuel Voltage" : Print At 2,1, Dec2 VOL, " L ",Hex2 Erro," ", Dec1 Volts,"V " If ENK = 2 Then Print At 1,1, "Salon Ust Uv" : Print At 2,1, Dec1 Indoor_temp,223, "C ": Print At 2,8," ",Dec2 TempSet,223,"C ":Print At 2,14, Dec3 Power:Button but,0,255,255,But1,1,Ustavka ',Dec2 TempSet,223, "C ":Button but,0,255,255,But1,1,Ustavka If ENK = 3 Then Print At 1,1, "Outdoor Engine" : Print At 2,1, Dec1 Outdoor_temp,223, "C ": Print At 2, 9," ", Dec1 Engine_temp,223, "C " If ENK = 4 Then Print At 1,1, " Speed Fan " : Print At 2,1," ", Dec3 Fan_lev, " ":Button but,0,255,255,But1,1,Fan If ENK = 5 Then Print At 1,1, "Up Down Kran" : Print At 2,1, Dec (Up_Glass-1000)/ 10, "% ": Print At 2,5," ", Dec (Do_Glass - 1000)/ 10, "% ":Print At 2,12, " ",Dec (Kran_val-1200)/ 5, "% ":Button but,0,255,255,But1,1,Up_gl ' 11.5 16 19 If but = 0 Then TMR1ON = 1 If PAUS = 30 Then PAUS = 0 Cls If but = 0 Then ENK = 1: But1= 255:GoTo Setting EndIf Else TMR1ON = 0 PAUS = 0 EndIf Clear Erro GoTo Main '*********************************************************************************************** Select_Fuel: If DIG_Fuel <= Array_fuel[0] And DIG_Fuel > Array_fuel[1] Then VOL = 0 If DIG_Fuel <= Array_fuel[1] And DIG_Fuel > Array_fuel[2] Then VOL = 1 If DIG_Fuel <= Array_fuel[2] And DIG_Fuel > Array_fuel[3] Then VOL = 2 If DIG_Fuel <= Array_fuel[3] And DIG_Fuel > Array_fuel[4] Then VOL = 3 If DIG_Fuel <= Array_fuel[4] And DIG_Fuel > Array_fuel[5] Then VOL = 4 If DIG_Fuel <= Array_fuel[5] And DIG_Fuel > Array_fuel[6] Then VOL = 5 If DIG_Fuel <= Array_fuel[6] And DIG_Fuel > Array_fuel[7] Then VOL = 6 If DIG_Fuel <= Array_fuel[7] And DIG_Fuel > Array_fuel[8] Then VOL = 7 If DIG_Fuel <= Array_fuel[8] And DIG_Fuel > Array_fuel[9] Then VOL = 8 If DIG_Fuel <= Array_fuel[9] And DIG_Fuel > Array_fuel[10] Then VOL = 9 If DIG_Fuel <= Array_fuel[10] And DIG_Fuel > Array_fuel[11] Then VOL = 10 If DIG_Fuel <= Array_fuel[11] And DIG_Fuel > Array_fuel[12] Then VOL = 11 If DIG_Fuel <= Array_fuel[12] And DIG_Fuel > Array_fuel[13] Then VOL = 12 If DIG_Fuel <= Array_fuel[13] And DIG_Fuel > Array_fuel[14] Then VOL = 13 If DIG_Fuel <= Array_fuel[14] And DIG_Fuel > Array_fuel[15] Then VOL = 14 If DIG_Fuel <= Array_fuel[15] And DIG_Fuel > Array_fuel[16] Then VOL = 15 If DIG_Fuel <= Array_fuel[16] And DIG_Fuel > Array_fuel[17] Then VOL = 16 If DIG_Fuel <= Array_fuel[17] And DIG_Fuel > Array_fuel[18] Then VOL = 17 If DIG_Fuel <= Array_fuel[18] And DIG_Fuel > Array_fuel[19] Then VOL = 18 If DIG_Fuel <= Array_fuel[19] And DIG_Fuel > Array_fuel[20] Then VOL = 19 If DIG_Fuel <= Array_fuel[20] And DIG_Fuel > Array_fuel[21] Then VOL = 20 If DIG_Fuel <= Array_fuel[21] And DIG_Fuel > Array_fuel[22] Then VOL = 21 If DIG_Fuel <= Array_fuel[22] And DIG_Fuel > Array_fuel[23] Then VOL = 22 If DIG_Fuel <= Array_fuel[23] And DIG_Fuel > Array_fuel[24] Then VOL = 23 If DIG_Fuel <= Array_fuel[24] And DIG_Fuel > Array_fuel[25] Then VOL = 24 If DIG_Fuel <= Array_fuel[25] And DIG_Fuel > Array_fuel[26] Then VOL = 25 If DIG_Fuel <= Array_fuel[26] And DIG_Fuel > Array_fuel[27] Then VOL = 26 If DIG_Fuel <= Array_fuel[27] And DIG_Fuel > Array_fuel[28] Then VOL = 27 If DIG_Fuel <= Array_fuel[28] And DIG_Fuel > Array_fuel[29] Then VOL = 28 If DIG_Fuel <= Array_fuel[29] And DIG_Fuel > Array_fuel[30] Then VOL = 29 If DIG_Fuel <= Array_fuel[30] And DIG_Fuel > Array_fuel[31] Then VOL = 30 If DIG_Fuel <= Array_fuel[31] And DIG_Fuel > Array_fuel[32] Then VOL = 31 If DIG_Fuel <= Array_fuel[32] And DIG_Fuel > Array_fuel[33] Then VOL = 32 If DIG_Fuel <= Array_fuel[33] And DIG_Fuel > Array_fuel[34] Then VOL = 33 If DIG_Fuel <= Array_fuel[34] And DIG_Fuel > Array_fuel[35] Then VOL = 34 If DIG_Fuel <= Array_fuel[35] And DIG_Fuel > Array_fuel[36] Then VOL = 35 If DIG_Fuel <= Array_fuel[36] And DIG_Fuel > Array_fuel[37] Then VOL = 36 If DIG_Fuel <= Array_fuel[37] And DIG_Fuel > Array_fuel[38] Then VOL = 37 If DIG_Fuel <= Array_fuel[38] And DIG_Fuel > Array_fuel[39] Then VOL = 38 If DIG_Fuel <= Array_fuel[39] And DIG_Fuel > Array_fuel[40] Then VOL = 39 If DIG_Fuel <= Array_fuel[40] And DIG_Fuel >=0 Then VOL = 40 Return '*********************************************************************************************** ADC_Convert: Volts = DIG_VOLT * 4.819 Volts = Volts * 6.1475 Volts = Volts / 1000 Return '*********************************************************************************************** Setting: If ENK < 1 Then ENK = 3 If ENK > 3 Then ENK = 1 If ENK = 1 Then Print At 1,1,$7e, "Setting Level ", $7f: Print At 2,1, "Setting PID ":Button but,0,255,255,But1,1,Set_lev_fuel If ENK = 2 Then Print At 1,1,$7e, "Setting PID ", $7f: Print At 2,1, "Exit ":Button but,0,255,255,But1,1,Set_PI_kof If ENK = 3 Then Print At 1,1,$7e, "Exit ", $7f: Print At 2,1, "______________":Button but,0,255,255,But1,1,Main_0 GoTo Setting '*********************************************************************************************** Set_lev_fuel: VOL = 0 Set_lev_fuel1: DIG_Fuel = ADIn 0 DelayMS 100 Print At 1,1, " Setting level " Print At 2,1, "Lev ", Dec4 DIG_Fuel, " Vol ", Dec3 VOL Button but,0,255,255,But1,1,Set_val GoTo Set_lev_fuel1 '*********************************************************************************************** Set_val: Array_fuel[VOL] = DIG_Fuel If VOL = 40 Then A = 0 B = 0 Repeat EWrite A, [Array_fuel[B]] A = A + 2 Inc B Until B = 40 '@goto 0 GoTo Main EndIf Inc VOL GoTo Set_lev_fuel1 '*********************************************************************************************** 'dim ID[8] as byte 'Test_sensor: ' OWrite DQ, 1, [$33] ' Issue Read ROM command 'D_Loop: ' ORead DQ, 0, [Str ID\8]' Read 64-bit device data into the 8-byte array "ID" 'If ENK < 1 Then ENK = 4 'If ENK > 4 Then ENK = 1 ' Print At 1,1, " Indoor ": Print At 2,1, Hex2 ID[1],Hex2 ID[2],Hex2 ID[3],Hex2 ID[4],Hex2 ID[5],Hex2 ID[6],Hex2 ID[7] 'If ENK = 1 Then Print At 1,1, " Indoor ": Print At 2,1, Hex2 ID[1],Hex2 ID[2],Hex2 ID[3],Hex2 ID[4],Hex2 ID[5],Hex2 ID[6],Hex2 ID[7]:Button but,0,255,255,But1,1,Sen_1 'If ENK = 2 Then Print At 1,1, " Outdoor ": Print At 2,1, Hex2 ID[1],Hex2 ID[2],Hex2 ID[3],Hex2 ID[4],Hex2 ID[5],Hex2 ID[6],Hex2 ID[7]:Button but,0,255,255,But1,1,Sen_2 'If ENK = 3 Then Print At 1,1, " Engine ": Print At 2,1, Hex2 ID[1],Hex2 ID[2],Hex2 ID[3],Hex2 ID[4],Hex2 ID[5],Hex2 ID[6],Hex2 ID[7]:Button but,0,255,255,But1,1,Sen_3 'If ENK = 4 Then Print At 1,1, "Exit ": Print At 2,1, "______________":Button but,0,255,255,But1,1,Read_eeprom 'GoTo Test_sensor '*********************************************************************************************** 'Sen_1: 'A = 0 'Repeat 'EWrite 84+A, [ID[A]] 'Inc A 'Until A = 8 'GoTo Test_sensor 'Sen_2: 'A = 0 'Repeat 'EWrite 92+A, [ID[A]] 'Inc A 'Until A = 8 'oTo Test_sensor 'Sen_3: 'A = 0 'Repeat 'EWrite 100+A, [ID[A]] 'Inc A 'Until A = 8 'GoTo Test_sensor '*********************************************************************************************** Temp_Indoor: OWrite DQ, 1, [$55,$28,$C1,$92,$BA,$02,$00,$00,$47,$44] ' Запрос ром конкретного устройства Inc A ORead DQ, 4, [Stat] If Stat = 1 And A > 50 Then Erro = $C1:Stat = 0: er_flag = 1 ' Проверяем состояние устройства и сохраняем в stat If Stat = 1 Then Temp_Indoor ' если 1 то еще раз читаем, но ... OWrite DQ, 1, [$55,$28,$C1,$92,$BA,$02,$00,$00,$47,$BE] GoSub Convet_temp Indoor_temp = Temp_conv Clear A Return '*********************************************************************************************** Temp_Outdoor: OWrite DQ, 1, [$55,$28,$C0,$14,$43,$00,$00,$00,$8A,$44] ' Запрос ром конкретного устройства Inc A ORead DQ, 4, [Stat] ' Проверяем состояние устройства и сохраняем в stat If Stat = 1 And A > 50 Then Erro = $C2:Stat = 0: er_flag = 1 ' Проверяем состояние устройства и сохраняем в stat If Stat = 1 Then Temp_Outdoor ' если 1 то еще раз читаем, но ... ' если 1 то еще раз читаем, но ... OWrite DQ, 1, [$55,$28,$C0,$14,$43,$00,$00,$00,$8A,$BE] GoSub Convet_temp Outdoor_temp = Temp_conv Clear A Return '*********************************************************************************************** Temp_Engine: OWrite DQ, 1, [$55,$28,$2D,$A5,$BA,$02,$00,$00,$C6,$44] ' Запрос ром конкретного устройства Inc A ORead DQ, 4, [Stat] ' Проверяем состояние устройства и сохраняем в stat If Stat = 1 And A > 50 Then Erro = $C3:Stat = 0: er_flag = 1 ' Проверяем состояние устройства и сохраняем в stat If Stat = 1 Then Temp_Engine ' если 1 то еще раз читаем, но ... ' если 1 то еще раз читаем, но ... OWrite DQ, 1, [$55,$28,$2D,$A5,$BA,$02,$00,$00,$C6,$BE] GoSub Convet_temp Engine_temp = Temp_conv Clear A Return '*********************************************************************************************** Convet_temp: ORead DQ, 2, [Temp.LowByte,Temp.HighByte] ' Теперь читаем из ОЗУ устройства наще значение и сохраняем в Temp Temp_conv = Temp * 0.0625 If Temp.15 = 1 Then Temp_conv = $ffff - Temp + 1 ' Если он =1, то расчетываем "-" темпер Temp_conv = Temp_conv * 0.0625 Temp_conv = Temp_conv * (-1) EndIf Return '*********************************************************************************************** Fan: ENK = Fan_lev / 10 Fan_0: Declare Reminders = off If ENK < 0 Then ENK = 0 If ENK > 35 Then ENK = 35 Fan_lev = ENK + 220 If ENK = 0 Then Fan_lev = 0 HPWM 1, Fan_lev, Hz Print At 2,7, Dec3 Fan_lev, " " Button but,0,255,255,But1,1,Main_0 GoTo Fan_0 '*********************************************************************************************** Up_gl: ENK = Up_Glass / 100 Up_gl_0: Declare Reminders = off If ENK < 10 Then ENK = 10 If ENK > 20 Then ENK = 20 Up_Glass = ENK * 100 Servo Sv3, Up_Glass DelayMS 20 Print At 2,1, Dec (Up_Glass-1000)/ 10, "% " Button but,0,255,255,But1,1,Rec GoTo Up_gl_0 '*********************************************************************************************** Rec: ENK = Do_Glass / 100 Rec_0: Declare Reminders = off If ENK < 10 Then ENK = 10 If ENK > 20 Then ENK = 20 Do_Glass = ENK * 100 Servo Sv2, Do_Glass DelayMS 20 Print At 2,6, Dec (Do_Glass - 1000)/ 10, "% " Button but,0,255,255,But1,1,Kran GoTo Rec_0 '*********************************************************************************************** Set_rec: EWrite 106, [Up_Glass] EWrite 108, [Do_Glass] EWrite 110, [Kran_val] EWrite 112, [TempSet] EWrite 114, [Kp] EWrite 118, [Ki] EWrite 122, [Kd] GoTo Read_eeprom '*********************************************************************************************** Kran: ' 20-70% ' 1200 - 1700 мкс 1200 - открыта полностью. 1700 - закрыта ENK = Kran_val / 100 Kran_0: Declare Reminders = off If ENK < 12 Then ENK = 12 If ENK > 17 Then ENK = 17 Kran_val = ENK * 100 Servo Sv1, Kran_val DelayMS 20 Print At 2,13, Dec (Kran_val-1200)/ 5, "% " Button but,0,255,255,But1,1,Set_rec GoTo Kran_0 '*********************************************************************************************** PI_regulator: TError0 = TempSet - Indoor_temp If Power > 0 And Power < 255 Then Integral = Integral + TError0 If Integral > 255 Then Integral = 255 TempPower = Kd * (TError0 - TError1) TempPower = TempPower + Ki * Integral TempPower = TempPower + Kp * TError0 If TempPower > 255 Then TempPower = 255 If TempPower < 0 Then TempPower = 0 If 256 > TempPower And TempPower >= 0 Then ' Если все значения в рамках допустимых Power = TempPower ' Значение для ШИМ присваиваем переменной Power EndIf 'If Indoor_temp > TempSet Then Power = 0: Clear Integral : Clear TError0 HPWM 1, Power, Hz TError1 = TError0 Return '*********************************************************************************************** Ustavka: ENK = TempSet UST: If ENK < 0 Then ENK = 40 If ENK > 40 Then ENK = 0 TempSet = ENK If TempSet = 0 Then HPWM 1, 0 , Hz Print At 2,9, Dec2 TempSet,223,"C " Button but,0,255,255,But1,1,Set_rec GoTo UST Set_PI_kof: But1 = 255 Print At 1,1, "Kp Ki Kd" ENK = Kp * 10 Set_Kp: Kp = ENK / 10 Print At 2,1, Dec1 Kp," " Button but,0,255,255,But1,1,Set_Ki GoTo Set_Kp Set_Ki: ENK = Ki * 10 Set_Ki_0: Ki = ENK / 10 Print At 2,8, Dec1 Ki," " Button but,0,255,255,But1,1,Set_Kd GoTo Set_Ki_0 Set_Kd: ENK = Kd * 10 Set_Kd_0: If ENK < 0 Then ENK = 0 If ENK > 255 Then ENK = 255 Kd = ENK / 10 Print At 2,14, Dec Kd," " Button but,0,255,255,But1,1,Set_rec GoTo Set_Kd_0 End