Demo app to read data from temperature sensor connected to STM-F411RE and send values to AT&T M2X Data Service via MTS shield.

Dependencies:   M2XStreamClient SocketModem jsonlite mbed

Fork of STM32_MTS_Wifi_Connect_M2X by AT&T Developer Summit Hackathon 2016

main.cpp

Committer:
jb8414
Date:
2014-09-05
Revision:
17:e54be812a3b3
Parent:
16:921fec88838d

File content as of revision 17:e54be812a3b3:

#include "mbed.h"
#include "M2XStreamClient.h"
#include "include_me.h"
#include "math.h"

// set to 1 for cellular shield board
// set to 0 for wifi shield board
#define CELL_SHIELD 1

using namespace mts;

/* This example shows how to do a basic connectivity test to AT&T M2X Cloud 
 * using the MTS Wifi shield board. You will need to change the network
 * SSID and security key. You may need to chage the security type.
 */

using namespace mts;

const char key[] = "<key>";    // Replace with your M2X API key
const char feed[] = "<feed>";   // Replace with your blueprint Feed ID
const char stream[] = "<stream>"; // Replace with your stream name  
char name[] = "<location>"; // Name of current location of datasource

double latitude = 30.3748076;
double longitude = -97.7386896; // You can also read those values from a GPS
double elevation = 400.00;

DigitalOut myled(D7);   
AnalogIn tempSensor(A0);    

// Note: This callback function needs to be debugged further as it does not print 
// the actual fetched reports, instead both "at" and "value" pointers print the 
// timestamps of each report.    
void on_data_point_found(const char* at, const char* value, int index, void* context) {
  printf("Found a data point, index: %d\r\n", index);
  printf("At: %s Value: %s \r\n", at, value);   
}

void on_location_found(const char* name,
                       double latitude,
                       double longitude,
                       double elevation,
                       const char* timestamp,
                       int index,
                       void* context) {
  printf("Found a location, index: %d\r\n", index);
  printf("Name: %s  Latitude: %lf  Longitude: %lf\r\n", name, latitude, longitude);
  printf("Elevation: %lf  Timestamp: %s\r\n", elevation, timestamp);
}


int main()
{
    char amb_temp[6];
    int response;
    int a;
    int adc_scale = 4095; 
    int B = 3975;
    float resistance; 
    float temperature;
    float temperature_f;    
          
    //Set the network parameters
    std::string ssid =  "<ssid>"; 
    std::string securityKey = "<password>"; 
    Wifi::SecurityType securityType = Wifi::WPA2;

 printf("starting\n\r");
 
#if CELL_SHIELD
    MTSSerialFlowControl* serial = new MTSSerialFlowControl(PA_9, PA_10, PA_1, PA_0);
    serial->baud(115200);
    printf("serialflow ok\n\r");
    Transport::setTransport(Transport::CELLULAR);
    Cellular* cell = Cellular::getInstance();
    cell->init(serial, PB_5, PA_8); //DCD and DTR pins for STM411

    int max_tries = 5;
    int i;
    std::string apn = "wap.cingular";  // set to the appropriate APN (i.e. "m2m.com.attz" for M2X SIMs, wap.cingular)

    i = 0;
    while (i++ < max_tries) {
        if (cell->getRegistration() == Cellular::REGISTERED) {
            printf("registered with tower\n\r");
            break;
        } else if (i >= max_tries) {
            printf("failed to register with tower\n\r");
        } else {
            wait(3);
        }
    }

    printf("signal strength: %d\n\r", cell->getSignalStrength());

    i = 0;
    printf("setting APN to %s\n\r", apn.c_str());
    while (i++ < max_tries) {
        if (cell->setApn(apn) == SUCCESS) {
            printf("successfully set APN\n\r");
            break;
        } else if (i >= max_tries) {
            printf("failed to set APN\n\r");
        } else {
            wait(1);
        }
    }

    i = 0;
    printf("bringing up PPP link\n\r");
    while (i++ < max_tries) {
        if (cell->connect()) {
            printf("PPP link is up\n\r");
            break;
        } else if (i >= max_tries) {
            printf("failed to bring PPP link up\n\r");
        } else {
            wait(1);
        }
    }
#else
    // WiFi shield
    
    //Wait for wifi module to boot up
    for (int i = 10; i >= 0; i = i - 2) {
        wait(2);
        printf("Waiting %d seconds...\n\r", i);
    }

    //Setup serial interface to WiFi module
    MTSSerial* serial = new MTSSerial(PA_9, PA_10, 256, 4096);   
    serial->baud(9600);

    Transport::setTransport(Transport::WIFI);
    
    //Setup Wifi class
    Wifi* wifi = Wifi::getInstance();
    printf("Init: %s\n\r", wifi->init(serial) ? "SUCCESS" : "FAILURE");

    //Setup and check connection
    printf("Set Network: %s\n\r", getCodeNames(wifi->setNetwork(ssid, securityType, securityKey)).c_str());
    printf("Set DHCP: %s\n\r", getCodeNames(wifi->setDeviceIP("DHCP")).c_str());
    while (! wifi->connect()) {
        printf("Connect: Failure\r\n");
        wait(1);
    }
    printf("Connect: Success\r\n");
    printf("Is Connected: %s\n\r", wifi->isConnected() ? "True" : "False");


    
    printf("Ping Server: %s\n\r", wifi->ping("8.8.8.8") ? "Success" : "Failed");
    wait(1);
#endif

    // Initialize the M2X client
    Client client;    
    M2XStreamClient m2xClient(&client, key);

    // update location
    response = m2xClient.updateLocation(feed, name, latitude, longitude, elevation);
    printf("updateLocation response code: %d\r\n", response);
    if (response == -1) while (true) ;
    
    //for (int i = 0; i < 5; i++)
    while(1)    
    {    
        myled = 1; // LED is ON    
        a = tempSensor.read_u16();
               
        resistance = (float)(adc_scale-a)*10000/a; //get the resistance of the sensor;              
        temperature = 1/(log(resistance/10000)/B+1/298.15)-273.15;  //convert to temperature via datasheet        
        temperature_f = (1.8 * temperature) + 32.0;
        sprintf(amb_temp, "%0.2f", temperature_f);  
        
        printf("Temp Sensor Analog Reading is 0x%X = %d   ", a, a);         
        printf("Current Temperature: %f C  %f F \n\r", temperature, temperature_f); 
                
        response = m2xClient.post(feed, stream, amb_temp);
        printf("Post response code: %d\r\n", response);
        if (response == -1) while (true) ;           
                
        myled = 0; // LED is OFF        

        delay(5000);        
    }           
    
    
    // fetch location
    response = m2xClient.readLocation(feed, on_location_found, NULL);
    printf("readLocation response code: %d\r\n", response);
    if (response == -1) while (true) ;  
        
    // fetch temperature
    response = m2xClient.fetchValues(feed, stream, on_data_point_found, NULL);
    printf("Fetch response code: %d\r\n", response);
    if (response == -1) while (true) ;
        
}