Κώδικας:
program onewire
' Set TEMP_RESOLUTION to the corresponding resolution of your DS18x20 sensor:
' 18B20: 12
'const TEMP_RESOLUTION as byte = 12
dim
j1 ,j2 , consec as byte
temp1 ,temp2 ,conhour as word
tair , eair ,twet ,ewet , eoliko ,rh as float
apotelesmarh ,tairstring ,twetstring as string[5]
sub procedure interrupt
conhour = conhour + 1 'metrame thn ora
if conhour >= 18000 then ' ean h ora einai megalyterh apo ayti poy theloyme ***bazoyme ta deyterolepta ths oras
consec = consec + 1 portd.2=1 'prosuetoyme deyterolepta
if consec > 5 then 'ean ta deyterolepta teliosoyn
consec = 0 conhour = 0 ' conbit = conbit + 1 'midenizoyme ta deytera tin ora
portd.2=0 'teleyteo bit kai midenizoyme tis portes ejodoy
end if
end if
TMR0L = 247 'times l kai h gia tmr0 1 sec
TMR0H = 194
INTCON.TMR0IF = 0 ' reset and start TMR0 interrupt cycle
end sub
sub procedure Read_Temperature()
dim buf1 ,buf2 as longint
Ow_Reset(PORTA,5) ' Onewire reset signal
Ow_Write(PORTA,5,0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTA,5,0x44) ' Issue command CONVERT_T
Delay_ms(400) ' καθυστεριση για να σβυσει
Ow_Reset(PORTA,0) ' Onewire reset signal
Ow_Write(PORTA,0,0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTA,0,0x44) ' Issue command CONVERT_T
Delay_ms(200) ' καθυστεριση για να σβυσει
Ow_Reset(PORTA,5)
Ow_Write(PORTA,5,0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTA,5,0xBE) ' Issue command READ_SCRATCHPAD
Delay_us(200) ' καθυστεριση για να διαβασει
j1 = OW_Read(PORTA,5) ' Get temperature LSB
temp1 = OW_Read(PORTA,5) ' Get temperature MSB
buf1 = (temp1 * 256) + j1 ' buf=16bit word
buf1 = (buf1 * 100) div 16 ' μετατροπη σε πραγματικη τιμη
tair=buf1/100 'μετατροπη σε πραγματικο αρηθμο πχ 25,60
eair=(17.67*tair)/(tair+243.5) 'υπολογισμος εκθετικου αριθμου
eair = exp(eair) 'λογαριθμος του εκθετικου αρηθμου
eair = 6.112*eair 'αποτελεσμα eair
Ow_Reset(PORTA,0)
Ow_Write(PORTA,0,0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTA,0,0xBE) ' Issue command READ_SCRATCHPAD
Delay_us(200) ' καθυστεριση για να διαβασει
j2 = OW_Read(PORTA,0) ' Get temperature LSB
temp2 = OW_Read(PORTA,0) ' Get temperature MSB
buf2 = (temp2 * 256) + j2 ' buf=16bit word
buf2 = (buf2 * 100) div 16 ' μετατροπη σε πραγματικη τιμη
twet=buf2/100 'μετατροπη σε πραγματικο αρηθμο πχ 25,60
ewet=(17.67*twet)/(twet+243.5) 'υπολογισμος εκθετικου αριθμου
ewet = exp(ewet) 'λογαριθμος του εκθετικου αρηθμου
ewet = 6.112*ewet 'αποτελεσμα eair
eoliko=ewet-((1013.25*(tair-twet))*(0.00066*(1+(0.00115*twet))))
' υπολογισμος εξισωσης
rh=(eoliko/eair)*100 ' υπολογισμος σχετικης υγρασιας RH
rh=floor(rh)
end sub
' ----Main----
main:
ADCON1 = 0x0F
TRISD = 0 ' Configure pins of PORTD as output
' ADCON1 = 7 ' configure PORTA as digital I/O
PORTD = %00000000 'δηλωση του PORTD ολες οι εξοδοι να ειναι 0 (αρχικη κατασταση)
T0CON = $86 'T0CON.TMR0ON = 1; ; Timer0 On/Off Control bit: 1=Enables Timer0 / 0=Stops Timer0
'T0CON.T08BIT = 0; ; Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
'T0CON.T0CS = 0; ; TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
'T0CON.T0SE = 0; ; TMR0 Source Edge Select bit: 0=low/high / 1=high/low
' =86 'T0CON.PSA = 0; ; Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
'T0CON.T0PS2 = 1; ; bits 2-0 PS2:PS0: Prescaler Select bits
'T0CON.T0PS1 = 1;
'T0CON.T0PS0 = 0;
INTCON = $A0 ' initialize and enable TMR0
TMR0L =247 ' 'times l kai h gia tmr0 1 sec
TMR0H =194
consec = 0 'arxikos midenismos kataxoriton
conhour = 0
INTCON.TMR0IF = 0 ' start TMR0 interrupt cycle
Lcd_Config(PORTB, 3, 2, 1, 0, PORTB, 4, 6, 5) ' Initialize LCD connected to PORTB easypic5
Lcd_Cmd(LCD_CLEAR) ' Send command to LCD "clear display"
Lcd_Cmd(LCD_CURSOR_OFF) ' Send command cursor off
while true
Read_Temperature()
FloatToStr(tair, tairstring) 'μετατροπη του tair σε χαρακτηρες
FloatToStr(twet, twetstring) 'μετατροπη του twet σε χαρακτηρες
FloatToStr(rh, apotelesmarh) 'μετατροπη του rh σε χαρακτηρες
Lcd_Out(1,1,tairstring) 'εγραφη του tair στο LCD
Lcd_Out(1,10,twetstring) 'εγραφη του twet στο LCD
Lcd_Chr(1, 6, 223) 'εγραφη του χαρακτηρα 'degree'
Lcd_Chr(1, 7, "C") 'εγραφη του χαρακτηρα C
Lcd_Out(1,8," ")
Lcd_Chr(1, 15, 223) 'εγραφη του χαρακτηρα 'degree'
Lcd_Chr(1, 16, "C") 'εγραφη του χαρακτηρα C
Lcd_Out(2,12,apotelesmarh) 'εγραφη του tair στο LCD
Lcd_Out(2,7," ") ' εγραφη κενων χαρακτηρων (διωρθωση εμφανησης)
Lcd_Out(2,16,"%") 'εγραφη %
if tair <= 37 then 'εαν η θερμοκρασια ειναι <= tair (37.00°C)τωτε
SetBit(PORTD, 0) 'ανοιξε την επαφη PORTD, 2 (1)
else ClearBit(PORTD, 0) 'αλοιως μηδενησε την επαφη
end if
if rh <= 70 then 'εαν η υγρασια εναι <= με rh 70 τωτε
SetBit(PORTD, 1) 'ανοιξε την επαφη PORTD, 6 (1)
else ClearBit(PORTD, 1) 'αλοιως μηδενησε την επαφη
end if
wend
end.
το πρόγραμμα εχει ρυθμιστεί για θερμοκρασία 37 βαθμούς και υγρασία 70