This library demonstrates how to use the sensors on the QW Shield.

Dependents:   QW-TEMP_GPS-NMEA QW-Motiondetection QW-Closet-detection

Files at this revision

API Documentation at this revision

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;
+}
+
+
+