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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*********************************************************************
00002 サンプルアプリ4 センサー
00003 新しいセンサーデバイスを発見すると、そのデバイスから照度と温度を得ます。
00004 ここでは子機のXBeeセンサーにDigi純正のXBee Sensorを想定していますが、
00005 自作したセンサーでもDIO1~2(XBee_pin 19~18)に0~1.2Vのアナログ電圧を
00006 与えていれば、何らかの値を読みとることができます。
00007 
00008 Sample Code 4 Sensor
00009 Measured results of an XBee wireless sensor device are displayed a LCD
00010 on Nucleo board with an XBee coordinator which is in API mode.
00011 When you will use this anything other than Nucleo microcomputer board,
00012 please change the 4th line of xbee/xbee.cpp:
00013         RawSerial _xbee_serial(SERIAL_TX, SERIAL_RX);
00014 
00015 新しいXBee子機のコミッションボタンDIO0(XBee_pin 20)を押下する(信号レベ
00016 ルがH→L→Hに推移する)と、子機から参加要求信号が発行されて、Arduino親機
00017 が子機を発見し、「found a device」と表示します。
00018 
00019 ただし、複数のZigBeeネットワークに対応するために、ペアリングは起動後の
00020 30秒間しか受け付けません。Arduino親機を起動して、コミッションボタンを
00021 押してペアリングを実施しておき、再度、コミッションボタンでデバイス発見
00022 します。デバイス発見は30秒のペアリング期間後でも行えます。
00023 
00024 本ソースリストおよびソフトウェアは、ライセンスフリーです。
00025 利用、編集、再配布等が自由に行えますが、著作権表示の改変は禁止します。
00026 
00027 解説:
00028 http://www.geocities.jp/bokunimowakaru/diy/xbee/xbee-nucleo.html
00029 
00030                                Copyright (c) 2010-2014 Wataru KUNINO
00031                                http://www.geocities.jp/bokunimowakaru/
00032 *********************************************************************/
00033 #include <mbed.h>
00034 #include "xbee.h"
00035 #include "TextLCD.h"
00036 #define FORCE_INTERVAL  100             // 1~254 データ要求間隔
00037 TextLCD lcd(PA_9, PC_7, PB_5, PB_4, PB_10, PA_8); // rs, e, d4-d7
00038 byte dev_sens[8];   // IEEE Address
00039 
00040 int main(){
00041     int i;
00042     int dev_en = 0;                     // センサー発見の有無(0:未発見)
00043     XBEE_RESULT xbee_result;            // 受信データ用の構造体
00044     int trig=0;
00045     float value;
00046 
00047     lcd.cls(); lcd.printf("Sample 4 SENS");
00048     xbee_init( 0x00 );                  // XBee用COMポートの初期化(引数はポート番号)
00049     // デバイス探索
00050     lcd.cls(); lcd.printf("Searching:SENSOR");
00051     if( xbee_atnj(10) ){                // 10秒間の参加受け入れ
00052         lcd.cls(); lcd.printf("Found a device");
00053         xbee_from( dev_sens );          // 受信したアドレスをdev_sensへ格納
00054         dev_en = 1;                     // sensor発見済
00055         xbee_gpio_config( dev_sens, 1 , AIN ); // 接続相手のポート1をAIN入力へ
00056         xbee_gpio_config( dev_sens, 2 , AIN ); // 接続相手のポート2をAIN入力へ
00057     }else{
00058         lcd.cls(); lcd.printf("Failed:no dev.");
00059     }
00060     wait(1);
00061     lcd.cls();
00062     
00063     // メイン処理
00064     while(1){                           // 永久に受信する
00065         if(dev_en){ 
00066             if(trig<=0){
00067                 lcd.locate(12,0); lcd.printf("Trig"); wait(0.1);
00068                 xbee_force(dev_sens);   // デバイスdev_sensへデータ要求
00069                 trig = FORCE_INTERVAL;
00070                 lcd.locate(12,0); lcd.printf("    ");
00071             }
00072         }else{
00073             lcd.cls(); lcd.printf("Waiting for XBee");
00074             wait(0.5);
00075             lcd.cls();
00076         }
00077         trig--;
00078 
00079         /* データ受信(待ち受けて受信する) */
00080         xbee_rx_call( &xbee_result );   // データを受信します。
00081         switch( xbee_result.MODE ){     // 受信したデータの内容(MODE値)に応じて
00082             case MODE_RESP:             // sensorからの応答の場合に照度と温度を表示
00083             case MODE_GPIN:             // 周期方式でデータ受信した場合も想定
00084                 if( bytecmp( dev_sens , &(xbee_result.FROM[0]) ,8 ) == 0 && xbee_result.STATUS == STATUS_OK ){
00085                     // 照度測定結果
00086                     value = xbee_sensor_result( &xbee_result, LIGHT);
00087                     lcd.locate(0,0); lcd.printf( "%.1f Lux   ",value);
00088                     // 温度測定結果
00089                     value = xbee_sensor_result( &xbee_result, TEMP);
00090                     lcd.locate(0,1); lcd.printf( "%.1f C   ",value);
00091                 }
00092                 break;
00093             case MODE_IDNT:             // 新しいデバイスを発見
00094                 lcd.cls(); lcd.printf("found a new dev");
00095                 for( i=0;i<8;i++ ) dev_sens[i]=xbee_result.FROM[i];
00096                                         // 発見したアドレスをdev_sensに読み込み
00097                 dev_en = 1;             // sensor発見済
00098                 trig = 0;
00099                 xbee_gpio_config( dev_sens, 1 , AIN ); // 接続相手のポート1をAIN入力へ
00100                 xbee_gpio_config( dev_sens, 2 , AIN ); // 接続相手のポート2をAIN入力へ
00101                 lcd.cls();
00102                 break;
00103             default:
00104                 break;
00105         }
00106     }
00107 }