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/23 11:30] – 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: | ||
| Line 6: | Line 7: | ||
| ===== Teooria ===== | ===== Teooria ===== | ||
| - | ==== 1-wire protokoll ==== | + | ==== 1-juhtme |
| - | Lihtsamate seadmete ja anduritega suhtlemiseks | + | [{{ : |
| - | {{: | + | Lihtsamate seadmete ja anduritega suhtlemiseks |
| - | 1-wire ü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. | ||
| - | Andmete edastamine toimub juhtseadme | + | [{{: |
| + | |||
| + | |||
| + | 1-juhtme ühendus on peamiselt kasutusel erinevate andurite | ||
| + | |||
| + | Bittide edastamine toimub pulsi pikkuse järgi. " | ||
| ===== Praktika ===== | ===== Praktika ===== | ||
| - | Kodulabori | + | Robootika Kodulaboriga |
| * Toitapinge +3...+5 VDC | * Toitapinge +3...+5 VDC | ||
| Line 25: | Line 30: | ||
| * Andmeleht [[http:// | * Andmeleht [[http:// | ||
| - | Toodud näiteprogramm teeb 1-wire temperatuurianduriga mõõtmisi ja kuvab tulemuse | + | Toodud näiteprogramm teeb 1-juhtme |
| - | kasutajaliidese | + | Kasutajaliidese mooduli |
| seadetega ühendada kuni viis andurit. Andurite otsimine toimub automaatselt. | seadetega ühendada kuni viis andurit. Andurite otsimine toimub automaatselt. | ||
| - | 1-wire temperatuuriandur tuleb ühendada | + | 1-juhtme |
| - | saab ka 1-wire andureid ühendada parasiittoitele ehk toitele läbi andmesiini. | + | |
| - | Sellisel juhul on kasutuses ainult kaks juhet ja programmi poolt kuvatakse | + | |
| - | toiteviisiks " | + | |
| - | kontrollida eelkõige ühendusi. | + | |
| Juhtmete värvid anduri ühendamiseks: | Juhtmete värvid anduri ühendamiseks: | ||
| Line 40: | Line 41: | ||
| * Pruun - GND | * Pruun - GND | ||
| - | {{: | ||
| - | {{: | ||
| - | Temperatuuri lugemist võimaldava programmi näitekood on toodud allpool. Programmi tuleb kindlasti lisada | + | Temperatuuri lugemist võimaldava programmi näitekood on toodud allpool. Programmi tuleb kindlasti lisada |
| - | {{: | ||
| - | ~~PB~~ | + | |
| + | < | ||
| <code c> | <code c> | ||
| - | #include <avr/io.h> | + | // |
| - | #include < | + | // 1-juhtme temperatuurianduri lugemise näide |
| + | // LCD-le kuvatakse temperatuuri näit | ||
| + | // | ||
| #include < | #include < | ||
| - | |||
| - | |||
| - | #include " | ||
| - | #include " | ||
| - | |||
| #include < | #include < | ||
| #include < | #include < | ||
| #include < | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| - | // | ||
| - | // Muutuja, mis on defineeritud mujal. Sellesse salvestatakse | ||
| - | // iga anduri järjekorra number ja anduri kood, mis on igal anduril unikaalne. | ||
| - | // | ||
| extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; | extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; | ||
| - | int main( void ) | + | // |
| + | // Põhiprogramm | ||
| + | // | ||
| + | int main(void) | ||
| { | { | ||
| uint8_t nSensors, i; | uint8_t nSensors, i; | ||
| int16_t decicelsius; | int16_t decicelsius; | ||
| - | uint8_t error; | ||
| char s[10]; | char s[10]; | ||
| char sensor_nr[1]; | char sensor_nr[1]; | ||
| - | |||
| - | // Anduriplaadi multiplexeri viigu seadistamine. | ||
| - | pin multiplexer_pin = PIN(G, 0); | ||
| // LCD ekraani algseadistamine | // LCD ekraani algseadistamine | ||
| lcd_gfx_init(); | lcd_gfx_init(); | ||
| - | + | ||
| - | // Ekraani puhastamine | + | // 1-juhtme siini seadistamine. Anduri andmeliin on ühendatud PORTE viiku 0 |
| - | lcd_gfx_clear(); | + | ow_set_bus(& |
| - | + | //! Kodulabori II versiooni puhul kasutage näiteks järgmist rida, | |
| - | // Taustavalgustuse tööle lülitamine | + | //! sel juhul andur ühendada |
| - | lcd_gfx_backlight(true); | + | //! ow_set_bus(& |
| - | + | ||
| - | // Multiplexeri viigu seadmine väljundiks ja seejärel toimub selle ümber | + | |
| - | // lülitamine, | + | |
| - | pin_setup_output(multiplexer_pin); | + | |
| - | pin_set(multiplexer_pin); | + | |
| - | + | ||
| - | // 1-Wire siini seadistamine. Anduriplaadil vastab viigule F3 ADC3 tähistusega pistik. | + | |
| - | ow_set_bus(& | + | |
| // Andurite otsimine. Muutujale nSensor omistatakse kõikide leitud | // Andurite otsimine. Muutujale nSensor omistatakse kõikide leitud | ||
| Line 100: | Line 86: | ||
| nSensors = search_sensors(); | nSensors = search_sensors(); | ||
| - | while(1) | + | while(1) |
| - | { | + | { |
| - | + | ||
| - | error = 0; | + | |
| // Kui andureid ei leita, siis seatakse püsti vealipp. | // Kui andureid ei leita, siis seatakse püsti vealipp. | ||
| - | if ( nSensors == 0 ) | + | if ( nSensors == 0 ) |
| { | { | ||
| - | error++; | + | lcd_gfx_goto_char_xy(1, |
| + | lcd_gfx_write_string(" | ||
| } | } | ||
| // Kõikide andurite temperatuuride kuvamine vaheldumisi alates tagumisest andurist. | // Kõikide andurite temperatuuride kuvamine vaheldumisi alates tagumisest andurist. | ||
| - | for ( i = nSensors; i > 0; i-- ) | + | for ( i = nSensors; i > 0; i-- ) |
| { | { | ||
| // Mõõtmise tegemine. Vea korral seatakse vealipp. | // Mõõtmise tegemine. Vea korral seatakse vealipp. | ||
| - | if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, | + | if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, |
| { | { | ||
| sw_delay_ms( 750 ); | sw_delay_ms( 750 ); | ||
| - | + | ||
| // Anduri väärtuse lugemine muutujasse decicelsius. Vea korral seatakse vealippp. | // Anduri väärtuse lugemine muutujasse decicelsius. Vea korral seatakse vealippp. | ||
| - | if ( DS18X20_read_decicelsius( & | + | if ( DS18X20_read_decicelsius( & |
| { | { | ||
| - | + | ||
| - | // Sõna "TEMP" kuvamine. | + | // Sõna "Temp" kuvamine. |
| lcd_gfx_goto_char_xy(2, | lcd_gfx_goto_char_xy(2, | ||
| - | lcd_gfx_write_string(" | + | lcd_gfx_write_string(" |
| // Kraadi tähise kuvamine | // Kraadi tähise kuvamine | ||
| lcd_gfx_goto_char_xy(13, | lcd_gfx_goto_char_xy(13, | ||
| lcd_gfx_write_string(" | lcd_gfx_write_string(" | ||
| - | + | ||
| // Lugemi stringiks teisendamine ühe komakohaga ja lisaks +/- lisamine. | // Lugemi stringiks teisendamine ühe komakohaga ja lisaks +/- lisamine. | ||
| DS18X20_format_from_decicelsius( decicelsius, | DS18X20_format_from_decicelsius( decicelsius, | ||
| // Kui on vaja maksimaalset täpsust, kasutada järgmist funktsiooni: | // Kui on vaja maksimaalset täpsust, kasutada järgmist funktsiooni: | ||
| - | // DS18X20_format_from_maxres( tval, s, 10 ); | + | // DS18X20_format_from_maxres( tval, s, 10 ); |
| - | + | ||
| // Temperatuuri ekraanile kuvamine | // Temperatuuri ekraanile kuvamine | ||
| - | lcd_gfx_goto_char_xy(7, 1); | + | lcd_gfx_goto_char_xy(8, 1); |
| lcd_gfx_write_string(s); | lcd_gfx_write_string(s); | ||
| - | + | ||
| // Anduri numbri kuvamine. Eelnevalt teisendatakse see stringiks. | // Anduri numbri kuvamine. Eelnevalt teisendatakse see stringiks. | ||
| lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
| sprintf(sensor_nr, | sprintf(sensor_nr, | ||
| lcd_gfx_write_string(sensor_nr); | lcd_gfx_write_string(sensor_nr); | ||
| - | } | + | } |
| - | else | + | else |
| { | { | ||
| // CRC viga (Ühendus on maas) | // CRC viga (Ühendus on maas) | ||
| - | error++; | + | lcd_gfx_goto_char_xy(1, |
| + | lcd_gfx_write_string(" | ||
| } | } | ||
| - | + | ||
| } | } | ||
| - | else | + | else |
| { | { | ||
| // Mõõtmine ebaõnnestus võibolla on siinil lühis | // Mõõtmine ebaõnnestus võibolla on siinil lühis | ||
| - | error++; | + | lcd_gfx_goto_char_xy(1, |
| + | lcd_gfx_write_string(" | ||
| } | } | ||
| } | } | ||
| - | |||
| - | |||
| - | // Veateate kuvamine. | ||
| - | if ( error ) | ||
| - | { | ||
| - | lcd_gfx_goto_char_xy(1, | ||
| - | lcd_gfx_write_string(" | ||
| - | error = 0; | ||
| - | } | ||
| - | else | ||
| - | { | ||
| - | lcd_gfx_goto_char_xy(1, | ||
| - | lcd_gfx_write_string(" | ||
| - | } | ||
| - | |||
| sw_delay_ms(500); | sw_delay_ms(500); | ||
| } | } | ||
| } | } | ||
| - | |||
| </ | </ | ||
| - | |||