![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Code for the IOT wirless sensors demo. Including the NFC communications for setting up the sensor.
Dependencies: AppNearMe_MuNFC_PN532 RHT03 mbed xbee_lib
Diff: main.cpp
- Revision:
- 0:c3b76a463a8b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Aug 30 12:43:33 2012 +0000 @@ -0,0 +1,263 @@ +/* Copyright (c) 2012 Tristan Hughes, MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software + * and associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/*------INCLUDES-----*/ +#include "mbed.h" +#include "RHT03.h" +#include "MuNFC.h" +#include "xbee.h" + +/*------Definitions----*/ +#define SLEEP_TIME 30 //Time to wait between reading and sending data +#define SENSOR_PACKET 2 //Tells the NFC app device is a sensor +#define LOCATION_PRECISION 100000 //The accuracy of the devices location + +/*------Pins------*/ +DigitalOut red(p30); +DigitalOut green(p29); +DigitalOut pswitch(p21); +AnalogIn light(p15); +DigitalIn pir(p16); +DigitalIn setup(p14); +DigitalOut led_alive(LED1); +DigitalOut led_progress(LED2); +DigitalOut led_ok(LED3); +DigitalOut led_failed(LED4); +Serial pc1(USBTX, USBRX); + +/*-----Globals-----*/ +char send_data[202]; +int cur_temp,cur_hum,device_serial[8]; +float cur_light; +int cur_pir; +int nfc_setup = 0; +Ticker val_check; + +/*-----Class Init-----*/ +MuNFC nfc("000000053Tfi0RwY", 1, p11, p12, p13, p19, p18); +xbee xbee_1(p9,p10,p25); + + +/*-----A class of useful functions for use with NFC----*/ +class sr_configuration +{ +public: + sr_configuration( const uint8_t* ieee_address ) { + memcpy( this->ieee_address, ieee_address, 8 ); + } + + void hexPrint(const char* name, uint8_t* buf, int len) { + printf("%s: ", name); + for(int i = 0; i < len; i++) { + printf("%02x ", buf[i]); + } + printf("\r\n"); + } + + void prettyPrint() { + printf("Name: %s\r\n", name); + hexPrint("IEEE Address", ieee_address, 8); + hexPrint("Gateway IEEE Address", gw_ieee_address, 8); + hexPrint("Gateway Security Key", gw_security_key, 16); + printf("Location: Lat.: %d.%05d; Long.: %d.%05d\r\n", + location[0]/LOCATION_PRECISION, (location[0] - (location[0]/LOCATION_PRECISION)*LOCATION_PRECISION ), + location[1]/LOCATION_PRECISION, (location[1] - (location[1]/LOCATION_PRECISION)*LOCATION_PRECISION ) ); + } + + char name[24]; + uint8_t ieee_address[8]; + uint8_t gw_ieee_address[8]; + uint8_t gw_security_key[16]; + uint32_t location[2]; //lat*100000, long*100000 +}; + +const uint8_t address[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //setting the IEEE address to 0 +sr_configuration config(address); + +//Encode call back for NFC +void encode_cb(TLVList* tlv, void *) +{ + tlv->putUInt8( SENSOR_PACKET ); //First uint8_t is packet type + tlv->putString(config.name); + tlv->putArray(config.ieee_address, 8); + tlv->putArray(config.gw_ieee_address, 8); + tlv->putArray(config.gw_security_key, 16); + tlv->putUInt32(config.location[0]); + tlv->putUInt32(config.location[1]); +} + +//Decode callback for NFC +void decode_cb(TLVList* tlv, void *) +{ + TLVList::TLVType t; + + if(tlv->getNext() != UINT8) { + return; + } + if(tlv->getUInt8() == SENSOR_PACKET) { //First uint8_t is packet type + if(tlv->getNext() != STRING) { + return; + } + tlv->getString(config.name, 23); + + if(tlv->getNext() != UINT8_ARRAY) { + return; + } + //tlv->getArray(config.ieee_address, 8); //IEEE address is ignored + + if(tlv->getNext() != UINT8_ARRAY) { + return; + } + tlv->getArray(config.gw_ieee_address, 8); + + if(tlv->getNext() != UINT8_ARRAY) { + return; + } + tlv->getArray(config.gw_security_key, 16); + + t = tlv->getNext(); + if( (t != UINT32) && (t != UINT8) ) { + return; + } + config.location[0] = tlv->getUInt32(); + + t = tlv->getNext(); + if( (t != UINT32) && (t != UINT8) ) { + return; + } + config.location[1] = tlv->getUInt32(); + } + nfc_setup = 1; +} + +//NFC event call back (sets LED's on mbed) +void event_cb(NFCEvent event, void*) +{ + switch(event) { + case NFC_TRANSACTION_STARTED: + led_progress=1; + led_ok=0; + led_failed=0; + break; + case NFC_TRANSACTION_SUCCESSFUL: + led_progress=0; + led_ok=1; + led_failed=0; + break; + case NFC_TRANSACTION_FAILED: + led_progress=0; + led_ok=0; + led_failed=1; + break; + } +} + +//Reads values from Sensors +void read_values(void) +{ + int attempts=0; + red = 1; + pswitch = 0; //Power up the sensor network + RHT03 humtemp(p22); //Intalise the RHT03 Class + wait(1); //Wait to let the powersupply stablise + cur_light = light*100; //Read the value of the light sensor *100 to make into percentage + while(attempts <= 10 ) { + wait(2); + if(humtemp.readData() == RHT_ERROR_NONE) attempts = 20; //Read the RHT03 will have 20 attempts to read correclty + attempts++; + } + if(humtemp.getHumidity()>0) { //Used to detect if a valid reading has occured + cur_temp = (int)humtemp.getTemperatureC(); //Read current temp + cur_hum = (int)humtemp.getHumidity(); //Read current humidity + } + + cur_pir = pir; //Read the current PIR value + green=1; + wait_ms(1); + sprintf(send_data,"%x,%2d,%2d,%03.0f,%i; \0",device_serial,cur_temp,cur_hum,cur_light,cur_pir); //Formated data string + xbee_1.SendData(send_data); //Send the data to the Xbee + wait(5); //Give the Xbee time to send the data + green = 0; + red = 0; + pswitch = 1; //Power the sensors/Xbee down +} + + +//Request NFC setup data (called if setup pin=0) +void get_setup(void) +{ + pswitch = 0; //Power sensors and NFC up + wait(2); //Let powersupply stabalise + memcpy(config.ieee_address,device_serial,8); //Coppy device serial into ieee_address for encode_cb + + nfc.encode(encode_cb, NULL); //Register the encode callback function + nfc.decode(decode_cb, NULL); //Register the decode callback function + nfc.event(event_cb, NULL); //Register the event callback function + + bool ret = nfc.init(); //Initalise the NFC + if(ret) { + //printf("\nAppNearMe/MuNFC stack initialized\n"); + + } else { + //printf("Could not initialize stack\n"); + while(1) { + green = !green; + red = !red; + wait_ms(500); //Flash both LED's if NFC isn't initalised + } + } + + red = 1; + + while(nfc_setup==0) { //While the decode callback hasn't been called poll the NFC + nfc.poll(100); + } + red = 0; + green = 1; + led_ok = 0; + xbee_1.ConfigMode(); //Enable config mode on Xbee + xbee_1.SetKey((int*)config.gw_security_key); //Set the security key of the Xbee + xbee_1.WriteSettings(); //Save the settings to the Xbee + xbee_1.ExitConfigMode(); //Exit config + + pswitch = 1; //power down the sensors/NFC + wait(1); + green = 0; +} + +int main() +{ + setup.mode(PullUp); + xbee_1.ConfigMode(); //Enable config mode on Xbee + xbee_1.GetSerial(device_serial); //Read the Xbee's serial number + xbee_1.ExitConfigMode(); //Exit config mode + if(setup == 0) get_setup(); //Call setup if setup=0 + pswitch=1; //make sure sensors are powered down + red=1; + wait(1); + green=1; + red=0; + wait(1); + green=0; + read_values(); //Read sensor values + val_check.attach(&read_values,SLEEP_TIME); //Read sesnor data every SLEEP_TIME seconds + while(1) { + + } + return 1; +}