Napkollektor - az érzékelõ/napkövetõ egység (digitális verzió)

A folyamatos önfejlesztés eredményeképpen - felbátorodván az eddigi avr/bascom sikereken - elszántam magam a digitális verzió elkészítésére. A hardver a következõkkep változik: a fényellenállások helyett led-ekkel méri egy nagyobb avr proci (ATmega8/ATmega16) a fényerõket négy irányból - az ADC bemenetein keresztül. Innen már csak program kérdése a szabályzás. Az alábbi kódrészlet egy alap szabályzást tesz lehetõvé: figyeli a fényerõket, a végállásbemeneteket és az elõre beállított értékek függvényében adja ki a vezérlõ jeleket.

' végállás-bemenetek
Fel_stop_opto_in1
Alias Pinx.y
Le_stop_opto_in2
Alias Pinx.y
Bal_stop_opto_in3
Alias Pinx.y
Jobb_stop_opto_in4
Alias Pinx.y

' motormeghajtás-kimenetek
Fel_forgatas_opto_ki1
Alias Portx.y
Le_forgatas_opto_ki2
Alias Portx.y
Bal_forgatas_opto_ki3
Alias Portx.y
Jobb_forgatas_opto_ki4
Alias Portx.y

Declare Sub Fenymeres
Declare Sub Motorstop

Dim Forgatas As Bit
Dim Led_felso As Word , Led_also As Word , Led_jobb As Word , Led_bal As Word
Dim Led_felho_min_ert As Byte , Led_felho_max_ert As Byte , Led_ejszaka_min_ert As Byte , Led_ejszaka_max_ert As Byte
Dim Fugg_elteres_fel As Byte , Fugg_elteres_le As Byte , Vizsz_elteres_jobb As Byte , Vizsz_elteres_bal As Byte
Dim Fugg_elteres_max As Byte , Vizsz_elteres_max As Byte
Config Adc = Single , Prescaler = Auto , Reference = Internal
Enable Interrupts

Led_ejszaka_min_ert
= 100 ' Éjszakai üzemmód ki-...
Led_ejszaka_max_ert
= 105 ' ...és bekapcsolási értékei.

Led_felho_min_ert
= 110 ' Forgatáshoz szükséges fényerő ki-...
Led_felho_max_ert
= 115 ' ...és bekapcsolási értékei.

Fugg_elteres_max
= 2 ' Fel és le érték maximális különbségének értéke (ha nagyobb -> szabályzás/újrapozicionálás).
Vizsz_elteres_max
= 2 ' Jobb és bal érték maximális különbségének értéke (ha nagyobb -> szabályzás/újrapozicionálás).

Do

If Forgatas = 0 Then

Call Fenymeres

If Led_jobb > Led_ejszaka_max_ert Then ' éjszakai kikapcsolásból felélesztés
Print "reggel/bekapcs"
End If

If Led_jobb > Led_felho_max_ert Then ' borús idő elmúltával/adott fényerő felett napkövetés bekapcsolása
Print "napsütes/melo"
Set Forgatas

End If

End If


If Forgatas = 1 Then

Call Fenymeres

If Led_jobb < Led_ejszaka_min_ert Then ' ha jön az éjszaka, akkor...
Print "éjszaka-kikapcs"
Wait 1
Call Motorstop
Forgatas
= 0
Print "hajnalvárás..."
While Jobb_stop_opto_in4 = 0 ' ...végállásig jobbra/keletre forgatás
Set Jobb_forgatas_opto_ki4
Wend
Reset Jobb_forgatas_opto_ki4
Wait 1

Else

If Led_jobb < Led_felho_min_ert Then ' borús idő/adott fényerő alatt esetén nincsen napkövetés
Print "felhő - szünet"
Call Motorstop
Forgatas
= 0
Wait 2
End If

End If

