This is an old revision of the document!
Vajalikud teadmised: [HW] Kontrollermoodul, [AVR] USART, [LIB] Jadaliides,
[LIB] Alfabeetiline LCD
ZigBee on odav, lihtne ja madala voolutarbega standard juhtmevabade võrkude rakendusteks. See on mõeldud kasutamiseks madala andmeedastuskiirusega lihtsatesse juhtmevaba ühendust nõudvatesse seadmetesse, näiteks igasugu infotablood, tööstuslik- ja koduautomaatika. ZigBee iseorganiseeruv võrk on üsna säästliku energiatarbega erinevalt Bluetooth rakendustest, moodulite ärkamise ajad on kiired ja ärkveloleku aeg on minimiseeritud.
Kodulabori sidemooduli plaadil on alus ZigBee mooduli „Xbee“ paigaldamiseks. Suhtlus selle Xbee mooduliga toimub kasutades kontrolleri USART liidest.
Näiteprogramm otsib esmalt ümbruskonnast teisi ZigBee seadmeid ja kuvab nende aadresside nimekirja ekraani. Globaalsel 0000FFFF aadressil on eriomadus, sinna saates saavad andmed kätte kõik moodulid võrgus. 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_alpha.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); zigbee_node_t nodelist[ZIGBEE_MAX_NODES]; //teiste leitavate zigbee moodulite aadresside massiiv 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..."); // Otsi ümbrusest teisiZigBee mooduleid. Funktsioon 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 zigbee_lcd_show_nodes(2, nodelist, ZIGBEE_MAX_NODES); //mis reale kirjutab, kust võtab adr, mitu tk max 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); lcd_gfx_write_string((nodelist + adr)->address64l); //kuvab ainult aadressi tagumise osa (8 tähemärki) // Seadista ZigBee saatma infot valitud ZigBee nodele, antud juhul esimesele [0] zigbee_set_destination(port, &nodelist[adr]); //mis porti kasutab, kust võtab 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 omavahelise 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 alla vajutatud, tegutse. 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) { int8_t button_nr = -1; // vaikimisi väärtus -1 tähendab et ükski nupp pole vajutatud. 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; }