You are on page 1of 9

'**********************************************************************************

**
' Meteoroska stanica. Mikrokontroler obradjuje podatke sa senzora TX-23 (anemometar
*
' i pravac vetra) i senzora kolicine padavina.Mikrokontroler proziva TX-23 za poda-
*
' tke o vetru a podatak o kolicini padavina dobija preko interapta. Izmerene
vredno-*
' sti salje serijski (za ESP8266) u formatu TaskValueSet 1, x, x
*
'
*
'
*
' Ovo je deo celog sistema meteoroloske stanice sa autonomnim napajanjem koja jos
*
' meri spoljnu temperaturu, vlaznost vazduha, vazdusni pritisak i kontrolno napon
*
' baterije i struju punjenja baterija
*
'
*
' rev.7 23.04.2017 Velja V. Cvetkovic
*
'**********************************************************************************
**

$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 128
$baud = 115200
$prog &HFF , &HFF , &HDB , &HFE ' Fuse bitovi (Opis u
prilogu)

Tx23_data Alias Pind.2 ' Serijska komunikacija


sa senzorom za vetar
Led Alias Portb.2 ' LED koja se koristi u
fazama testiranja
Ch_pd Alias Portb.1 ' PowerDown za modul
ESP8266

Config Led = Output


Config Portb.1 = Output

Declare Sub Tx23_reading


Declare Sub Tx23_reset
Declare Sub Tx23_receiving
Declare Sub Tx23_calculating
Declare Sub Word_mirroring
Declare Sub Byte_mirroring
Declare Sub Slanje_na_esp8266
Declare Sub Cekam
Declare Sub Bit_width

Dim Wind_dir As Byte 'Pravac vetra


Dim Wind_speed As Word 'Brzina vetra
Dim Ch_sum As Byte 'Check sum brzime i
pravca
Dim Wind_dir_negated As Byte 'Invertovana vrednost
pravca
Dim Wind_speed_negated As Word 'Invertovana vrednost
brzine
Dim I As Byte , J As Byte , Z As Word 'Varijable za brojace
Dim Temp_word As Word , Temp_word1 As Word , Temp_word2 As Word , Temp_word3 As
Word 'Varijable za kalkulaciju bajta
Dim Temp_byte As Byte , Temp_byte1 As Byte , Temp_byte2 As Byte , Temp_byte3 As
Byte 'Varijable za kalkulaciju reci
Dim S As Single , L As Single , Brzina_vetra As String * 4 'Konverzija podataka
zbog serijske komunikacije
Dim Smer_vetra As Word 'Odrediva ugla na
osnovu numericke pozicije
Dim Kisa As Single
Dim Cekanje As Word , Cekanje2 As Word , Signal As Bit 'tajmer za TIMER0
(merenje vremena za kolicinu padavina)
Dim Wind_speed_average As Single
Dim Marker As Byte 'prevencija
"zaglavljivanja"
Dim Vreme_impulsa1 As Word , Vreme_impulsa2 As Word , W As Word , G As Word '
za odredjivanje sirine impulsa

Config Debounce = 50 'Sprecavanje


istitravanja kontakta u senzoru padavina

Config Int1 = Rising


Config Timer0 = Timer , Prescale = 1024 ' Sluzi za vremensku
bazu za merenje kolicine padavina
Config Timer1 = Timer , Prescale = 1 ' Meri vreme trajanja
jednog bita
Config Watchdog = 8192

On Int1 Rain Saveall 'Pri interaprima sve


stavlja na stek
On Timer0 Vreme1 Saveall

Enable Interrupts
Enable Int1
Enable Timer0

'Resetovanje pocetnih
vrednosti
Kisa = 0
Cekanje = 0
Cekanje2 = 0
J = 0
Start: 'Koristi se kod
testiranja za proveru serijske komunikacije

' Print "TaskValueSet 3, 1, " ; Fusing(l , "##.#") 'Brzina vetra


' Print "TaskValueSet 3, 2, " ; Smer_vetra 'Smer vetra
' Print "TaskValueSet 3, 3, " ; Fusing(kisa , "##.#") 'Kolicina padavina

Do

Ch_pd = 1 'Ukljucuje ESP8266 ako


je bio iskljucen
Wait 45
'Vreme inicijalizacije
ESP8266 modula
Start Watchdog

