This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:sensor:1-wire [2012/01/22 21:08] – heikopikner | et:examples:sensor:1-wire [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== 1-wire temperatuuriandur ====== | + | < |
+ | ====== 1-juhtme tüüpi | ||
- | //Vajalikud teadmised: [HW] [[et: | + | //Vajalikud teadmised: [HW] [[et: |
+ | [HW] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
+ | ==== 1-juhtme protokoll ==== | ||
- | ==== 1-wire protokoll ==== | + | [{{ : |
+ | Lihtsamate seadmete ja anduritega suhtlemiseks | ||
+ | |||
+ | |||
+ | [{{: | ||
+ | |||
+ | |||
+ | 1-juhtme ühendus on peamiselt kasutusel erinevate andurite ja mäludega suhtlemiseks. Saavutatav maksimaalne kiirus jääb 16,3 kbit/s piirimaile. Juhtseade alustab suhtlust „reset“ impulsiga, mis tõmbab siini maha vähemalt 480 µs. Peale seda järgneb 8 bitine korraldus, mida kuulavad kõik seadmed. Seade, millele see adresseeritud on, vastab. Andmeid saadetakse ja võetakse vastu 8 bitistes gruppides. Seadmeid tuntakse ära unikaalse 64 bitise seerianumbri järgi. | ||
+ | |||
+ | Bittide edastamine toimub pulsi pikkuse järgi. " | ||
+ | |||
+ | ===== Praktika ===== | ||
+ | |||
+ | Robootika Kodulaboriga on lihtne kasutada 1-juhtme liidesega digitaalset termomeetrit tootekoodiga DS18S20. Selle tehnilised omadused on järgnevad: | ||
+ | |||
+ | * Toitapinge +3...+5 VDC | ||
+ | * Mõõdetav temperatuurivahemik -55...+100 °C | ||
+ | * Juhtme pikkus 2 m | ||
+ | * Andmeleht [[http:// | ||
+ | |||
+ | Toodud näiteprogramm teeb 1-juhtme temperatuurianduriga mõõtmisi ja kuvab tulemuse | ||
+ | Kasutajaliidese mooduli ekraanile kraadides. Ühele 1-juhtme siinile saab programmi praeguste | ||
+ | seadetega ühendada kuni viis andurit. Andurite otsimine toimub automaatselt. | ||
+ | |||
+ | 1-juhtme temperatuuriandur tuleb ühendada pistikusse PE0. Peale programmi pealelaadimist ja käivitamist ilmub ekraanile anduri järjekorra number ja selle anduri mõõdetav temperatuur kraadides Celsiuse järgi. Kui ühele siinile on ühendatud mitu andurit, siis nende temperatuure kuvatakse järjest. Lisaks näidatakse ka anduri tüüpi ja toiteviisi. Kodulabori anduri tüüp on DS18S20 ja toiteviis eraldi toitega ehk " | ||
+ | |||
+ | Juhtmete värvid anduri ühendamiseks: | ||
+ | * Roheline - VDD | ||
+ | * Valge - Andmed | ||
+ | * Pruun - GND | ||
+ | |||
+ | |||
+ | Temperatuuri lugemist võimaldava programmi näitekood on toodud allpool. Programmi tuleb kindlasti lisada | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <code c> | ||
+ | // | ||
+ | // 1-juhtme temperatuurianduri lugemise näide | ||
+ | // LCD-le kuvatakse temperatuuri näit | ||
+ | // | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | |||
+ | extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; | ||
+ | |||
+ | // | ||
+ | // Põhiprogramm | ||
+ | // | ||
+ | int main(void) | ||
+ | { | ||
+ | uint8_t nSensors, i; | ||
+ | int16_t decicelsius; | ||
+ | char s[10]; | ||
+ | char sensor_nr[1]; | ||
+ | |||
+ | // LCD ekraani algseadistamine | ||
+ | lcd_gfx_init(); | ||
+ | |||
+ | // 1-juhtme siini seadistamine. Anduri andmeliin on ühendatud PORTE viiku 0 | ||
+ | ow_set_bus(& | ||
+ | //! Kodulabori II versiooni puhul kasutage näiteks järgmist rida, | ||
+ | //! sel juhul andur ühendada ADC3 viiguga | ||
+ | //! ow_set_bus(& | ||
+ | |||
+ | // Andurite otsimine. Muutujale nSensor omistatakse kõikide leitud | ||
+ | // andurite arv. | ||
+ | nSensors = search_sensors(); | ||
+ | |||
+ | while(1) | ||
+ | { | ||
+ | // Kui andureid ei leita, siis seatakse püsti vealipp. | ||
+ | if ( nSensors == 0 ) | ||
+ | { | ||
+ | lcd_gfx_goto_char_xy(1, | ||
+ | lcd_gfx_write_string(" | ||
+ | } | ||
+ | |||
+ | // Kõikide andurite temperatuuride kuvamine vaheldumisi alates tagumisest andurist. | ||
+ | for ( i = nSensors; i > 0; i-- ) | ||
+ | { | ||
+ | // Mõõtmise tegemine. Vea korral seatakse vealipp. | ||
+ | if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, | ||
+ | { | ||
+ | sw_delay_ms( 750 ); | ||
+ | |||
+ | // Anduri väärtuse lugemine muutujasse decicelsius. Vea korral seatakse vealippp. | ||
+ | if ( DS18X20_read_decicelsius( & | ||
+ | { | ||
+ | |||
+ | // Sõna " | ||
+ | lcd_gfx_goto_char_xy(2, | ||
+ | lcd_gfx_write_string(" | ||
+ | |||
+ | // Kraadi tähise kuvamine | ||
+ | lcd_gfx_goto_char_xy(13, | ||
+ | lcd_gfx_write_string(" | ||
+ | |||
+ | // Lugemi stringiks teisendamine ühe komakohaga ja lisaks +/- lisamine. | ||
+ | DS18X20_format_from_decicelsius( decicelsius, | ||
+ | |||
+ | // Kui on vaja maksimaalset täpsust, kasutada järgmist funktsiooni: | ||
+ | // DS18X20_format_from_maxres( tval, s, 10 ); | ||
+ | |||
+ | // Temperatuuri ekraanile kuvamine | ||
+ | lcd_gfx_goto_char_xy(8, | ||
+ | lcd_gfx_write_string(s); | ||
+ | |||
+ | // Anduri numbri kuvamine. Eelnevalt teisendatakse see stringiks. | ||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | sprintf(sensor_nr, | ||
+ | lcd_gfx_write_string(sensor_nr); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | // CRC viga (Ühendus on maas) | ||
+ | lcd_gfx_goto_char_xy(1, | ||
+ | lcd_gfx_write_string(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | else | ||
+ | { | ||
+ | // Mõõtmine ebaõnnestus võibolla on siinil lühis | ||
+ | lcd_gfx_goto_char_xy(1, | ||
+ | lcd_gfx_write_string(" | ||
+ | } | ||
+ | } | ||
+ | sw_delay_ms(500); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
- | === Praktika === | ||