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/25 20:36] – ZigBee näide lisatud eero.valjaots | 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 | + | ZigBee on odav, lihtne ja madala voolutarbega |
===== Praktika ===== | ===== Praktika ===== | ||
- | Kodulabori sidemooduli plaadil on alus ZigBee mooduli „Xbee“ paigaldamiseks. Suhtlus selle Xbee mooduliga toimub kasutades kontrolleri USART liidest. | + | 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 kuvab nende aadresside nimekirja | + | Näiteprogramm otsib esmalt ümbruskonnast teisi ZigBee seadmeid ja vastav abifunktsioon |
+ | <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; | ||
+ | } | ||
+ | </ | ||