Measured results of an XBee wireless sensor device are displayed a LCD on Nucleo board with an XBee coordinator which is in API mode.
Dependencies: TextLCD mbed xbee sample04_sens
Please refer to the following site for the details:
- http://developer.mbed.org/users/bokunimowakaru/code/xbee/wiki/Homepage (English)
- http://www.geocities.jp/bokunimowakaru/diy/xbee/xbee-nucleo.html (Japanese)
main.cpp@7:a3769f9f7dfc, 2014-09-26 (annotated)
- Committer:
- bokunimowakaru
- Date:
- Fri Sep 26 13:23:26 2014 +0000
- Revision:
- 7:a3769f9f7dfc
- Parent:
- 5:173a41d73454
- Child:
- 8:a114c798d954
Code Test Purpose Removed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bokunimowakaru | 0:0de2116533e1 | 1 | /********************************************************************* |
bokunimowakaru | 0:0de2116533e1 | 2 | サンプルアプリ4 センサー |
bokunimowakaru | 0:0de2116533e1 | 3 | 新しいセンサーデバイスを発見すると、そのデバイスから照度と温度を得ます。 |
bokunimowakaru | 0:0de2116533e1 | 4 | ここでは子機のXBeeセンサーにDigi純正のXBee Sensorを想定していますが、 |
bokunimowakaru | 0:0de2116533e1 | 5 | 自作したセンサーでもDIO1~2(XBee_pin 19~18)に0~1.2Vのアナログ電圧を |
bokunimowakaru | 0:0de2116533e1 | 6 | 与えていれば、何らかの値を読みとることができます。 |
bokunimowakaru | 0:0de2116533e1 | 7 | |
bokunimowakaru | 0:0de2116533e1 | 8 | 新しいXBee子機のコミッションボタンDIO0(XBee_pin 20)を押下する(信号レベ |
bokunimowakaru | 0:0de2116533e1 | 9 | ルがH→L→Hに推移する)と、子機から参加要求信号が発行されて、Arduino親機 |
bokunimowakaru | 0:0de2116533e1 | 10 | が子機を発見し、「found a device」と表示します。 |
bokunimowakaru | 0:0de2116533e1 | 11 | |
bokunimowakaru | 0:0de2116533e1 | 12 | ただし、複数のZigBeeネットワークに対応するために、ペアリングは起動後の |
bokunimowakaru | 0:0de2116533e1 | 13 | 30秒間しか受け付けません。Arduino親機を起動して、コミッションボタンを |
bokunimowakaru | 0:0de2116533e1 | 14 | 押してペアリングを実施しておき、再度、コミッションボタンでデバイス発見 |
bokunimowakaru | 0:0de2116533e1 | 15 | します。デバイス発見は30秒のペアリング期間後でも行えます。 |
bokunimowakaru | 0:0de2116533e1 | 16 | |
bokunimowakaru | 0:0de2116533e1 | 17 | 本ソースリストおよびソフトウェアは、ライセンスフリーです。 |
bokunimowakaru | 0:0de2116533e1 | 18 | 利用、編集、再配布等が自由に行えますが、著作権表示の改変は禁止します。 |
bokunimowakaru | 0:0de2116533e1 | 19 | |
bokunimowakaru | 0:0de2116533e1 | 20 | 解説: |
bokunimowakaru | 0:0de2116533e1 | 21 | http://www.geocities.jp/bokunimowakaru/diy/xbee/xbee-nucleo.html |
bokunimowakaru | 0:0de2116533e1 | 22 | |
bokunimowakaru | 4:09c0f8f67e63 | 23 | Copyright (c) 2010-2014 Wataru KUNINO |
bokunimowakaru | 0:0de2116533e1 | 24 | http://www.geocities.jp/bokunimowakaru/ |
bokunimowakaru | 0:0de2116533e1 | 25 | *********************************************************************/ |
bokunimowakaru | 0:0de2116533e1 | 26 | |
bokunimowakaru | 0:0de2116533e1 | 27 | #include <xbee.h> |
bokunimowakaru | 0:0de2116533e1 | 28 | #include "TextLCD.h" |
bokunimowakaru | 7:a3769f9f7dfc | 29 | #define FORCE_INTERVAL 100 // 1~254 データ要求間隔 |
bokunimowakaru | 0:0de2116533e1 | 30 | TextLCD lcd(PA_9, PC_7, PB_5, PB_4, PB_10, PA_8); // rs, e, d4-d7 |
bokunimowakaru | 4:09c0f8f67e63 | 31 | byte dev_sens[8]; // IEEE Address |
bokunimowakaru | 0:0de2116533e1 | 32 | |
bokunimowakaru | 0:0de2116533e1 | 33 | void setup(){ |
bokunimowakaru | 0:0de2116533e1 | 34 | lcd.cls(); lcd.printf("Sample 4 SENS"); |
bokunimowakaru | 0:0de2116533e1 | 35 | xbee_init( 0x00 ); // XBee用COMポートの初期化(引数はポート番号) |
bokunimowakaru | 0:0de2116533e1 | 36 | } |
bokunimowakaru | 0:0de2116533e1 | 37 | |
bokunimowakaru | 0:0de2116533e1 | 38 | void loop(){ |
bokunimowakaru | 4:09c0f8f67e63 | 39 | int i; |
bokunimowakaru | 4:09c0f8f67e63 | 40 | int dev_en = 0; // センサー発見の有無(0:未発見) |
bokunimowakaru | 4:09c0f8f67e63 | 41 | XBEE_RESULT xbee_result; // 受信データ用の構造体 |
bokunimowakaru | 4:09c0f8f67e63 | 42 | int trig=0; |
bokunimowakaru | 0:0de2116533e1 | 43 | float value; |
bokunimowakaru | 0:0de2116533e1 | 44 | |
bokunimowakaru | 0:0de2116533e1 | 45 | // デバイス探索 |
bokunimowakaru | 0:0de2116533e1 | 46 | lcd.cls(); lcd.printf("Searching:SENSOR"); |
bokunimowakaru | 0:0de2116533e1 | 47 | if( xbee_atnj(10) ){ // 10秒間の参加受け入れ |
bokunimowakaru | 0:0de2116533e1 | 48 | lcd.cls(); lcd.printf("Found a device"); |
bokunimowakaru | 0:0de2116533e1 | 49 | xbee_from( dev_sens ); // 受信したアドレスをdev_sensへ格納 |
bokunimowakaru | 0:0de2116533e1 | 50 | dev_en = 1; // sensor発見済 |
bokunimowakaru | 0:0de2116533e1 | 51 | xbee_gpio_config( dev_sens, 1 , AIN ); // 接続相手のポート1をAIN入力へ |
bokunimowakaru | 0:0de2116533e1 | 52 | xbee_gpio_config( dev_sens, 2 , AIN ); // 接続相手のポート2をAIN入力へ |
bokunimowakaru | 0:0de2116533e1 | 53 | }else{ |
bokunimowakaru | 0:0de2116533e1 | 54 | lcd.cls(); lcd.printf("Failed:no dev."); |
bokunimowakaru | 0:0de2116533e1 | 55 | } |
bokunimowakaru | 5:173a41d73454 | 56 | wait(1); |
bokunimowakaru | 5:173a41d73454 | 57 | lcd.cls(); |
bokunimowakaru | 0:0de2116533e1 | 58 | |
bokunimowakaru | 0:0de2116533e1 | 59 | // メイン処理 |
bokunimowakaru | 7:a3769f9f7dfc | 60 | while(1){ // 永久に受信する |
bokunimowakaru | 4:09c0f8f67e63 | 61 | if(dev_en){ |
bokunimowakaru | 4:09c0f8f67e63 | 62 | if(trig<=0){ |
bokunimowakaru | 7:a3769f9f7dfc | 63 | lcd.locate(12,0); lcd.printf("Trig"); wait(0.1); |
bokunimowakaru | 7:a3769f9f7dfc | 64 | xbee_force(dev_sens); // デバイスdev_sensへデータ要求 |
bokunimowakaru | 4:09c0f8f67e63 | 65 | trig = FORCE_INTERVAL; |
bokunimowakaru | 7:a3769f9f7dfc | 66 | lcd.locate(12,0); lcd.printf(" "); |
bokunimowakaru | 4:09c0f8f67e63 | 67 | } |
bokunimowakaru | 4:09c0f8f67e63 | 68 | }else{ |
bokunimowakaru | 7:a3769f9f7dfc | 69 | lcd.cls(); lcd.printf("Waiting for XBee"); |
bokunimowakaru | 7:a3769f9f7dfc | 70 | wait(0.5); |
bokunimowakaru | 5:173a41d73454 | 71 | lcd.cls(); |
bokunimowakaru | 0:0de2116533e1 | 72 | } |
bokunimowakaru | 0:0de2116533e1 | 73 | trig--; |
bokunimowakaru | 0:0de2116533e1 | 74 | |
bokunimowakaru | 0:0de2116533e1 | 75 | /* データ受信(待ち受けて受信する) */ |
bokunimowakaru | 7:a3769f9f7dfc | 76 | xbee_rx_call( &xbee_result ); // データを受信します。 |
bokunimowakaru | 7:a3769f9f7dfc | 77 | switch( xbee_result.MODE ){ // 受信したデータの内容(MODE値)に応じて |
bokunimowakaru | 7:a3769f9f7dfc | 78 | case MODE_RESP: // sensorからの応答の場合に照度と温度を表示 |
bokunimowakaru | 7:a3769f9f7dfc | 79 | case MODE_GPIN: // 周期方式でデータ受信した場合も想定 |
bokunimowakaru | 0:0de2116533e1 | 80 | if( bytecmp( dev_sens , &(xbee_result.FROM[0]) ,8 ) == 0 && xbee_result.STATUS == STATUS_OK ){ |
bokunimowakaru | 0:0de2116533e1 | 81 | // 照度測定結果 |
bokunimowakaru | 0:0de2116533e1 | 82 | value = xbee_sensor_result( &xbee_result, LIGHT); |
bokunimowakaru | 5:173a41d73454 | 83 | lcd.locate(0,0); lcd.printf( "%.1f Lux ",value); |
bokunimowakaru | 0:0de2116533e1 | 84 | // 温度測定結果 |
bokunimowakaru | 0:0de2116533e1 | 85 | value = xbee_sensor_result( &xbee_result, TEMP); |
bokunimowakaru | 5:173a41d73454 | 86 | lcd.locate(0,1); lcd.printf( "%.1f C ",value); |
bokunimowakaru | 0:0de2116533e1 | 87 | } |
bokunimowakaru | 0:0de2116533e1 | 88 | break; |
bokunimowakaru | 0:0de2116533e1 | 89 | case MODE_IDNT: // 新しいデバイスを発見 |
bokunimowakaru | 0:0de2116533e1 | 90 | lcd.cls(); lcd.printf("found a new dev"); |
bokunimowakaru | 0:0de2116533e1 | 91 | for( i=0;i<8;i++ ) dev_sens[i]=xbee_result.FROM[i]; |
bokunimowakaru | 0:0de2116533e1 | 92 | // 発見したアドレスをdev_sensに読み込み |
bokunimowakaru | 0:0de2116533e1 | 93 | dev_en = 1; // sensor発見済 |
bokunimowakaru | 4:09c0f8f67e63 | 94 | trig = 0; |
bokunimowakaru | 0:0de2116533e1 | 95 | xbee_gpio_config( dev_sens, 1 , AIN ); // 接続相手のポート1をAIN入力へ |
bokunimowakaru | 0:0de2116533e1 | 96 | xbee_gpio_config( dev_sens, 2 , AIN ); // 接続相手のポート2をAIN入力へ |
bokunimowakaru | 5:173a41d73454 | 97 | lcd.cls(); |
bokunimowakaru | 0:0de2116533e1 | 98 | break; |
bokunimowakaru | 0:0de2116533e1 | 99 | default: |
bokunimowakaru | 0:0de2116533e1 | 100 | break; |
bokunimowakaru | 0:0de2116533e1 | 101 | } |
bokunimowakaru | 0:0de2116533e1 | 102 | } |
bokunimowakaru | 0:0de2116533e1 | 103 | } |
bokunimowakaru | 0:0de2116533e1 | 104 | |
bokunimowakaru | 0:0de2116533e1 | 105 | int main(){ |
bokunimowakaru | 0:0de2116533e1 | 106 | setup(); |
bokunimowakaru | 0:0de2116533e1 | 107 | while(1) loop(); |
bokunimowakaru | 0:0de2116533e1 | 108 | } |