If Fugg_elteres_fel > Fugg_elteres_max Then ' ha függőleges eltérés nagyobb a maximum értéknél, akkor...
If Fel_stop_opto_in1 = 1 Then ' ha a végállás engedi, akkor...
Set Fel_forgatas_opto_ki1 ' felfelé forgatás
Reset Le_forgatas_opto_ki2 ' biztonsági tiltás
Print "Fel..." ' üzenet...
Else
Print "Végállás - Fel" ' üzenet...
End If
End If

If Fugg_elteres_fel <= Fugg_elteres_max Then ' ha az eltérés a határ alatt van, akkor
Reset Fel_forgatas_opto_ki1 ' felfelé forgatás megállítása
Print "Stop - fel" ' üzenet...
End If

If Fugg_elteres_le > Fugg_elteres_max Then ' mint "Fel" esetben, csak "Le" irányba...
If Le_stop_opto_in2 = 1 Then
Set Le_forgatas_opto_ki2
Reset Fel_forgatas_opto_ki1
Print "Le..."
Else
Print "Végállás - Le"
End If

If Fugg_elteres_le <= Fugg_elteres_max Then
Reset Le_forgatas_opto_ki2
Print "Stop - Le"
End If

If Vizsz_elteres_bal > Vizsz_elteres_max Then ' mint "Fel" esetben, csak "Bal" irányba...
If Bal_stop_opto_in3 = 1 Then
Set Bal_forgatas_opto_ki3
Reset Jobb_forgatas_opto_ki4
Print "Balra..."
Else
Print "Végállás - Bal"
End If

If Vizsz_elteres_bal <= Vizsz_elteres_max Then
Reset Bal_forgatas_opto_ki3
Print "Stop - Bal"
End If

If Vizsz_elteres_jobb > Vizsz_elteres_max Then ' mint "Fel" esetben, csak "Jobb" irányba...
If Jobb_stop_opto_in4 = 1 Then
Set Jobb_forgatas_opto_ki4
Reset Bal_forgatas_opto_ki3
Print "Jobbra..."
Else
Print "Végállás - Jobb"
End If

If Vizsz_elteres_jobb <= Vizsz_elteres_max Then
Reset Jobb_forgatas_opto_ki4
Print "Stop - Jobb"
End If

Waitms 50

End If

Loop

'******************
'* fényerő mérése *
'******************
Sub Fenymeres ' egyes ledek/ledcsoportok megmérése/értékek kiszámolása

Start Adc
'a-d =
analog-to-digital portok
Led_felso = Getadc(a) / 4 ' word-ről -> byte-ra
Led_also
=
Getadc(b) / 4
Led_jobb
=
Getadc(c) / 4
Led_bal
=
Getadc(d) / 4
Stop Adc

If Led_felso > Led_also Then
Fugg_elteres_fel
= Led_felso - Led_also
Fugg_elteres_le
= 0
End If

If Led_also > Led_felso Then
Fugg_elteres_le
= Led_also - Led_felso
Fugg_elteres_fel
= 0
End If

If Led_also = Led_felso Then
Fugg_elteres_le
= 0
Fugg_elteres_fel
= 0
End If

If Led_jobb > Led_bal Then
Vizsz_elteres_jobb
= Led_jobb - Led_bal
Vizsz_elteres_bal
= 0
End If

If Led_bal > Led_jobb Then
Vizsz_elteres_bal
= Led_bal - Led_jobb
Vizsz_elteres_jobb
= 0
End If

If Led_bal = Led_jobb Then
Vizsz_elteres_bal
= 0
Vizsz_elteres_jobb
= 0
End If

End Sub

Sub Motorstop

Reset Fel_forgatas_opto_ki1
Reset Le_forgatas_opto_ki2
Reset Bal_forgatas_opto_ki3
Reset Jobb_forgatas_opto_ki4

End Sub

End

A vezérlõhöz egy 40x4-es lcd lesz:

marklar

-

A hátérvilágítás EL fólia... nem volt egyszerû megoldani, hogy világítson, de Horváth János küldött egy kis kocka tápot hozzá - köszönet érte:

marklar

marklar

-

marklarmarklarmarklarmarklarmarklarmarklarmarklarmarklarmarklar

marklar

marklar