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@5:173a41d73454, 2014-09-25 (annotated)
- Committer:
- bokunimowakaru
- Date:
- Thu Sep 25 12:13:11 2014 +0000
- Revision:
- 5:173a41d73454
- Parent:
- 4:09c0f8f67e63
- Child:
- 7:a3769f9f7dfc
Release Version 1.91 (passed all of tests; examples, aging)
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 | 4:09c0f8f67e63 | 29 | #define FORCE_INTERVAL 10 // 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 | 0:0de2116533e1 | 60 | while(1){ // 永久に受信する |
bokunimowakaru | 4:09c0f8f67e63 | 61 | if(dev_en){ |
bokunimowakaru | 4:09c0f8f67e63 | 62 | if(trig<=0){ |
bokunimowakaru | 5:173a41d73454 | 63 | lcd.locate(12,0); |
bokunimowakaru | 5:173a41d73454 | 64 | lcd.printf("Trig"); |
bokunimowakaru | 5:173a41d73454 | 65 | wait(0.1); |
bokunimowakaru | 5:173a41d73454 | 66 | if(xbee_force(dev_sens)==0){ // デバイスdev_sensへデータ要求 |
bokunimowakaru | 4:09c0f8f67e63 | 67 | lcd.locate(10,0); |
bokunimowakaru | 4:09c0f8f67e63 | 68 | lcd.printf("Error"); |
bokunimowakaru | 4:09c0f8f67e63 | 69 | lcd.locate(14,1); |
bokunimowakaru | 4:09c0f8f67e63 | 70 | lcd.printf("%02X",(byte)trig); |
bokunimowakaru | 4:09c0f8f67e63 | 71 | } |
bokunimowakaru | 4:09c0f8f67e63 | 72 | trig = FORCE_INTERVAL; |
bokunimowakaru | 5:173a41d73454 | 73 | lcd.locate(12,0); |
bokunimowakaru | 5:173a41d73454 | 74 | lcd.printf(" "); |
bokunimowakaru | 4:09c0f8f67e63 | 75 | } |
bokunimowakaru | 4:09c0f8f67e63 | 76 | }else{ |
bokunimowakaru | 4:09c0f8f67e63 | 77 | lcd.cls(); |
bokunimowakaru | 4:09c0f8f67e63 | 78 | lcd.printf("Waiting for XBee"); |
bokunimowakaru | 5:173a41d73454 | 79 | wait(1); |
bokunimowakaru | 5:173a41d73454 | 80 | lcd.cls(); |
bokunimowakaru | 0:0de2116533e1 | 81 | } |
bokunimowakaru | 0:0de2116533e1 | 82 | trig--; |
bokunimowakaru | 0:0de2116533e1 | 83 | |
bokunimowakaru | 0:0de2116533e1 | 84 | /* データ受信(待ち受けて受信する) */ |
bokunimowakaru | 5:173a41d73454 | 85 | lcd.locate(14,1); lcd.printf("RX"); |
bokunimowakaru | 5:173a41d73454 | 86 | xbee_rx_call( &xbee_result ); // データを受信します。 |
bokunimowakaru | 5:173a41d73454 | 87 | lcd.locate(14,1); lcd.printf(" "); |
bokunimowakaru | 0:0de2116533e1 | 88 | switch( xbee_result.MODE ){ // 受信したデータの内容(MODE値)に応じて |
bokunimowakaru | 0:0de2116533e1 | 89 | case MODE_RESP: // sensorからの応答の場合に照度と温度を表示 |
bokunimowakaru | 0:0de2116533e1 | 90 | case MODE_GPIN: // 周期方式でデータ受信した場合も想定 |
bokunimowakaru | 0:0de2116533e1 | 91 | if( bytecmp( dev_sens , &(xbee_result.FROM[0]) ,8 ) == 0 && xbee_result.STATUS == STATUS_OK ){ |
bokunimowakaru | 0:0de2116533e1 | 92 | // 照度測定結果 |
bokunimowakaru | 0:0de2116533e1 | 93 | value = xbee_sensor_result( &xbee_result, LIGHT); |
bokunimowakaru | 5:173a41d73454 | 94 | lcd.locate(0,0); lcd.printf( "%.1f Lux ",value); |
bokunimowakaru | 0:0de2116533e1 | 95 | // 温度測定結果 |
bokunimowakaru | 0:0de2116533e1 | 96 | value = xbee_sensor_result( &xbee_result, TEMP); |
bokunimowakaru | 5:173a41d73454 | 97 | lcd.locate(0,1); lcd.printf( "%.1f C ",value); |
bokunimowakaru | 0:0de2116533e1 | 98 | } |
bokunimowakaru | 0:0de2116533e1 | 99 | break; |
bokunimowakaru | 0:0de2116533e1 | 100 | case MODE_IDNT: // 新しいデバイスを発見 |
bokunimowakaru | 0:0de2116533e1 | 101 | lcd.cls(); lcd.printf("found a new dev"); |
bokunimowakaru | 0:0de2116533e1 | 102 | for( i=0;i<8;i++ ) dev_sens[i]=xbee_result.FROM[i]; |
bokunimowakaru | 0:0de2116533e1 | 103 | // 発見したアドレスをdev_sensに読み込み |
bokunimowakaru | 0:0de2116533e1 | 104 | dev_en = 1; // sensor発見済 |
bokunimowakaru | 4:09c0f8f67e63 | 105 | trig = 0; |
bokunimowakaru | 0:0de2116533e1 | 106 | xbee_gpio_config( dev_sens, 1 , AIN ); // 接続相手のポート1をAIN入力へ |
bokunimowakaru | 0:0de2116533e1 | 107 | xbee_gpio_config( dev_sens, 2 , AIN ); // 接続相手のポート2をAIN入力へ |
bokunimowakaru | 5:173a41d73454 | 108 | lcd.cls(); |
bokunimowakaru | 0:0de2116533e1 | 109 | break; |
bokunimowakaru | 0:0de2116533e1 | 110 | default: |
bokunimowakaru | 0:0de2116533e1 | 111 | break; |
bokunimowakaru | 0:0de2116533e1 | 112 | } |
bokunimowakaru | 0:0de2116533e1 | 113 | } |
bokunimowakaru | 0:0de2116533e1 | 114 | } |
bokunimowakaru | 0:0de2116533e1 | 115 | |
bokunimowakaru | 0:0de2116533e1 | 116 | int main(){ |
bokunimowakaru | 0:0de2116533e1 | 117 | setup(); |
bokunimowakaru | 0:0de2116533e1 | 118 | while(1) loop(); |
bokunimowakaru | 0:0de2116533e1 | 119 | } |