This program shows how to use the VCNL4010 (proximity and ambient light sensor) on the QW dev kit for motion detection. When motion is detected, a message is shown in the console window and transmitted via Sigfox.

Dependencies:   QW_Sensors mbed

Fork of QW-Motiondetection by Quicksand

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /* This program demonstrates how to use the VCNL4010 for motion detection.
00002  * Open a serial console to the board to see extra info.
00003  */
00004 
00005 #include "mbed.h"
00006 #include "VCNL4010.h"
00007 
00008 #define SER_BUFFER_SIZE 32
00009 
00010 /* The 4 onboard LEDs */
00011 DigitalOut LED_0 (PB_6);
00012 DigitalOut LED_1 (PA_7);
00013 DigitalOut LED_2 (PA_6);
00014 DigitalOut LED_3 (PA_5);
00015 
00016 /* The 2 user buttons */
00017 InterruptIn SW1(PA_8);
00018 InterruptIn SW2(PB_10);
00019 
00020 /* Proximity and ambient light sensor*/
00021 VCNL40x0 VCNL4010(PB_9, PB_8, VCNL40x0_ADDRESS);      // SDA, SCL pin and I2C address
00022 
00023 /* Function prototypes */
00024 void sw1interrupt();
00025 void sw2interrupt();
00026 void sertmout();
00027 bool modem_command_check_ok(char * command);
00028 void modem_setup();
00029 
00030 bool ser_timeout = false;
00031 
00032 /* Serial port over USB */
00033 Serial pc(USBTX, USBRX);
00034 
00035 /* Serial connection to sigfox modem */
00036 Serial modem(PA_9, PA_10);
00037 
00038 int main()
00039 {
00040     /* Storage for VCNL4010 readout */
00041     unsigned char ID=0, Current=0;
00042     unsigned int  ProxiValue=0;    
00043 
00044     /* Setup TD120x */
00045     wait(3);
00046     modem_setup();
00047 
00048     /* Turn off all LED */
00049     LED_0 = 1;
00050     LED_1 = 1;
00051     LED_2 = 1;
00052     LED_3 = 1;
00053 
00054     /* Setup button interrupts */    
00055     SW1.fall(&sw1interrupt);
00056     SW2.fall(&sw2interrupt);
00057     
00058 
00059     /* Read VCNL40x0 product ID revision register */
00060     VCNL4010.ReadID (&ID);
00061     pc.printf("\nVCNL4010 Product ID Revision Register: %d", ID);
00062 
00063     VCNL4010.SetCurrent (20);                        // Set current to 200mA
00064     VCNL4010.ReadCurrent (&Current);                 // Read back IR LED current
00065     pc.printf("\nVCNL4010 IR LED Current: %d\n\n", Current);
00066 
00067     wait_ms(3000);                                   // Wait 3s (only for display)
00068 
00069     while(1) 
00070     {
00071         /* VCNL4010 reading */
00072         VCNL4010.ReadProxiOnDemand (&ProxiValue);    // read prox value on demand        
00073         
00074         /* If motion is detected, do a sigfox transmission */
00075         if (ProxiValue > 2500){                     // threshold can be changed to personal preference (determines the maximum distance from sensor for detection)
00076             LED_0 = 0;                              // turn on LED_0 to indicate motion detection and Sigfox transmission
00077             pc.printf("\rMotion detected!\n");
00078             char command[SER_BUFFER_SIZE];
00079             sprintf(command, "AT$SF=03%04x,2,0\n", (int) ProxiValue );
00080             pc.printf("Sending proximity value %5.0i over Sigfox using modem command: %s\n", ProxiValue , command);
00081             //pc.printf("using modem command: %s", command);
00082             modem_command_check_ok(command);
00083             LED_0 = 1;                              // turn off LED_0
00084         }
00085                 
00086         wait_ms(100);
00087     }
00088 }
00089 
00090 void modem_setup()
00091 {
00092     /* Reset to factory defaults */
00093     if(modem_command_check_ok("AT&F")) 
00094     {
00095         pc.printf("Factory reset succesfull\r\n");
00096     }
00097     else 
00098     {
00099         pc.printf("Factory reset TD120x failed\r\n");
00100     }
00101     /* Disable local echo */
00102     modem.printf("ATE0\n");
00103     if(modem_command_check_ok("ATE0")) 
00104     {
00105         pc.printf("Local echo disabled\r\n");
00106     }
00107     /* Write to mem */
00108     if(modem_command_check_ok("AT&W")) 
00109     {
00110         pc.printf("Settings saved!\r\n");
00111     }    
00112 }
00113 
00114 bool modem_command_check_ok(char * command)
00115 {
00116     /* first clear serial data buffers */
00117     while(modem.readable()) modem.getc();
00118     /* Timeout for response of the modem */
00119     Timeout tmout;
00120     ser_timeout = false;
00121     /* Buffer for incoming data */
00122     char responsebuffer[6];
00123     /* Flag to set when we get 'OK' response */
00124     bool ok = false;
00125     bool error = false;
00126     /* Print command to TD120x */
00127     modem.printf(command);
00128     /* Newline to activate command */
00129     modem.printf("\n");
00130     /* Wait untill serial feedback, min 7 seconds before timeout */
00131     tmout.attach(&sertmout, 7.0);
00132     while(!modem.readable()&& ser_timeout == false);
00133     while(!ok && !ser_timeout && !error) 
00134     {
00135         if(modem.readable()) 
00136         {
00137             for(int i = 0; i < 5; i++)
00138             {
00139                 responsebuffer[i] = responsebuffer[i+1];
00140             }
00141             responsebuffer[5] = modem.getc();
00142             if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'O' && responsebuffer[3] == 'K' && responsebuffer[4] == '\r' && responsebuffer[5] == '\n' ) 
00143             {
00144                 ok = true;
00145             }
00146             else if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'E' && responsebuffer[3] == 'R' && responsebuffer[4] == 'R' && responsebuffer[5] == 'O' ) 
00147             {
00148                 error = true;
00149             }
00150         }
00151     }
00152     tmout.detach();
00153     return ok;
00154 }
00155 
00156 /* Button 1 ISR */
00157 void sw1interrupt()
00158 {
00159     pc.printf("\n\rButton 1 pressed\n\r");
00160 }
00161 
00162 /* Button 2 ISR */
00163 void sw2interrupt()
00164 {
00165     pc.printf("\n\rButton 2 pressed\n\r");
00166 }
00167 
00168 /* ISR for serial timeout */
00169 void sertmout()
00170 {
00171     ser_timeout = true;
00172 }
00173 
00174 
00175