A first code example to get you started with the QW (GPS) Shield for SIGFOX development. It provides a serial connection to the modem over usb and transmits a SIGFOX message upon a button press.
HelloWorld QW Development kit
Preloaded code example
The QW development kits ship with this code example. This example allows you to talk straight to the TD1208 modem when using a virtual com port (note: local echo is off). This code-example also sends a SIGFOX message whenever you press a button. The message contains the button number and the measured environment temperature. The first byte is always 0x01.
More information and other example code can be found on the component page by clicking the link below: https://developer.mbed.org/components/QW-SIGFOX-Development-Kit/
Diff: main.cpp
- Revision:
- 1:897a1b3f0955
- Parent:
- 0:49858c4c3500
- Child:
- 2:a4a68a858624
diff -r 49858c4c3500 -r 897a1b3f0955 main.cpp --- a/main.cpp Fri Oct 30 14:10:26 2015 +0000 +++ b/main.cpp Mon Apr 18 10:44:39 2016 +0000 @@ -1,84 +1,171 @@ #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); -InterruptIn SW1(PB_10); -InterruptIn SW2(PA_8); -Ticker hartbeat; +/* The 2 user buttons */ +InterruptIn SW1(PA_8); +InterruptIn SW2(PB_10); + +/*Temperature sensor */ +LinearTempSensor sensor(PA_0, 40); -typedef struct{ - bool busy; - char button; -} TX_BUTTON; - -TX_BUTTON Button_tx; +/* 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); -void beat() { - LED_0 = !LED_0; -} - -//Virtual serial port over USB +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); -void sw1interrupt(){ - pc.printf("Button 1 pressed, sending sigfox message (command is AT$SF=42 55 54 54 4f 4e 20 31 00 00 00 00,2,0)\n"); - modem.printf("AT$SF=42 55 54 54 4f 4e 20 31 00 00 00 00,2,0\n"); - LED_1 = 0; - wait(0.25); - // Flush the echo of the command: - while(modem.readable()) modem.getc(); - Button_tx.busy = true; - Button_tx.button = 1; -} + +int main() +{ -void sw2interrupt(){ - pc.printf("Button 2 pressed, sending sigfox message (command is AT$SF=42 55 54 54 4f 4e 20 32 00 00 00 00,2,0)\n"); - modem.printf("AT$SF=42 55 54 54 4f 4e 20 32 00 00 00 00,2,0\n"); - LED_2 = 0; - wait(0.25); - // Flush the echo of the command: - while(modem.readable()) modem.getc(); - Button_tx.busy = true; - Button_tx.button = 2; -} + /* Setup TD120x */ + wait(3); + modem_setup(); + /* Test temperature sensor */ + float vOut = sensor.Sense(); + pc.printf("\n\rMCP9700 reading: Vout: %.2f mV", vOut); -int main() { - + /* Turn off all LED */ LED_0 = 1; LED_1 = 1; LED_2 = 1; LED_3 = 1; - hartbeat.attach(&beat, 0.5); - Button_tx.busy = false; - Button_tx.button = 0; - SW2.fall(&sw1interrupt); - SW1.fall(&sw2interrupt); - char responsebuffer[2]; - char c; - while(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()) { - c = modem.getc(); - responsebuffer[0] = responsebuffer[1]; - responsebuffer[1] = c; - if(Button_tx.busy) - { - if(responsebuffer[0] == 'O' && responsebuffer[1] == 'K' ) - { - // Everything went fine, turn off the LED - Button_tx.busy = false; - if(Button_tx.button == 1) LED_1 = 1; - if(Button_tx.button == 2) LED_2 = 1; - } - } - pc.putc(c); + 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]; + 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=42544e%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; +} \ No newline at end of file