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:36] – 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. | + | |
+ | [{{: | ||
+ | |||
+ | |||
+ | 1-juhtme | ||
Bittide edastamine toimub pulsi pikkuse järgi. " | Bittide edastamine toimub pulsi pikkuse järgi. " | ||
Line 18: | Line 23: | ||
===== 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 < | ||
+ | |||
+ | |||
+ | extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; | ||
// | // | ||
- | // Muutuja, mis on defineeritud mujal. Sellesse salvestatakse | + | // Põhiprogramm |
- | // iga anduri järjekorra number ja anduri kood, mis on igal anduril unikaalne. | + | |
// | // | ||
- | extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; | + | int main(void) |
- | + | ||
- | 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); | ||
} | } | ||
} | } | ||
- | |||
</ | </ | ||
- | |||