This is an old revision of the document!
The necessary knowledge: [HW] Controller module, [AVR] USART, [LIB] Serial Interface,
[LIB] Graphic LCD
ZigBee is a specification for a suite of high level communication protocols using small, low-power digital radios based on an IEEE 802 standard for personal area networks. It's designed for devices which require simple wireless networking and don't need high data transfer rate. Does devices might be for example information displays, home- and industrial automatic systems. The selforganise network from ZigBee the power demand compared with different Bluetooth application is quit efficient, modules goes quickly form sleep to awake, the awake time is minimized. ZigBee works radio band at 2.4 GHz.
Homelab's communication board has a place for connecting ZigBee's module called “Xbee”. Communication between it and the controller takes place using controller's UART interface. The device's mode is changed with the command “+++” to AT mode, further configuration is done with standard AT command. If communication between two modules has been established, then is returned to data transfer.
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.
#include <homelab/usart.h> #include <homelab/module/lcd_gfx.h> #include <homelab/delay.h> #include <homelab/pin.h> //Lisame ZigBee mooduli toe #include <homelab/module/zigbee.h> // USART liidese määramine usart port = USART(1); // LEDid ja nupud määrata pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; pin buttons[3] = { PIN(C, 0), PIN(C, 1), PIN(C, 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 = 0; //ühendatava mooduli jrk. nimekirjas // 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, USART_DATABITS_8, USART_STOPBITS_ONE, USART_PARITY_NONE, USART_BAUDRATE_ASYNC(9600)); // 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_clear(); lcd_gfx_goto_char_xy(0, 0); lcd_gfx_write_string(" ZigBee demo"); lcd_gfx_goto_char_xy(0, 1); lcd_gfx_write_string("Otsin..."); // Otsib ümbrusest teisiZigBee mooduleid // täidab nodelist massiivi leitud moodulite infoga. zigbee_find_nodes(port, nodelist, ZIGBEE_MAX_NODES); //lcd_gfx_clear(); lcd_gfx_goto_char_xy(0, 1); lcd_gfx_write_string("Leitud: "); // Kuvab ekraanil leitud moodulite nimekirja // (mis reale kirjutab, kust võtab adr, mitu tk max) zigbee_lcd_show_nodes(2, nodelist, ZIGBEE_MAX_NODES); hw_delay_ms(3000); lcd_gfx_clear(); // Kuvab ekraanil ühendamise teate lcd_gfx_goto_char_xy(0, 0); lcd_gfx_write_string("Yhendan..."); lcd_gfx_goto_char_xy(0, 1); //kuvab ainult aadressi tagumise osa (8 tähemärki) lcd_gfx_write_string((nodelist + adr)->address64l); // Seadista ZigBee saatma infot valitud ZigBee nodele, // antud juhul esimesele [0] // (mis porti kasutab, kust võtab adr) zigbee_set_destination(port, &nodelist[adr]); // Joonistab ekraanile infot lcd_gfx_goto_char_xy(0, 0); lcd_gfx_write_string(" ZigBee demo"); lcd_gfx_goto_char_xy(0, 1); lcd_gfx_write_string("Nupp1: LED1"); lcd_gfx_goto_char_xy(0, 2); lcd_gfx_write_string("Nupp2: LED2"); // 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; //muutuja nupuvajutuse registreerimiseks // 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, 'A' + button); } // Loe USART'st if (usart_has_data(port)) { // loe bait, teisenda leds massiivi indeksiks //ja muuda väljundit. pin_toggle(leds[usart_read_char(port) - 'A']); } // 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; }
#include <homelab/usart.h> #include <homelab/delay.h> #include <homelab/pin.h> //Lisame ZigBee mooduli toe #include <homelab/module/zigbee.h> // USART liidese määramine ZigBee jaoks usart port = USART(1); // LEDid ja nupud määrata pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; pin buttons[3] = { PIN(C, 2), PIN(C, 1), PIN(C, 0) }; // Teiste leitavate zigbee moodulite aadresside massiiv zigbee_node_t nodelist[6]; // 1 + broadcast aadress + varu(1) int main(void) { int8_t button = -1; //muutuja nupuvajutuse registreerimiseks // 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, USART_DATABITS_8, USART_STOPBITS_ONE, USART_PARITY_NONE, USART_BAUDRATE_ASYNC(9600)); // Otsib ümbrusest teisiZigBee mooduleid // täidab nodelist massiivi leitud moodulite aadressidega pin_set(leds[0]); zigbee_find_nodes(port, nodelist, 6); //millist USART-it kasutab, kuhu salvestab aadressid, mitu mahub võrku // võtab aega pin_set(leds[1]); // Seadista ZigBee saatma infot valitud ZigBee nodele, // (mis porti kasutab, kust võtab adr) zigbee_set_destination(port, &nodelist[0]); //esimesega ühenda //zigbee_set_destination(port, 0xFFFFFFFFFFFFFFFFFF); //esimesega ühenda //Kustuta LED-id -> ühendus olemas pin_set(leds[2]); // Lõputu tsükkel moodulite andmetevahetuse näitamiseks while (true) { // vaata kas mõni nupp on alla vajutatud for (uint8_t i=0; i<3; i++) if (!pin_get_value(buttons[i])) button = i; // kui nuppu on vajutatud if (button != -1) { //////////////////// SISU //////////////////////// } } }