This software example demonstrates the downlink capabilities of the SIGFOX network.

Dependencies:   QW_Sensors mbed

Fork of HelloWorld - QW Development kit by Quicksand micro-electronics

main.cpp

Committer:
quicksand
Date:
2016-05-02
Revision:
3:4da15d6e1429
Parent:
2:a4a68a858624
Child:
4:1d707586e24d

File content as of revision 3:4da15d6e1429:

#include "mbed.h"
#include "math.h"
#include "LinearTempSensor.h"

/* The 4 onboard LEDs */
DigitalOut LED_0 (PB_6);
DigitalOut LED_1 (PA_7);
DigitalOut LED_2 (PA_6);
DigitalOut LED_3 (PA_5);

/* The 2 user buttons */
InterruptIn SW1(PA_8);
InterruptIn SW2(PB_10);

/*Temperature sensor */
LinearTempSensor sensor(PA_0, 5);

/* Function prototypes */
void sw1interrupt();
void sw2interrupt();
void beat();
void sertmout();
bool modem_command_check_ok(char * command);
void modem_setup();
void txData(uint8_t btn);

bool ser_timeout = false;

Ticker heartbeat;

/* Serial port over USB */
Serial pc(USBTX, USBRX);

/* Serial connection to sigfox modem */
Serial modem(PA_9, PA_10);


int main()
{

    /* Setup TD120x */
    wait(3);
    modem_setup();
    /* Test temperature sensor */
    float vOut = sensor.Sense();
    pc.printf("\n\rMCP9700 reading:  Vout: %.2f mV", vOut);

    /* Turn off all LED */
    LED_0 = 1;
    LED_1 = 1;
    LED_2 = 1;
    LED_3 = 1;

    /* Blinking LED */
    heartbeat.attach(&beat, 0.5);

    /* Setup button interrupts */
    SW2.fall(&sw2interrupt);
    SW1.fall(&sw1interrupt);

    while(1) {
        if(pc.readable()) {
            modem.putc(pc.getc());
        }
        if(modem.readable()) {
            pc.putc(modem.getc());
        }
    }
}

void beat()
{
    LED_0 = !LED_0;
}

/* Button 1 ISR */
void sw1interrupt()
{
    pc.printf("\n\rButton 1 pressed\n\r");
    LED_1 = 0;
    txData(1);
}

/* Button 2 ISR */
void sw2interrupt()
{
    pc.printf("\n\rButton 2 pressed\n\r");
    LED_2 = 0;
    txData(2);
}


/* TX data over Sigfox */
void txData (uint8_t btn)
{

    float    tAvg;
    char     command[32];
    sensor.Sense();
    tAvg = sensor.GetAverageTemp();
    char temperature[6] ="";
    sprintf(temperature, "%3.1f", tAvg);
    for(int i = 0; i < 5; i++)
        if(temperature[i]==0) temperature[i] = ' ';
    sprintf(command, "AT$SF=0142544e%x20%x%x%x%x%x43,2,0\n", btn+48, temperature[0],temperature[1],temperature[2],temperature[3],temperature[4]);
    pc.printf("Sending pressed button %d and temperature %s C over Sigfox.\n", btn, temperature);
    pc.printf("using modem command: %s", command);
    modem_command_check_ok(command);
    LED_1 = 1;
    LED_2 = 1;
}

void modem_setup()
{
    /* Reset to factory defaults */
    if(modem_command_check_ok("AT&F")) {
        pc.printf("Factory reset succesfull\r\n");
    } else {
        pc.printf("Factory reset TD120x failed\r\n");
    }
    /* Disable local echo */
    modem.printf("ATE0\n");
    if(modem_command_check_ok("ATE0")) {
        pc.printf("Local echo disabled\r\n");
    }
    /* Write to mem */
    if(modem_command_check_ok("AT&W")) {
        pc.printf("Settings saved!\r\n");
    }
}

/* ISR for serial timeout */
void sertmout()
{
    ser_timeout = true;
}

bool modem_command_check_ok(char * command)
{
    /* first clear serial data buffers */
    while(modem.readable()) modem.getc();
    /* Timeout for response of the modem */
    Timeout tmout;
    ser_timeout = false;
    /* Buffer for incoming data */
    char responsebuffer[6];
    /* Flag to set when we get 'OK' response */
    bool ok = false;
    bool error = false;
    /* Print command to TD120x */
    modem.printf(command);
    /* Newline to activate command */
    modem.printf("\n");
    /* Wait untill serial feedback, max 3 seconds before timeout */
    tmout.attach(&sertmout, 3.0);
    while(!modem.readable()&& ser_timeout == false);
    while(!ok && !ser_timeout && !error) {
        if(modem.readable()) {
            for(int i = 0; i < 5; i++) {
                responsebuffer[i] = responsebuffer[i+1];
            }
            responsebuffer[5] = modem.getc();
            if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'O' && responsebuffer[3] == 'K' && responsebuffer[4] == '\r' && responsebuffer[5] == '\n' ) {
                ok = true;
            } else if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'E' && responsebuffer[3] == 'R' && responsebuffer[4] == 'R' && responsebuffer[5] == 'O' ) {
                error = true;
            }
        }
    }
    tmout.detach();
    return ok;
}