This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
en:examples:communication:zigbee [2012/04/11 12:12] – illo | en:examples:communication:zigbee [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | <note important> | ||
====== ZigBee ====== | ====== ZigBee ====== | ||
Line 7: | Line 6: | ||
===== Theory ===== | ===== Theory ===== | ||
- | [{{ :: | + | [{{ :: |
- | 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. | + | ZigBee is a specification for high level communication protocols using small, low-power digital radios based on an IEEE 802.15.4-2003 |
- | ===== In practice ===== | + | Based on ZigBee wireless modules direct connection between two devices or more complicated network can be set up. In figure below a sensor network transferring measurement to user interface is illustrated. |
- | Homelab' | + | ===== Practice ===== |
- | This example | + | Robotic HomeLab Communication board has a connector for wireless modules, including ZigBee module XBee from Maxtream. Communication between module and the controller is realized over UART interface. At first device is set to API mode by sending command " |
+ | |||
+ | Example | ||
<code c> | <code c> | ||
Line 23: | Line 24: | ||
#include < | #include < | ||
- | //Lisame | + | //Adding |
#include < | #include < | ||
- | // USART liidese määramine | + | // Determination of the USART interface |
usart port = USART(1); | usart port = USART(1); | ||
- | // LEDid ja nupud määrata | + | // LED and button pin setup |
pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; | pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; | ||
pin buttons[3] = { PIN(C, 0), PIN(C, 1), PIN(C, 2) }; | pin buttons[3] = { PIN(C, 0), PIN(C, 1), PIN(C, 2) }; | ||
- | // ZigBee | + | // Max numbers of ZigBee |
#define ZIGBEE_MAX_NODES 4 | #define ZIGBEE_MAX_NODES 4 | ||
int8_t wait_button(uint16_t ms); | int8_t wait_button(uint16_t ms); | ||
- | // Teiste leitavate zigbee moodulite aadresside massiiv | + | // Address array of other Zigbee modules found in network |
zigbee_node_t nodelist[ZIGBEE_MAX_NODES]; | zigbee_node_t nodelist[ZIGBEE_MAX_NODES]; | ||
Line 44: | Line 45: | ||
int main(void) | int main(void) | ||
{ | { | ||
- | uint8_t adr = 0; //ühendatava mooduli jrk. nimekirjas | + | uint8_t adr = 0; //Acquired module order list |
- | // seadista LEDide ja nuppude | + | // LED and buttons |
for (int i=0; i<3; i++) | for (int i=0; i<3; i++) | ||
{ | { | ||
Line 53: | Line 54: | ||
} | } | ||
- | // USART liidese seadistamine | + | // Configuration of USART interface for communication whit ZigBee |
usart_init_async(port, | usart_init_async(port, | ||
| | ||
Line 60: | Line 61: | ||
| | ||
- | // LCD ekraani algseadistamine | + | // LCD display initalization |
lcd_gfx_init(); | lcd_gfx_init(); | ||
- | // Ekraani puhastamine | + | // Clear LCD |
lcd_gfx_clear(); | lcd_gfx_clear(); | ||
- | // Taustavalgustuse tööle lülitamine | + | // Turning back light ON |
lcd_gfx_backlight(true); | lcd_gfx_backlight(true); | ||
- | //Oota kuni teisi ZigBee | + | //Wait until other ZigBee |
lcd_gfx_clear(); | lcd_gfx_clear(); | ||
lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
Line 75: | Line 76: | ||
lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
- | lcd_gfx_write_string(" | + | lcd_gfx_write_string(" |
- | // Otsib ümbrusest teisiZigBee mooduleid | + | // Searching other ZigBee modules |
- | // täidab | + | // fills nodelist |
zigbee_find_nodes(port, | zigbee_find_nodes(port, | ||
// | // | ||
lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
- | lcd_gfx_write_string(" | + | lcd_gfx_write_string(" |
- | // Kuvab ekraanil leitud moodulite nimekirja | + | // Displays the list of found modules on LCD |
- | // (mis reale kirjutab, kust võtab adr, mitu tk max) | + | // (on what line to write, where takes addr., how many max) |
zigbee_lcd_show_nodes(2, | zigbee_lcd_show_nodes(2, | ||
hw_delay_ms(3000); | hw_delay_ms(3000); | ||
lcd_gfx_clear(); | lcd_gfx_clear(); | ||
- | // Kuvab ekraanil ühendamise teate | + | // Displaying connecting on LCD |
lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
- | lcd_gfx_write_string(" | + | lcd_gfx_write_string(" |
lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
- | //kuvab ainult aadressi tagumise osa (8 tähemärki) | + | //Displays only 8 last digit form the address |
lcd_gfx_write_string((nodelist + adr)-> | lcd_gfx_write_string((nodelist + adr)-> | ||
- | // Seadista | + | // Confederate |
- | // antud juhul esimesele | + | // in this case to first [0] |
- | // (mis porti kasutab, kust võtab adr) | + | // (What port is using, where takes the address) |
zigbee_set_destination(port, | zigbee_set_destination(port, | ||
- | // Joonistab ekraanile infot | + | // Displays info on LCD |
lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
lcd_gfx_write_string(" | lcd_gfx_write_string(" | ||
lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
- | lcd_gfx_write_string(" | + | lcd_gfx_write_string(" |
lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
- | lcd_gfx_write_string(" | + | lcd_gfx_write_string(" |
- | // Hoia meeles eelmist nuppu selleks, et vältida olukorda, | + | // Save the state of previous button to avoid multiple button pushes at once. |
- | // kus nuppu all hoides tuleb sada nupuvajutusi järjest. | + | // At first is -1 ie none of the buttons is pushed. |
- | // Algatuseks olgu see -1 ehk ükski nupp pole all. | + | |
int8_t previousButton = -1; | int8_t previousButton = -1; | ||
- | // Lõputu tsükkel moodulite andmetevahetuse näitamiseks | + | // Endles-loop for communicating between modules |
while (true) | while (true) | ||
{ | { | ||
- | int8_t button; //muutuja nupuvajutuse registreerimiseks | + | int8_t button; //variable for saving button pushes |
- | + | // wait 1 millisecond for button | |
- | // Oota nuppu 1 millisekund | + | |
button = wait_button(1); | button = wait_button(1); | ||
- | // Kui eelmises tsüklis oli nupp üleval ja nüüd on all | + | // if in last cycle button wasn't pressed but now is |
if (previousButton == -1 && button != -1) | if (previousButton == -1 && button != -1) | ||
{ | { | ||
- | // teisenda nupu indeks liites | + | // Convert button' |
- | // ja saada teisele moodulile | + | // and sent it to other modules |
- | // A täht on esimene nupp, B täht teine nupp jne | + | // A is for first button, B for second and so on |
usart_send_char(port, | usart_send_char(port, | ||
} | } | ||
- | // Loe USART'st | + | // read from USART |
if (usart_has_data(port)) | if (usart_has_data(port)) | ||
{ | { | ||
- | // loe bait, teisenda | + | // Read bait, convert to leds array index |
- | //ja muuda väljundit. | + | //and change the output. |
pin_toggle(leds[usart_read_char(port) - ' | pin_toggle(leds[usart_read_char(port) - ' | ||
} | } | ||
- | // Jäta meelde mis nupp oli hetkel alla vajutatud | + | // remember what button was pressed |
previousButton = button; | previousButton = button; | ||
} | } | ||
} | } | ||
- | // Ootab nupu vajutust | + | // Wait for button to be pressed for ms milliseconds. |
- | //Kui tuleb nupu vajutus, tagastab vastava nupu järjekorra numbri | + | //If button is pressed returns the queue number of the button |
int8_t wait_button(uint16_t ms) | int8_t wait_button(uint16_t ms) | ||
{ | { | ||
- | // Vaikimisi | + | // By default |
int8_t button_nr = -1; | int8_t button_nr = -1; | ||
uint16_t counter = 0; | uint16_t counter = 0; | ||
do | do | ||
{ | { | ||
- | // vaata kas mõni nupp on all | + | // check if one of the buttons is pressed |
for (uint8_t i=0; i<3; i++) | for (uint8_t i=0; i<3; i++) | ||
{ | { | ||
Line 167: | Line 166: | ||
} | } | ||
- | // oota 1 millisekund | + | // wait for 1 millisecond |
hw_delay_ms(1); | hw_delay_ms(1); | ||
- | // suurenda millisekundi loendurit | + | // increase millisecond counter |
counter++; | counter++; | ||
} while (button_nr == -1 && (counter < ms)); | } while (button_nr == -1 && (counter < ms)); |