в цикле с периодичностью в 2 секунды имею с датчика текущее значение температуры. (это уже реализовано)
входные данные: нижний предел - после которого включается обогрев верхний предел - после которого включается охлаждение (продувка воздухом) и желаемый гистерезис ... проблема с этим.
поясню нижний предел 10 градусов - включается обогрев. доводим температуру (нижний порог+гистерезис) до 15 обогрев выключается. с верхним 40 градусов аналогично.
если температура меньше 10 град то переходим к циклу (goto gosub) нагрева и ждем пока температура не поднимется до 15.. возвращаемся в режим ожидания то же и для охлаждения
Я и писал вам что 2 гистерезиса. У вас 2 устройства (вентилятор и нагреватель) не связанные общим алгоритмом. И каждое устройство работает в своей области. Ну пусть в дальнейшем не клинит. Не забудь прогу с коментариями выложить другим для науки и разбора.
Сообщение отредактировал
anatol - Чт, 22.09.2011, 16:59
единственно остается открытым вопрос с отрицательными температурами...завтра уточню у заказчика - и можно по проверки старшего бита просто включать обогрев..
'* Date : 12.09.2011 * '* Version : 1.0 * '* Notes : ðàáîòàåò. â êîì ïîðò âûâîäèò òåìïåðàòóðó Ñ*16 * '* : * '**************************************************************** ' Picbasic Pro program to read DS1820 1-wire temperature sensor ' @ DEVICE WDT_OFF, INTRC_OSC_NOCLKOUT, INTRC_OSC, BOD_OFF @ DEVICE MCLR_ON ' Master Clear Options (Internal)
Include "modedefs.bas" ' Include serial modes
'pin1 +V power 'pin2 GPIO5 - 18B20 'pin3 'pin4 MCLR - 1K on +5V 'pin5 GPIO2 - cool led 'pin6 GPIO1 - heat led 'pin7 GPIO0 - serial out 'pin8 GND
' Define clock options DEFINE OSC 4 Define OSCCAL_1K 1 ' Set OSCCAL for 1K device
command = $cc ' Issue Skip ROM command Gosub write1820
command = $44 ' Start temperature conversion Gosub write1820
Pause 2000 ' Wait 2 seconds for conversion to complete
Gosub init1820 ' Do another init
command = $cc ' Issue Skip ROM command Gosub write1820
command = $be ' Read the temperature Gosub write1820 Gosub read1820
' Lcdout $fe, 1, dec (temp >> 1),".",dec(temp.0 * 5)," degrees C" ' Display the decimal temperature
serout SER_OUT,T2400,[#temp,13,10] [color=red] if temp < LO_LEVEL then high LED_heat 'âêëþ÷èëè îáîãðåâ serout SER_OUT,T2400,["Heating",13,10] endif
if temp > LO_LEVEL+Delta then low LED_heat 'âûêëþ÷àåì îáîãðåâ endif
if temp > HI_LEVEL then high LED_COOL 'âêëþ÷èëè îõëàæäåíèå serout SER_OUT,T2400,["Cooling",13,10] endif
if temp < HI_LEVEL-delta then low LED_COOL 'âûêëþ÷àåì îõëàæäåíèå endif [color=red] Goto mainloop ' Do it forever
led_cool_blink: high LED_COOL pause 200 toggle LED_COOL return
led_heat_blink: high LED_HEAT pause 200 toggle LED_HEAT return
leds_blink: high LED_HEAT high LED_COOL pause 200 toggle LED_HEAT toggle LED_COOL return
' Initialize DS1820 and check for presence init1820: Low DQ ' Set the data pin low to init Pauseus 500 ' Wait > 480us DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 100 ' Wait > 60us If DQ = 1 Then Gosub leds_blink ' äà÷èê íå íàéäåí ! serout SER_OUT,T2400,["Sensor missing..",13,10] Pause 500 Goto mainloop ' Try again Endif Pauseus 400 ' Wait for end of presence pulse Return
' Write "command" byte to the DS1820 write1820: For i = 1 to 8 ' 8 bits to a byte If command.0 = 0 Then Gosub write0 ' Write a 0 bit Else Gosub write1 ' Write a 1 bit Endif command = command >> 1 ' Shift to next bit Next i Return
' Write a 0 bit to the DS1820 write0: Low DQ Pauseus 60 ' Low for > 60us for 0 DQ_DIR = 1 ' Release data pin (set to input for high) Return
' Write a 1 bit to the DS1820 write1: Low DQ ' Low for < 15us for 1 @ nop ' Delay 1us at 4MHz DQ_DIR = 1 ' Release data pin (set to input for high) Pauseus 60 ' Use up rest of time slot Return
' Read temperature from the DS1820 read1820: For i = 1 to 16 ' 16 bits to a word temp = temp >> 1 ' Shift down bits Gosub readbit ' Get the bit to the top of temp Next i Return
' Read a bit from the DS1820 readbit: temp.15 = 1 ' Preset read bit to 1 Low DQ ' Start the time slot @ nop ' Delay 1us at 4MHz DQ_DIR = 1 ' Release data pin (set to input for high) If DQ = 0 Then temp.15 = 0 ' Set bit to 0 Endif Pauseus 60 ' Wait out rest of time slot Return
End
Сообщение отредактировал
sa137 - Пт, 23.09.2011, 22:03