Gosub Tx23_reading 'Prikupljanje podataka


sa senzora za vetar

Led = 1 'LED pokazuje da se


program nije zaglavio kod citanja TX23

Gosub Slanje_na_esp8266 ' Slanje prikupljenih


podataka na ESP8266 modul

If Signal = 1 Then ' posle odredjenog


perioda (3h) resetuje kolicinu padavina
Kisa = 0
Signal = 0
Cekanje = 0
Cekanje2 = 0

End If

Stop Watchdog ' Zadrska da prikupi i


ostale vrednosti
Wait 80
Ch_pd = 0
Led = 0
Wait 600

Loop

Sub Tx23_reading:
Gosub Tx23_reset
Gosub Bit_width
Gosub Tx23_receiving
Gosub Tx23_calculating
End Sub
Sub Tx23_reset:
Marker = 0 'Pokazuje neregularan
izlazak
Config Portd.2 = Output 'Prvo master obara data
liniju u roku 500ms
Portd.2 = 0
Waitms 500
Portd.2 = 1
Config Tx23_data = Input ' Oslobadja data liniju
i postaje ulaz i "osluskuje"

For Z = 0 To 1000
Waitus 2
If Tx23_data = 1 Then 'bitwait tx23_data, set
Exit For
End If
If Z = 500 Then
Marker = 1
End If
Next Z

For Z = 0 To 2000
Waitus 2
If Tx23_data = 0 Then 'bitwait tx23_data,
reset
Exit For
End If
If Z = 1000 Then
Marker = 2
End If
Next Z

Waitms 18 'Vreme za internu


kalkulaciju senzora

If Marker = 2 Then 'Znaci da je


prekoraceno vreme cekanja
Gosub Tx23_reset 'Ponavlja proceduru od
reseta
End If

End Sub

Sub Bit_width 'Odredjivanje sirine


bita iz prvog impulsa header-a

Vreme_impulsa1 = 0
Vreme_impulsa2 = 0
Timer1 = 0 'pokrece tajmer za
merenje vremena
Start Timer1

For Z = 0 To 1000
Waitus 2
If Tx23_data = 1 Then 'bitwait tx23_data, set
Exit For
End If
If Z = 500 Then
End If
Next Z

Vreme_impulsa1 = Timer1
Waitus 240

For Z = 0 To 2000
Waitus 2
If Tx23_data = 0 Then 'bitwait tx23_data,
reset
Exit For
End If
If Z = 1000 Then
End If
Next Z

Vreme_impulsa2 = Timer1
Stop Timer1
W = Vreme_impulsa2 - Vreme_impulsa1
W = W / 80
W = W - 2 'Dodatna korekcija da
bi vrednost bila sto tacnija

For Z = 0 To 1000
Waitus 2
If Tx23_data = 1 Then 'bitwait tx23_data, set
Exit For
End If
If Z = 500 Then
End If
Next Z

Waitus 2440 ' Kraj headera


Waitus 200 ' Kasnjenje da bi se
samplovalo na polovini bita

End Sub

Sub Tx23_receiving:

'*********Wind_direction:************'
Wind_dir = 0
For I = 1 To 4
Shift Wind_dir , Left
If Tx23_data = 1 Then
Incr Wind_dir
End If
Gosub Cekam
Next I
'**********Wind_speed**************'
Wind_speed = 0
For I = 1 To 12
Shift Wind_speed , Left
If Tx23_data = 1 Then
Incr Wind_speed
End If
Gosub Cekam
Next I

'***********Checksum***************'
Ch_sum = 0
For I = 1 To 4
Shift Ch_sum , Left
If Tx23_data = 1 Then
Incr Ch_sum
End If
Gosub Cekam
Next I

'*******Wind_dir_negated************'
Wind_dir_negated = 0
For I = 1 To 4
Shift Wind_dir_negated , Left
If Tx23_data = 1 Then
Incr Wind_dir_negated
End If
Gosub Cekam
Next I

'**********Wind_speed****************'
Wind_speed_negated = 0
For I = 1 To 12
Shift Wind_speed_negated , Left
If Tx23_data = 1 Then
Incr Wind_speed_negated
End If
Gosub Cekam
Next I
End Sub

Sub Cekam: 'Ovaj podprogram daje


