This library demonstrates how to use the sensors on the QW Shield.
Dependents: QW-TEMP_GPS-NMEA QW-Motiondetection QW-Closet-detection
Revision 3:1b27ad5eb94a, committed 2016-05-18
- Comitter:
- quicksand
- Date:
- Wed May 18 14:44:57 2016 +0000
- Parent:
- 2:98a0b0ea3457
- Commit message:
- Renamed main.cpp to main.txt (example usage code) to avoid conflicts and confusion.
Changed in this revision
main.cpp | Show diff for this revision Revisions of this file |
main.txt | Show annotated file Show diff for this revision Revisions of this file |
diff -r 98a0b0ea3457 -r 1b27ad5eb94a main.cpp --- a/main.cpp Wed Dec 02 11:49:27 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +0,0 @@ -/* This program demonstrates how one can use all the sensors on the QW shield. - * Open a serial console to the board to get a readout of all the onboard sensors. - */ - -#include "mbed.h" -#include "math.h" -#include "LinearTempSensor.h" -#include "VCNL4010.h" - -#define SER_BUFFER_SIZE 32 - -/* 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); - -/* Proximity and ambient light sensor*/ -VCNL40x0 VCNL4010(PB_9, PB_8, VCNL40x0_ADDRESS); // SDA, SCL pin and I2C address - -/*Temperature sensor */ -LinearTempSensor sensor(PA_0); - -/* Function prototypes */ -void sw1interrupt(); -void sw2interrupt(); -void sertmout(); -bool read_acc(int& x, int& y, int& z); -bool modem_command_check_ok(char * command); -void modem_setup(); - -bool ser_timeout = false; - -/* Serial port over USB */ -Serial pc(USBTX, USBRX); - -/* Serial connection to sigfox modem */ -Serial modem(PA_9, PA_10); - -int main() -{ - /* Storage for VCNL4010 readout */ - unsigned char ID=0, Current=0; - unsigned int ProxiValue=0, AmbiValue=0; - - /* Variables that will store analog temperature sensor reading */ - float Vout, Tav, To; - - /* Setup TD120x */ - wait(3); - modem_setup(); - - /* Turn off all LED */ - LED_0 = 1; - LED_1 = 1; - LED_2 = 1; - LED_3 = 1; - - /* Setup button interrupts */ - SW2.fall(&sw2interrupt); - SW1.fall(&sw1interrupt); - - /* Read VCNL40x0 product ID revision register */ - VCNL4010.ReadID (&ID); - pc.printf("\nVCNL4010 Product ID Revision Register: %d", ID); - - VCNL4010.SetCurrent (20); // Set current to 200mA - VCNL4010.ReadCurrent (&Current); // Read back IR LED current - pc.printf("\nVCNL4010 IR LED Current: %d\n\n", Current); - - wait_ms(3000); // wait 3s (only for display) - - while(1) - { - /* VCNL4010 reading */ - VCNL4010.ReadProxiOnDemand (&ProxiValue); // read prox value on demand - VCNL4010.ReadAmbiOnDemand (&AmbiValue); // read ambi value on demand - /* MCP9700 reading */ - Vout = sensor.Sense(); - Tav = sensor.GetAverageTemp(); - To = sensor.GetLatestTemp(); - - - /* Fetch accelerometer reading from TD1204 */ - int x = 0; - int y = 0; - int z = 0; - - if(read_acc(x, y, z)) - { - pc.printf("\n\rAccelerometer reading: %i X, %i Y, %i Z", x,y,z); - } - else - { - pc.printf("\n\rFailed to read accelerometer"); - } - - pc.printf("\n\rVCNL4010 reading: Proximity: %5.0i cts, Ambient light: %5.0i cts, Illuminance: %7.2f lx\n\rMCP9700 reading: Vout: %.2f mV, Average Temp: %.2f %cC, Latest Temp: %.2f %cC\n\r", ProxiValue, AmbiValue, AmbiValue/4.0, Vout, Tav, 176, To, 176); - wait_ms(1000); - } -} - -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"); - } - /* Start accelerometer reading - Data monitoring - Normal power, high resolution, 25 Hz rate, +/-2G full scale, no high pass filter. Ouptput data format is X Y Z */ - if(modem_command_check_ok("ATS650=1,0,3,2,0")) - { - pc.printf("accelerometer monitoring started successfully\r\n"); - } - else - { - pc.printf("accelerometer monitoring start failed\r\n"); - } -} - -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; -} - -bool read_acc(int& x, int& y, int& z) -{ - /* first clear serial data buffers */ - while(modem.readable()) modem.getc(); - /* Timeout for response of the modem */ - Timeout tmout; - ser_timeout = false; - /* counter to fill buffer */ - int i = 0; - /* Buffer for incoming data */ - char responsebuffer[SER_BUFFER_SIZE]; - /* Flag to set when we get to the end of the data '/r' response */ - bool end = false; - /* Wait untill serial feedback, max 3 seconds before timeout */ - tmout.attach(&sertmout, 3.0); - do{ - while(!modem.readable()&& ser_timeout == false); - /* Wait untill '\n' from last data*/ - }while((modem.getc() != '\n') && ser_timeout == false); - while(end == false && ser_timeout == false && i < SER_BUFFER_SIZE) - { - if(modem.readable()) { - responsebuffer[i] = modem.getc(); - if(responsebuffer[i] == '\n') { - end = true; - responsebuffer[i] = 0; - } - i++; - } - - } - tmout.detach(); - /* What is left now is getting the X,Y,Z coordinates out of the string */ - if(end) - { - char * token; - token = strtok(responsebuffer, " "); - x = atoi(token); - token = strtok(NULL, " "); - token = strtok(NULL, " "); - y = atoi(token); - token = strtok(NULL, " "); - token = strtok(NULL, " "); - z = atoi(token); - return true; - } - else - { - return false; - } -} - -/* Button 1 ISR */ -void sw1interrupt() -{ - pc.printf("\n\rButton 1 pressed\n\r"); -} - -/* Button 2 ISR */ -void sw2interrupt() -{ - pc.printf("\n\rButton 2 pressed\n\r"); -} - -/* ISR for serial timeout */ -void sertmout() -{ - ser_timeout = true; -} - - -
diff -r 98a0b0ea3457 -r 1b27ad5eb94a main.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.txt Wed May 18 14:44:57 2016 +0000 @@ -0,0 +1,253 @@ +/* This program demonstrates how one can use all the sensors on the QW shield. + * Open a serial console to the board to get a readout of all the onboard sensors. + */ + +#include "mbed.h" +#include "math.h" +#include "LinearTempSensor.h" +#include "VCNL4010.h" + +#define SER_BUFFER_SIZE 32 + +/* 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); + +/* Proximity and ambient light sensor*/ +VCNL40x0 VCNL4010(PB_9, PB_8, VCNL40x0_ADDRESS); // SDA, SCL pin and I2C address + +/*Temperature sensor */ +LinearTempSensor sensor(PA_0); + +/* Function prototypes */ +void sw1interrupt(); +void sw2interrupt(); +void sertmout(); +bool read_acc(int& x, int& y, int& z); +bool modem_command_check_ok(char * command); +void modem_setup(); + +bool ser_timeout = false; + +/* Serial port over USB */ +Serial pc(USBTX, USBRX); + +/* Serial connection to sigfox modem */ +Serial modem(PA_9, PA_10); + +int main() +{ + /* Storage for VCNL4010 readout */ + unsigned char ID=0, Current=0; + unsigned int ProxiValue=0, AmbiValue=0; + + /* Variables that will store analog temperature sensor reading */ + float Vout, Tav, To; + + /* Setup TD120x */ + wait(3); + modem_setup(); + + /* Turn off all LED */ + LED_0 = 1; + LED_1 = 1; + LED_2 = 1; + LED_3 = 1; + + /* Setup button interrupts */ + SW2.fall(&sw2interrupt); + SW1.fall(&sw1interrupt); + + /* Read VCNL40x0 product ID revision register */ + VCNL4010.ReadID (&ID); + pc.printf("\nVCNL4010 Product ID Revision Register: %d", ID); + + VCNL4010.SetCurrent (20); // Set current to 200mA + VCNL4010.ReadCurrent (&Current); // Read back IR LED current + pc.printf("\nVCNL4010 IR LED Current: %d\n\n", Current); + + wait_ms(3000); // wait 3s (only for display) + + while(1) + { + /* VCNL4010 reading */ + VCNL4010.ReadProxiOnDemand (&ProxiValue); // read prox value on demand + VCNL4010.ReadAmbiOnDemand (&AmbiValue); // read ambi value on demand + /* MCP9700 reading */ + Vout = sensor.Sense(); + Tav = sensor.GetAverageTemp(); + To = sensor.GetLatestTemp(); + + + /* Fetch accelerometer reading from TD1204 */ + int x = 0; + int y = 0; + int z = 0; + + if(read_acc(x, y, z)) + { + pc.printf("\n\rAccelerometer reading: %i X, %i Y, %i Z", x,y,z); + } + else + { + pc.printf("\n\rFailed to read accelerometer"); + } + + pc.printf("\n\rVCNL4010 reading: Proximity: %5.0i cts, Ambient light: %5.0i cts, Illuminance: %7.2f lx\n\rMCP9700 reading: Vout: %.2f mV, Average Temp: %.2f %cC, Latest Temp: %.2f %cC\n\r", ProxiValue, AmbiValue, AmbiValue/4.0, Vout, Tav, 176, To, 176); + wait_ms(1000); + } +} + +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"); + } + /* Start accelerometer reading - Data monitoring - Normal power, high resolution, 25 Hz rate, +/-2G full scale, no high pass filter. Ouptput data format is X Y Z */ + if(modem_command_check_ok("ATS650=1,0,3,2,0")) + { + pc.printf("accelerometer monitoring started successfully\r\n"); + } + else + { + pc.printf("accelerometer monitoring start failed\r\n"); + } +} + +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; +} + +bool read_acc(int& x, int& y, int& z) +{ + /* first clear serial data buffers */ + while(modem.readable()) modem.getc(); + /* Timeout for response of the modem */ + Timeout tmout; + ser_timeout = false; + /* counter to fill buffer */ + int i = 0; + /* Buffer for incoming data */ + char responsebuffer[SER_BUFFER_SIZE]; + /* Flag to set when we get to the end of the data '/r' response */ + bool end = false; + /* Wait untill serial feedback, max 3 seconds before timeout */ + tmout.attach(&sertmout, 3.0); + do{ + while(!modem.readable()&& ser_timeout == false); + /* Wait untill '\n' from last data*/ + }while((modem.getc() != '\n') && ser_timeout == false); + while(end == false && ser_timeout == false && i < SER_BUFFER_SIZE) + { + if(modem.readable()) { + responsebuffer[i] = modem.getc(); + if(responsebuffer[i] == '\n') { + end = true; + responsebuffer[i] = 0; + } + i++; + } + + } + tmout.detach(); + /* What is left now is getting the X,Y,Z coordinates out of the string */ + if(end) + { + char * token; + token = strtok(responsebuffer, " "); + x = atoi(token); + token = strtok(NULL, " "); + token = strtok(NULL, " "); + y = atoi(token); + token = strtok(NULL, " "); + token = strtok(NULL, " "); + z = atoi(token); + return true; + } + else + { + return false; + } +} + +/* Button 1 ISR */ +void sw1interrupt() +{ + pc.printf("\n\rButton 1 pressed\n\r"); +} + +/* Button 2 ISR */ +void sw2interrupt() +{ + pc.printf("\n\rButton 2 pressed\n\r"); +} + +/* ISR for serial timeout */ +void sertmout() +{ + ser_timeout = true; +} + + +