| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| et:examples:sensor:photoresistor [2012/06/09 11:01] – raivo.sell | et:examples:sensor:photoresistor [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| | <pagebreak> |
| ====== Fototakisti ====== | ====== Fototakisti ====== |
| |
| //Vajalikud teadmised: [HW] [[et:hardware:homelab:sensor]], [HW] [[et:hardware:homelab:digi]], [ELC] [[et:electronics:voltage_divider]], \\ [AVR] [[et:avr:adc]], [LIB] [[et:software:homelab:library:adc]], [LIB] [[et:software:homelab:library:module:lcd_graphic]], \\ [PRT] [[et:examples:setup:eclipse]]// | //Vajalikud teadmised: |
| | [HW] [[et:hardware:homelab:digi]], |
| | [ELC] [[et:electronics:voltage_divider]], |
| | [AVR] [[et:avr:adc]], |
| | [LIB] [[et:software:homelab:library:adc]], [LIB] [[et:software:homelab:library:module:lcd_graphic]], |
| | [LIB] [[et:software:homelab:library:module:sensor]]// |
| |
| ===== Teooria ===== | ===== Teooria ===== |
| |
| [{{ :examples:sensor:photoresistor:sensor_photoresistor.jpg?150|Fototakisti}}] | |
| [{{ :examples:sensor:photoresistor:sensor_photoresistor_designator.png?150|Fototakisti elektriline tähis}}] | [{{ :examples:sensor:photoresistor:sensor_photoresistor_designator.png?150|Fototakisti elektriline tähis}}] |
| | [{{ :examples:sensor:photoresistor:sensor_photoresistor.jpg?150|Fototakisti}}] |
| |
| Fototakisti on andur, mille elektriline takistus muutub sõltuvalt temale pealelangeva valguse intensiivsusest. Mida intensiivsem on valgus, seda rohkem tekib vabu laengukandjaid ning seda väiksemaks jääb elemendi takistus. Fototakisti kaks välist metallkontakti ulatuvad läbi keraamilise alusmaterjali valgustundliku kileni, mis oma geomeetria ja materjali omaduse poolest määravad elektrilised takistuslikud omadused. Kuna fototundlik materjal on iseloomult suure takistusega, siis peenikese käänulise rajaga elektroodide vahel saavutatakse madal elemendi kogutakistus keskmise valguse intensiivsuse juures. Nii nagu inimese silm, on ka fototakisti tundlik kindlale valguse lainepikkuse vahemikule. Fotoelemendi valikul tuleb sellega kindlasti arvestada, kuna vastasel juhul ei pruugi see rakenduses kasutatavale valgusallikale üldse reageeridagi. Siinkohal olgu ära toodud nähtava valguse lainepikkused jaotatuna lihtsustatult värvide järgi. | Fototakisti on andur, mille elektriline takistus muutub sõltuvalt temale pealelangeva valguse intensiivsusest. Mida intensiivsem on valgus, seda rohkem tekib vabu laengukandjaid ning seda väiksemaks jääb elemendi takistus. Fototakisti kaks välist metallkontakti ulatuvad läbi keraamilise alusmaterjali valgustundliku kileni, mis oma geomeetria ja materjali omaduse poolest määravad elektrilised takistuslikud omadused. Kuna fototundlik materjal on iseloomult suure takistusega, siis peenikese käänulise rajaga elektroodide vahel saavutatakse madal elemendi kogutakistus keskmise valguse intensiivsuse juures. Nii nagu inimese silm, on ka fototakisti tundlik kindlale valguse lainepikkuse vahemikule. Fotoelemendi valikul tuleb sellega kindlasti arvestada, kuna vastasel juhul ei pruugi see rakenduses kasutatavale valgusallikale üldse reageeridagi. Siinkohal olgu ära toodud nähtava valguse lainepikkused jaotatuna lihtsustatult värvide järgi. |
| | Hämarus | 1 | | | Hämarus | 1 | |
| | Auditoorium | 10 | | | Auditoorium | 10 | |
| | Klassiruum | 30 | | |
| | Päikesetõus või -loojang | 400 | | | Päikesetõus või -loojang | 400 | |
| | Haigla operatsioonisaal | 500 - 1000 | | |
| | Otsene päikesevalgus | 10000 | | | Otsene päikesevalgus | 10000 | |
| |
| ===== Praktika ===== | ===== Praktika ===== |
| |
| Kodulabori Andurite mooduli plaat on varustatud VT935G fototakistiga. Selle üks viik on ühendatud +5 V toitega ja teine mikrokontrolleri analoog-digitaalmuunduri kanaliga 1 (viik PF1). Sama mikrokontrolleri viigu ja maaga on ühendatud ka tavaline 10 kΩ takisti, mis koos fototakistiga moodustab pingejaguri. Kuna fototakisti elektriline takistus väheneb temale langeva valguse intensiivsuse kasvades, siis mõõdetav pinge mikrokontrolleri viigu peal kasvab valguse intensiivsuse kasvades. Tasuks arvestada, et Kodulaboris kasutatav fototakisti reageerib kõige intensiivsemalt kollasele ja oranžile valgusele. | Kodulabori moodul on varustatud VT935G fototakistiga. Selle üks viik on ühendatud toitega ja teine mikrokontrolleri analoog-digitaalmuunduri analoog kanaliga (Kodulabor II puhul kanal 1, Kodulabor III puhul kanal 13). Sama mikrokontrolleri viigu ja maaga on ühendatud ka takisti, mis koos fototakistiga moodustab pingejaguri. Kuna fototakisti elektriline takistus väheneb temale langeva valguse intensiivsuse kasvades, siis mõõdetav pinge mikrokontrolleri viigu peal kasvab valguse intensiivsuse kasvades. Tasuks arvestada, et Kodulaboris kasutatav fototakisti reageerib kõige intensiivsemalt kollasele ja oranžile valgusele. |
| |
| VT935G andur ei olegi tegelikult mõeldud konkreetseks mõõteseadmeks, pigem üldiste valgustingimuste määramiseks - näiteks kas ruumis põleb lamp või mitte. Sel juhul tuleb lihtsalt mõõta anduri takistus poolpimedas ruumis, see programmi kirja panna ja selle abil võrrelda mõõdetavat - kas on heledam või pimedam. | VT935G andur ei olegi tegelikult mõeldud konkreetseks mõõteseadmeks, pigem üldiste valgustingimuste määramiseks - näiteks kas ruumis põleb lamp või mitte. Sel juhul tuleb lihtsalt mõõta anduri takistus poolpimedas ruumis, see programmi kirja panna ja selle abil võrrelda mõõdetavat - kas on heledam või pimedam. |
| |
| Käesolev harjutus on aga natukese keerulisem, kuna leitakse andurile valgeva valguse valgustustihedust luksides. Selle tegemiseks on kasutusel ligikaudne arvutusvalem ja ujukoma arvud. Ujukoma arvud on C-keeles //float// ja //double// tüüpi, millega saab esitada murdarve. Nende puuduseks on suhteliselt suur ressursinõudlikkus. Arvutites on nende arvutamiseks spetsiaalne riistvara, 8-bitisel AVR mikrokontrolleril tehakse arvutused tarkvaras, mis võtab suhteliselt palju programmimälu ja aega. Kui puudused pole olulised, on ujukoma arvud väärt kasutamist. | Käesolev harjutus on aga natukese keerulisem, kuna leitakse andurile langeva valguse valgustustihedust luksides. Selle tegemiseks on kasutusel ligikaudne arvutusvalem ja ujukoma arvud. Ujukoma arvud on C-keeles //float// ja //double// tüüpi, millega saab esitada murdarve. Nende puuduseks on suhteliselt suur ressursinõudlikkus. Arvutites on nende arvutamiseks spetsiaalne riistvara, 8-bitisel AVR mikrokontrolleril tehakse arvutused tarkvaras, mis võtab suhteliselt palju programmimälu ja aega. Kui puudused pole olulised, on ujukoma arvud väärt kasutamist. |
| |
| [{{ :examples:sensor:photoresistor:sensor_photoresistor_vt935g_slope.png?260|VT935G valgustustiheduse (E) ja elektritakistuse (R) vaheline seos}}] | [{{ :examples:sensor:photoresistor:sensor_photoresistor_vt935g_slope.png?260|VT935G valgustustiheduse (E) ja elektritakistuse (R) vaheline seos}}] |
| E = 255,84 ⋅ R<sup>-10/9</sup> | E = 255,84 ⋅ R<sup>-10/9</sup> |
| |
| Nende valemite abil saab kasutada vaid Kodulabori Andurite mooduli plaadil olevat fototakistit. Teiste komponentidega skeemi kasutades tuleks valemites muuta vastavaid arvväärtusi. Järgnevalt on toodud näidisprogrammi lähtekood, mis teostab ADC-ga mõõtmist, arvutamist ja valgustustiheduse kuvamist LCD ekraanile. Kuid veel enne programmi kompileerimist tuleb projektis teha seadistused ujukoma arvude kasutuselevõtuks. Selle kohta on lühiõpetus tarkvara paigaldamise peatükis. | Nende valemite abil saab kasutada vaid Kodulabori moodulil olevat fototakistit. Teiste komponentidega skeemi kasutades tuleks valemites muuta vastavaid arvväärtusi. Järgnevalt on toodud näidisprogrammi lähtekood, mis teostab ADC-ga mõõtmist, arvutamist ja valgustustiheduse kuvamist LCD ekraanile. |
| |
| Näidisprogrammis defineeritakse pinge, takistuse ja valgustustiheduse muutujad ujukoma tüüpi arvuna //double//. Arvud, mida soovitakse kindlasti ujukoma tehetes kasutada, peavad alati sisaldama komakohta (C-keeles punkti), olgu kas või nulli, sest siis ei tõlgenda kompilaator neid valesti. //sprintf// abil ujukoma arvu tekstiks teisendades tuleb kasutada "%f" formaati, mida võib täiendada täis- ja komakohtade arvuga, näiteks "%3.2", mis kuvab alati 3 täis- ja 2 komakohta. | Näidisprogrammis defineeritakse pinge, takistuse ja valgustustiheduse muutujad ujukoma tüüpi arvuna //double//. Arvud, mida soovitakse kindlasti ujukoma tehetes kasutada, peavad alati sisaldama komakohta (C-keeles punkti), olgu kas või nulli, sest siis ei tõlgenda kompilaator neid valesti. |
| |
| <code c> | <code c> |
| // | // Kodulabori fototakisti näidisprogramm |
| // Kodulabori Andurite mooduli fototakisti näidisprogramm. | |
| // LCD ekraanil kuvatakse ligikaudne valgustustihedus luksides | // LCD ekraanil kuvatakse ligikaudne valgustustihedus luksides |
| // | |
| #include <stdio.h> | #include <stdio.h> |
| #include <math.h> | #include <math.h> |
| #include <homelab/delay.h> | #include <homelab/delay.h> |
| |
| // | |
| // Põhiprogramm | // Põhiprogramm |
| // | |
| int main(void) | int main(void) |
| { | { |
| lcd_gfx_init(); | lcd_gfx_init(); |
| |
| //LCD taustavalguse tööle seadmine | // LCD taustavalguse tööle seadmine |
| lcd_gfx_backlight(true); | lcd_gfx_backlight(true); |
| | |
| |
| // Lõputu tsükkel | // Lõputu tsükkel |
| while (true) | while (1) |
| { | { |
| // Fototakisti keskmistatud väärtuse lugemine | // Fototakisti keskmise väärtuse lugemine |
| adc_value = adc_get_average_value(1, 10); | adc_value = adc_get_average_value(13, 10); |
| | // Kodulabor II |
| | //adc_value = adc_get_average_value(1, 10); |
| |
| // Pinge arvutamine ADC sisendis | // Pinge arvutamine ADC sisendis |
| voltage = 5.0 * ((double)adc_value / 1024.0); | // Kodulabor II |
| | //voltage = 5.0 * ((double)adc_value / 1024.0); |
| | // Kodulabor III |
| | voltage = 2.0625 * ((double)adc_value / 2048.0); |
| |
| // Fototakisti takistuse arvutamine pingejaguris | // Fototakisti takistuse arvutamine pingejaguris |
| resistance = (10.0 * 5.0) / voltage - 10.0; | // Kodulabor II |
| | //resistance = (10.0 * 5.0) / voltage - 10.0; |
| // Valgustustiheduse luksides arvutamine | // Kodulabor III |
| | resistance = (33.0) / voltage - 10.0; |
| | |
| | // Valgustustiheduse luksideks arvutamine |
| illuminance = 255.84 * pow(resistance, -10/9); | illuminance = 255.84 * pow(resistance, -10/9); |
| | // Muutuja ekraanile kuvamiseks selle kaheks |
| | // eraldi täisarvuliseks muutujaks jagamine |
| | int8_t illu = illuminance; |
| | int16_t illudp = trunc((illuminance - illu) * 1000); |
| |
| // Valgustustiheduse tekstiks teisendamine | // Valgustustiheduse tekstiks teisendamine |
| sprintf(text, "%0.1f lux ", illuminance); | sprintf(text, "%3u.%3u lux ", illu,illudp); |
| |
| // Näidu LCD-l kuvamine | // Näidu LCD-l kuvamine |
| } | } |
| </code> | </code> |
| | /* |
| [[et:exercises:sensor:photoresistor:aplha|Koodi näide teksti LCD-le (Kodulabor ver 3.x ja vanemad)]] | [[et:exercises:sensor:photoresistor:aplha|Koodi näide teksti LCD-le (Kodulabor ver 3.x ja vanemad)]] |
| | */ |