zadrsku od 2,5us
For G = 1 To W
Next G
End Sub

Sub Tx23_calculating:

Temp_byte1 = Wind_dir
Gosub Byte_mirroring
Wind_dir = Temp_byte2
Shift Wind_dir , Right , 4

Temp_word3 = Wind_speed
Temp_word1 = Wind_speed
Shift Temp_word1 , Left , 4 ' zato sto se koriste
12 bitova pa da pocne od pocetka
Gosub Word_mirroring
Wind_speed = Temp_word2
Wind_speed = Wind_speed And &B0000000111111111 ' samo 9 bitova je
vazno
S = Wind_speed ' pretvaranje word u
single
L = S / 10 ' dobijanje decimalne
vrednosti

Temp_byte3 = Ch_sum
Temp_byte1 = Ch_sum
Gosub Byte_mirroring
Ch_sum = Temp_byte2
Shift Ch_sum , Right , 4

Temp_byte1 = Wind_dir_negated
Gosub Byte_mirroring
Wind_dir_negated = Temp_byte2
Wind_dir_negated = Not Wind_dir_negated
Shift Wind_dir_negated , Right , 4

Temp_word1 = Wind_speed_negated
Shift Temp_word1 , Left , 4
Gosub Word_mirroring
Wind_speed_negated = Temp_word2
Wind_speed_negated = Not Wind_speed_negated
Wind_speed_negated = Wind_speed_negated And &B0000000111111111 ' samo 9
bitova je vazno

'**********************************************'
' Racunanje smera vetra
'**********************************************'

Select Case Wind_dir


Case 0 : Smer_vetra = 0 'S
Case 1 : Smer_vetra = 23 'SSI
Case 2 : Smer_vetra = 45 'SI
Case 3 : Smer_vetra = 68 'ISI
Case 4 : Smer_vetra = 90 'I
Case 5 : Smer_vetra = 113 'IJI
Case 6 : Smer_vetra = 135 'JI
Case 7 : Smer_vetra = 157 'JJI
Case 8 : Smer_vetra = 180 'J
Case 9 : Smer_vetra = 203 'JJZ
Case 10 : Smer_vetra = 225 'JZ
Case 11 : Smer_vetra = 248 'ZJZ
Case 12 : Smer_vetra = 270 'Z
Case 13 : Smer_vetra = 293 'ZSZ
Case 14 : Smer_vetra = 315 'SZ
Case 15 : Smer_vetra = 338
End Select

End Sub
Sub Word_mirroring

'**********************************************
'Word mirroring
'**********************************************
' Temp_word1 ' Vrednost koja se mirroruje
Temp_word2 = 0
For J = 1 To 16

Temp_word = Temp_word1 And &B0000000000000001


Temp_word2 = Temp_word2 + Temp_word

Shift Temp_word1 , Right


If J < 16 Then
Shift Temp_word2 , Left
End If

Next J

'***********************************************

End Sub

Sub Byte_mirroring
'**********************************************
'Word mirroring
'**********************************************
'Temp_byte1 ' Vrednost koja se mirroruje
Temp_byte2 = 0
For J = 1 To 8

Temp_byte = Temp_byte1 And &B00000001


Temp_byte2 = Temp_byte2 + Temp_byte

Shift Temp_byte1 , Right


If J < 8 Then
Shift Temp_byte2 , Left
End If

Next J

'***********************************************
End Sub

Sub Slanje_na_esp8266

Print "TaskValueSet 3, 1, " ; Fusing(l , "##.#") 'Brzina vetra


Print "TaskValueSet 3, 2, " ; Smer_vetra ' Smer vetra
Print "TaskValueSet 3, 3, " ; Fusing(kisa , "##.#") ' Kolicina padavina

End Sub

'***************************
' Inerrupt service routine
'***************************

Rain:
Disable Int1
Debounce Pind.3 , 0 , Skok
Skok:
Kisa = Kisa + 0.57
Enable Int1
Return

Vreme1:
Disable Timer0
Incr Cekanje
If Cekanje = 65500 Then 'prva petlja oko
22minuta
Incr Cekanje2
If Cekanje2 = 10 Then
Set Signal
Cekanje2 = 0
End If
Cekanje = 0
End If
Timer0 = 0
Enable Timer0
Return

End

You might also like