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@0:0de2116533e1, 2014-06-22 (annotated)
- Committer:
- bokunimowakaru
- Date:
- Sun Jun 22 06:37:51 2014 +0000
- Revision:
- 0:0de2116533e1
- Child:
- 4:09c0f8f67e63
For Ver 1.88.
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 | 0:0de2116533e1 | 23 | Copyright (c) 2010-2012 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 | 0:0de2116533e1 | 29 | TextLCD lcd(PA_9, PC_7, PB_5, PB_4, PB_10, PA_8); // rs, e, d4-d7 |
bokunimowakaru | 0:0de2116533e1 | 30 | |
bokunimowakaru | 0:0de2116533e1 | 31 | byte dev_sens[] = {0x00,0x13,0xA2,0x00,0x40,0x00,0x00,0x00}; // 仮設定 |
bokunimowakaru | 0:0de2116533e1 | 32 | byte dev_en = 0; // センサー発見の有無(0:未発見) |
bokunimowakaru | 0:0de2116533e1 | 33 | |
bokunimowakaru | 0:0de2116533e1 | 34 | void setup(){ |
bokunimowakaru | 0:0de2116533e1 | 35 | lcd.cls(); lcd.printf("Sample 4 SENS"); |
bokunimowakaru | 0:0de2116533e1 | 36 | xbee_init( 0x00 ); // XBee用COMポートの初期化(引数はポート番号) |
bokunimowakaru | 0:0de2116533e1 | 37 | } |
bokunimowakaru | 0:0de2116533e1 | 38 | |
bokunimowakaru | 0:0de2116533e1 | 39 | void loop(){ |
bokunimowakaru | 0:0de2116533e1 | 40 | byte i; |
bokunimowakaru | 0:0de2116533e1 | 41 | byte trig=0; |
bokunimowakaru | 0:0de2116533e1 | 42 | float value; |
bokunimowakaru | 0:0de2116533e1 | 43 | XBEE_RESULT xbee_result; // 受信データ用の構造体 |
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 | // xbee_gpio_config( dev_sens, 3 , AIN ); // 接続相手のポート3をAIN入力へ |
bokunimowakaru | 0:0de2116533e1 | 54 | }else{ |
bokunimowakaru | 0:0de2116533e1 | 55 | lcd.cls(); lcd.printf("Failed:no dev."); |
bokunimowakaru | 0:0de2116533e1 | 56 | } |
bokunimowakaru | 0:0de2116533e1 | 57 | wait(0.5); |
bokunimowakaru | 0:0de2116533e1 | 58 | lcd.cls(); lcd.printf("DONE"); |
bokunimowakaru | 0:0de2116533e1 | 59 | |
bokunimowakaru | 0:0de2116533e1 | 60 | // メイン処理 |
bokunimowakaru | 0:0de2116533e1 | 61 | lcd.cls(); lcd.printf("Receiving"); |
bokunimowakaru | 0:0de2116533e1 | 62 | while(1){ // 永久に受信する |
bokunimowakaru | 0:0de2116533e1 | 63 | if( dev_en && trig == 0){ |
bokunimowakaru | 0:0de2116533e1 | 64 | xbee_force( dev_sens ); // デバイスdev_sensへデータ要求(100回に1回の頻度で) |
bokunimowakaru | 0:0de2116533e1 | 65 | trig = 100; |
bokunimowakaru | 0:0de2116533e1 | 66 | } |
bokunimowakaru | 0:0de2116533e1 | 67 | trig--; |
bokunimowakaru | 0:0de2116533e1 | 68 | |
bokunimowakaru | 0:0de2116533e1 | 69 | /* データ受信(待ち受けて受信する) */ |
bokunimowakaru | 0:0de2116533e1 | 70 | xbee_rx_call( &xbee_result ); |
bokunimowakaru | 0:0de2116533e1 | 71 | // データを受信します。 |
bokunimowakaru | 0:0de2116533e1 | 72 | switch( xbee_result.MODE ){ // 受信したデータの内容(MODE値)に応じて |
bokunimowakaru | 0:0de2116533e1 | 73 | case MODE_RESP: // sensorからの応答の場合に照度と温度を表示 |
bokunimowakaru | 0:0de2116533e1 | 74 | case MODE_GPIN: // 周期方式でデータ受信した場合も想定 |
bokunimowakaru | 0:0de2116533e1 | 75 | if( bytecmp( dev_sens , &(xbee_result.FROM[0]) ,8 ) == 0 && xbee_result.STATUS == STATUS_OK ){ |
bokunimowakaru | 0:0de2116533e1 | 76 | // 照度測定結果 |
bokunimowakaru | 0:0de2116533e1 | 77 | value = xbee_sensor_result( &xbee_result, LIGHT); |
bokunimowakaru | 0:0de2116533e1 | 78 | lcd.cls(); lcd.printf( "%.1f",value ); lcd.printf(" Lux "); |
bokunimowakaru | 0:0de2116533e1 | 79 | // 温度測定結果 |
bokunimowakaru | 0:0de2116533e1 | 80 | value = xbee_sensor_result( &xbee_result, TEMP); |
bokunimowakaru | 0:0de2116533e1 | 81 | lcd.locate(0,1); lcd.printf( "%.1f",value ); lcd.printf(" C"); |
bokunimowakaru | 0:0de2116533e1 | 82 | } |
bokunimowakaru | 0:0de2116533e1 | 83 | break; |
bokunimowakaru | 0:0de2116533e1 | 84 | case MODE_IDNT: // 新しいデバイスを発見 |
bokunimowakaru | 0:0de2116533e1 | 85 | lcd.cls(); lcd.printf("found a new dev"); |
bokunimowakaru | 0:0de2116533e1 | 86 | for( i=0;i<8;i++ ) dev_sens[i]=xbee_result.FROM[i]; |
bokunimowakaru | 0:0de2116533e1 | 87 | // 発見したアドレスをdev_sensに読み込み |
bokunimowakaru | 0:0de2116533e1 | 88 | dev_en = 1; // sensor発見済 |
bokunimowakaru | 0:0de2116533e1 | 89 | xbee_gpio_config( dev_sens, 1 , AIN ); // 接続相手のポート1をAIN入力へ |
bokunimowakaru | 0:0de2116533e1 | 90 | xbee_gpio_config( dev_sens, 2 , AIN ); // 接続相手のポート2をAIN入力へ |
bokunimowakaru | 0:0de2116533e1 | 91 | // xbee_gpio_config( dev_sens, 3 , AIN ); // 接続相手のポート3をAIN入力へ |
bokunimowakaru | 0:0de2116533e1 | 92 | break; |
bokunimowakaru | 0:0de2116533e1 | 93 | default: |
bokunimowakaru | 0:0de2116533e1 | 94 | break; |
bokunimowakaru | 0:0de2116533e1 | 95 | } |
bokunimowakaru | 0:0de2116533e1 | 96 | } |
bokunimowakaru | 0:0de2116533e1 | 97 | } |
bokunimowakaru | 0:0de2116533e1 | 98 | |
bokunimowakaru | 0:0de2116533e1 | 99 | int main(){ |
bokunimowakaru | 0:0de2116533e1 | 100 | setup(); |
bokunimowakaru | 0:0de2116533e1 | 101 | while(1) loop(); |
bokunimowakaru | 0:0de2116533e1 | 102 | } |