This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:communication:bluetooth [2011/03/09 00:19] – raivo.sell | et:examples:communication:bluetooth [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| //Vajalikud teadmised: [HW] [[et: | //Vajalikud teadmised: [HW] [[et: | ||
| + | |||
| + | **Eunistone mooduli puhul vaata siia:** | ||
| + | [[et/ | ||
| ===== Teooria ===== | ===== Teooria ===== | ||
| [{{ :: | [{{ :: | ||
| + | |||
| + | Bluetooth on tööstusstandard seadmete omavaheliseks traadita ühenduseks. Selle eesmärgiks on juhtmeühenduste asendamine mobiiltelefonide, | ||
| ===== Praktika ===== | ===== Praktika ===== | ||
| + | |||
| + | Bluetooth Bee moodul sobib Kodulabori sidemooduli plaadile „XBee" | ||
| + | |||
| + | Bluetoot Bee moodul loeb käsu õigeks, kui see on alustatud ja lõpetatud ASCII märkidega CR (13 ehk ’\r’) ja LF (10 ehk ’\n’). Moodulit on võimalik testimiseks ühendada ka arvuti jadaliidesesse. Suhtlemiseks näiteks Hyper Terminali abil tuleb seal valida // | ||
| + | |||
| + | Kui mooduli saab toite ja on jadaliidese pordi kaudu suhtlemiseks saadaval, siis vilgub roheline LED kiirelt kaks korda sekundis. Selles vaikimisi olekus ei ole Bluetooth Bee arvutist leitav, kui sealt ümberringi asuvaid Bluetooth seadmeid otsida. | ||
| + | |||
| + | Bluetooth Bee moodulit saab ühendada arvutiga kahel viisil: kas seadistada Bluetooth Bee alluvaks seadmeks ja alustada ühendust arvutist või seadistada see ülemaks seadmeks, detekteerida Bluetooth toega arvuti ja ühendada see endaga. | ||
| + | |||
| + | Esmalt tuleb määrata mooduli pin-kood Bluetooth seadmete paarimiseks. See toimub käsuga „\r\n+STPIN=0000\r\n“, | ||
| + | Käsk „\r\n+STWMOD=0\r\n“ seab Bluetooth Bee mooduli alluvaks seadmeks. | ||
| + | „\r\n+INQ=1\r\n“ lubab moodulit leida teistest seadmetest (punane ja roheline LED hakkavad vaheldusmisi vilkuma). Arvutist on seade nüüd leitav, selle saab paarida ja luua ühenduse virtuaalse jadaliidese kaudu. Moodul küsib ühenduse loomisel arvutist ka pin-koodi. Aktiivse ühenduse olemasolul vilgub mooduli roheline LED kord kahe sekundi jooksul. | ||
| + | |||
| + | Teisel juhul viib „\r\n+STWMOD=1\r\n“ Bluetooth Bee ülema seadme režiimi. | ||
| + | „\r\n+INQ=1\r\n“ paneb mooduli teisi seadmeid otsima. | ||
| + | Leitud Bluetooth seadmete või arvutite aadressid saadab moodul tagasi näiteks kujul „\r\n+RTINQ=0, | ||
| + | Leitud aadresside abil saab luua ühenduse soovitud seadmega „\r\n+CONN=0, | ||
| + | |||
| + | Kui ühendus on loodud virtuaalse jadaliidese abil, siis on võimalik arvutist saata Hyper Terminali vms. kaudu andmeid Bluetooth Bee vahendusel kontrollerile. Ühenduse katkestamiseks tuleb seda teha arvutist või tekitada kontrolleriga Bluetooth Bee PIO0 sisendisse tõusev front. | ||
| + | |||
| + | Järgnev kood selgitab mooduli kasutamist analoogselt ZigBee näitele. Siin seatakse Bluetooth Bee ülemaks seadmeks (seda on vaja teha ainult esimesel korral, nagu ka pin-koodi, mooduli nime jm. seadete sisestust) ja luuakse selle abil ühendus mõne muu seadmega. | ||
| + | |||
| + | <code c> | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | //Lisame ZigBee mooduli toe | ||
| + | #include < | ||
| + | |||
| + | // USART liidese määramine | ||
| + | usart port = USART(1); | ||
| + | |||
| + | // LEDid ja nupud määrata | ||
| + | pin leds[3] = { PIN(C, 3), PIN(C, 4), PIN(C, 5) }; | ||
| + | pin buttons[3] = { PIN(C, 0), PIN(C, 1), PIN(C, 2) }; | ||
| + | |||
| + | int8_t wait_button(uint16_t ms); | ||
| + | void bluetooth_read_string(usart port, char *text, char chr); | ||
| + | |||
| + | // | ||
| + | char btadr[16] = {' | ||
| + | ',',' | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | char tekst[24]; | ||
| + | int a = 0; | ||
| + | |||
| + | // 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 Bluetooth side jaoks | ||
| + | usart_init_async(port, | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | // LCD ekraani algseadistamine | ||
| + | lcd_gfx_init(); | ||
| + | |||
| + | // Taustavalgustuse tööle lülitamine | ||
| + | lcd_gfx_backlight(true); | ||
| + | |||
| + | // Bluetooth Bee seadistamine ülemaks seadmeks | ||
| + | // seda on vaja teha ainult üks kord, | ||
| + | // järgmine kord moodul juba mäletab seadeid | ||
| + | lcd_gfx_clear(); | ||
| + | // saada moodulile käsk | ||
| + | usart_send_string(port," | ||
| + | // loeb kuni õige vastus tuleb | ||
| + | while (tekst[9] != ' | ||
| + | { | ||
| + | //loe üks mooduli saadetud string | ||
| + | bluetooth_read_string(port, | ||
| + | //kirjuta ekraanile | ||
| + | lcd_gfx_goto_char_xy(0, | ||
| + | lcd_gfx_write_string(tekst); | ||
| + | a++; | ||
| + | } | ||
| + | hw_delay_ms(3000); | ||
| + | |||
| + | // Ühendamine soovitud seadmega | ||
| + | lcd_gfx_clear(); | ||
| + | //saada käsk | ||
| + | usart_send_string(port," | ||
| + | // saada ühendatava seadme aadress | ||
| + | usart_send_string(port, | ||
| + | // lõpeta käsk | ||
| + | usart_send_string(port," | ||
| + | //oota vastuseid | ||
| + | for (a=0; a<8; a++) | ||
| + | { | ||
| + | bluetooth_read_string(port, | ||
| + | lcd_gfx_goto_char_xy(0, | ||
| + | lcd_gfx_write_string(tekst); | ||
| + | } | ||
| + | hw_delay_ms(3000); | ||
| + | |||
| + | // Joonistab ekraanile infot | ||
| + | lcd_gfx_clear(); | ||
| + | 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(" | ||
| + | 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 nr-i | ||
| + | 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; | ||
| + | } | ||
| + | |||
| + | void bluetooth_read_string(usart port, char *text, char chr) | ||
| + | { | ||
| + | char buf = 0; | ||
| + | int end = 0; | ||
| + | int lnd = 0; | ||
| + | |||
| + | // salvestab vajaliku osa saadud stringist | ||
| + | while (end < 2) | ||
| + | { | ||
| + | // oota saabuvat baiti | ||
| + | while (!usart_has_data(port)); | ||
| + | |||
| + | // lae ringi saadud bait | ||
| + | buf = usart_read_char(port); | ||
| + | |||
| + | // kui lubatud salvestada | ||
| + | if (end == 1) | ||
| + | { | ||
| + | // lõpeta CR peale, muul juhul salvesta | ||
| + | if (buf == 13) end = 2; | ||
| + | else text[lnd] = buf; | ||
| + | // kohaloendur | ||
| + | | ||
| + | } | ||
| + | // kui on õige tähemärk, siis salvestama | ||
| + | if (buf == chr) end = 1; | ||
| + | } | ||
| + | // stringi terminaator lõppu | ||
| + | text[lnd-1] = 0; | ||
| + | } | ||
| + | |||
| + | </ | ||