This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:communication:zigbee [2011/02/22 21:42] – raivo.sell | et:examples:communication:zigbee [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
====== ZigBee ====== | ====== ZigBee ====== | ||
- | //Vajalikud teadmised: [HW] [[et: | + | //Vajalikud teadmised: |
+ | [HW] [[et: | ||
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
Line 7: | Line 12: | ||
[{{ :: | [{{ :: | ||
+ | ZigBee on odav, lihtne ja madala voolutarbega IEEE 802.15.4 standardil baseeruv spetsifikatsioon juhtmevabade võrkude rakendusteks. See on mõeldud kasutamiseks madala andmeedastuskiirusega lihtsatesse juhtmevaba ühendust nõudvatesse seadmetesse, | ||
===== Praktika ===== | ===== Praktika ===== | ||
+ | |||
+ | Kodulabori sidemooduli plaadil on alus ZigBee mooduli „Xbee“ paigaldamiseks. Suhtlus selle Xbee mooduliga toimub kasutades kontrolleri USART liidest. ZigBee funktsioonide sees lülitatakse moodul ümber AT käsustiku peale saates talle " | ||
+ | |||
+ | Näiteprogramm otsib esmalt ümbruskonnast teisi ZigBee seadmeid ja vastav abifunktsioon kuvab nende aadresside nimekirja ekraanil. Globaalsel 0000FFFF aadressil on eriomadus, sinna saates saavad andmed kätte kõik võrgus kättesaadavad moodulid. Näites luuakse ühendus ühe soovitud mooduliga, misjärel saab nuppe vajutades vastastikku muuta moodulite LED-ide olekut. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | //Lisame ZigBee mooduli toe | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // USART liidese määramine | ||
+ | static usart port = USART(1); | ||
+ | |||
+ | // LEDid ja nupud määrata | ||
+ | pin leds[3] = { PIN(H, 5), PIN(H, 4), PIN(H, 3) }; | ||
+ | pin buttons[3] = { PIN(H, 0), PIN(H, 1), PIN(H, 2) }; | ||
+ | |||
+ | // ZigBee moodulite max arv võrgus + broadcast aadress + 1 | ||
+ | #define ZIGBEE_MAX_NODES 4 | ||
+ | |||
+ | int8_t wait_button(uint16_t ms); | ||
+ | |||
+ | // Teiste leitavate zigbee moodulite aadresside massiiv | ||
+ | zigbee_node_t nodelist[ZIGBEE_MAX_NODES]; | ||
+ | |||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | uint8_t adr = 1; | ||
+ | |||
+ | // seadista LEDide ja nuppude I/O pordid | ||
+ | for (int i=0; i<3; i++) | ||
+ | { | ||
+ | pin_setup_output(leds[i]); | ||
+ | pin_setup_input(buttons[i]); | ||
+ | } | ||
+ | |||
+ | // USART liidese seadistamine ZigBee side jaoks | ||
+ | usart_init_async(port, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | // LCD ekraani algseadistamine | ||
+ | lcd_gfx_init(); | ||
+ | |||
+ | // Ekraani puhastamine | ||
+ | lcd_gfx_clear(); | ||
+ | |||
+ | // Taustavalgustuse tööle lülitamine | ||
+ | lcd_gfx_backlight(true); | ||
+ | |||
+ | //Oota kuni teisi ZigBee mooduleid otsitakse läbiümbrusest | ||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | lcd_gfx_write_string(" | ||
+ | |||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | lcd_gfx_write_string(" | ||
+ | |||
+ | // Otsib ümbrusest teisiZigBee mooduleid | ||
+ | // täidab nodelist massiivi leitud moodulite infoga. | ||
+ | zigbee_find_nodes(port, | ||
+ | |||
+ | // | ||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | lcd_gfx_write_string(" | ||
+ | |||
+ | // Kuvab ekraanil leitud moodulite nimekirja | ||
+ | // (mis reale kirjutab, kust võtab adr, mitu tk max) | ||
+ | zigbee_lcd_show_nodes(48, | ||
+ | hw_delay_ms(3000); | ||
+ | lcd_gfx_clear(); | ||
+ | |||
+ | // Kuvab ekraanil ühendamise teate | ||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | lcd_gfx_write_string(" | ||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | //kuvab ainult aadressi tagumise osa (8 tähemärki) | ||
+ | lcd_gfx_write_string((nodelist + adr)-> | ||
+ | |||
+ | // Seadista ZigBee saatma infot valitud ZigBee nodele, | ||
+ | // antud juhul esimesele [0] | ||
+ | // (mis porti kasutab, kust võtab adr) | ||
+ | zigbee_set_destination(port, | ||
+ | |||
+ | lcd_gfx_clear(); | ||
+ | // Joonistab ekraanile infot | ||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | lcd_gfx_write_string(" | ||
+ | |||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | lcd_gfx_write_string(" | ||
+ | |||
+ | lcd_gfx_goto_char_xy(0, | ||
+ | lcd_gfx_write_string(" | ||
+ | |||
+ | // Hoia meeles eelmist nuppu selleks, et vältida olukorda, | ||
+ | // kus nuppu all hoides tuleb sada nupuvajutusi järjest. | ||
+ | // Algatuseks olgu see -1 ehk ükski nupp pole all. | ||
+ | int8_t previousButton = -1; | ||
+ | |||
+ | // Lõputu tsükkel moodulite andmetevahetuse näitamiseks | ||
+ | while (true) | ||
+ | { | ||
+ | int8_t button; | ||
+ | |||
+ | // Oota nuppu 1 millisekund | ||
+ | button = wait_button(1); | ||
+ | |||
+ | // Kui eelmises tsüklis oli nupp üleval ja nüüd on all | ||
+ | if (previousButton == -1 && button != -1) | ||
+ | { | ||
+ | // teisenda nupu indeks liites A täht | ||
+ | // ja saada teisele moodulile | ||
+ | // A täht on esimene nupp, B täht teine nupp jne | ||
+ | usart_send_char(port, | ||
+ | } | ||
+ | |||
+ | // Loe USART' | ||
+ | if (usart_has_data(port)) | ||
+ | { | ||
+ | // loe bait, teisenda leds massiivi indeksiks | ||
+ | //ja muuda väljundit. | ||
+ | pin_toggle(leds[usart_read_char(port) - ' | ||
+ | } | ||
+ | |||
+ | // Jäta meelde mis nupp oli hetkel alla vajutatud | ||
+ | previousButton = button; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Ootab nupu vajutust ms millisekundit. | ||
+ | //Kui tuleb nupu vajutus, tagastab vastava nupu järjekorra numbri | ||
+ | int8_t wait_button(uint16_t ms) | ||
+ | { | ||
+ | // Vaikimisi -1 tähendab, et ükski nupp pole vajutatud. | ||
+ | int8_t button_nr = -1; | ||
+ | uint16_t counter = 0; | ||
+ | do | ||
+ | { | ||
+ | // vaata kas mõni nupp on all | ||
+ | for (uint8_t i=0; i<3; i++) | ||
+ | { | ||
+ | if (!pin_get_value(buttons[i])) | ||
+ | { | ||
+ | button_nr = i; | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // oota 1 millisekund | ||
+ | hw_delay_ms(1); | ||
+ | |||
+ | // suurenda millisekundi loendurit | ||
+ | counter++; | ||
+ | } | ||
+ | while (button_nr == -1 && (counter < ms)); | ||
+ | |||
+ | return button_nr; | ||
+ | } | ||
+ | </ | ||
+ |