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

Dependents:   sample04_sens

Please refer to the following site for the details:

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?

UserRevisionLine numberNew 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 }