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; | ||
| + | } | ||
| + | </ | ||