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

QW Motion Detection

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.

Code explanation

The program starts with the initialisation/declaration of the leds, pushbuttons and sensor. Also the necessary function prototypes and serial communications are declared. After the initialisation phase, the sensor ID is read and the IR-led current is set. After that, the program enters an infinite loop. Each loop the proximity value is read. When a certain threshold is passed, a led is turned on to indicate motion detection, a message is shown in the console window and a Sigfox message is transmitted. When the Sigfox message is transmitted, the loop continuous.

Sigfox message payload

First there is the "03", this is the Quicksand ID of the example program. This is used by Quicksand to keep track of our example programs. The second value that is transmitted is the proximity value the moment when motion was detected.

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/

Committer:
quicksandjonas
Date:
Tue Dec 13 13:03:27 2016 +0000
Revision:
0:88ff4115c392
Motiondetection v1.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
quicksandjonas 0:88ff4115c392 1 /* This program demonstrates how to use the VCNL4010 for motion detection.
quicksandjonas 0:88ff4115c392 2 * Open a serial console to the board to see extra info.
quicksandjonas 0:88ff4115c392 3 */
quicksandjonas 0:88ff4115c392 4
quicksandjonas 0:88ff4115c392 5 #include "mbed.h"
quicksandjonas 0:88ff4115c392 6 #include "VCNL4010.h"
quicksandjonas 0:88ff4115c392 7
quicksandjonas 0:88ff4115c392 8 #define SER_BUFFER_SIZE 32
quicksandjonas 0:88ff4115c392 9
quicksandjonas 0:88ff4115c392 10 /* The 4 onboard LEDs */
quicksandjonas 0:88ff4115c392 11 DigitalOut LED_0 (PB_6);
quicksandjonas 0:88ff4115c392 12 DigitalOut LED_1 (PA_7);
quicksandjonas 0:88ff4115c392 13 DigitalOut LED_2 (PA_6);
quicksandjonas 0:88ff4115c392 14 DigitalOut LED_3 (PA_5);
quicksandjonas 0:88ff4115c392 15
quicksandjonas 0:88ff4115c392 16 /* The 2 user buttons */
quicksandjonas 0:88ff4115c392 17 InterruptIn SW1(PA_8);
quicksandjonas 0:88ff4115c392 18 InterruptIn SW2(PB_10);
quicksandjonas 0:88ff4115c392 19
quicksandjonas 0:88ff4115c392 20 /* Proximity and ambient light sensor*/
quicksandjonas 0:88ff4115c392 21 VCNL40x0 VCNL4010(PB_9, PB_8, VCNL40x0_ADDRESS); // SDA, SCL pin and I2C address
quicksandjonas 0:88ff4115c392 22
quicksandjonas 0:88ff4115c392 23 /* Function prototypes */
quicksandjonas 0:88ff4115c392 24 void sw1interrupt();
quicksandjonas 0:88ff4115c392 25 void sw2interrupt();
quicksandjonas 0:88ff4115c392 26 void sertmout();
quicksandjonas 0:88ff4115c392 27 bool modem_command_check_ok(char * command);
quicksandjonas 0:88ff4115c392 28 void modem_setup();
quicksandjonas 0:88ff4115c392 29
quicksandjonas 0:88ff4115c392 30 bool ser_timeout = false;
quicksandjonas 0:88ff4115c392 31
quicksandjonas 0:88ff4115c392 32 /* Serial port over USB */
quicksandjonas 0:88ff4115c392 33 Serial pc(USBTX, USBRX);
quicksandjonas 0:88ff4115c392 34
quicksandjonas 0:88ff4115c392 35 /* Serial connection to sigfox modem */
quicksandjonas 0:88ff4115c392 36 Serial modem(PA_9, PA_10);
quicksandjonas 0:88ff4115c392 37
quicksandjonas 0:88ff4115c392 38 int main()
quicksandjonas 0:88ff4115c392 39 {
quicksandjonas 0:88ff4115c392 40 /* Storage for VCNL4010 readout */
quicksandjonas 0:88ff4115c392 41 unsigned char ID=0, Current=0;
quicksandjonas 0:88ff4115c392 42 unsigned int ProxiValue=0;
quicksandjonas 0:88ff4115c392 43
quicksandjonas 0:88ff4115c392 44 /* Setup TD120x */
quicksandjonas 0:88ff4115c392 45 wait(3);
quicksandjonas 0:88ff4115c392 46 modem_setup();
quicksandjonas 0:88ff4115c392 47
quicksandjonas 0:88ff4115c392 48 /* Turn off all LED */
quicksandjonas 0:88ff4115c392 49 LED_0 = 1;
quicksandjonas 0:88ff4115c392 50 LED_1 = 1;
quicksandjonas 0:88ff4115c392 51 LED_2 = 1;
quicksandjonas 0:88ff4115c392 52 LED_3 = 1;
quicksandjonas 0:88ff4115c392 53
quicksandjonas 0:88ff4115c392 54 /* Setup button interrupts */
quicksandjonas 0:88ff4115c392 55 SW1.fall(&sw1interrupt);
quicksandjonas 0:88ff4115c392 56 SW2.fall(&sw2interrupt);
quicksandjonas 0:88ff4115c392 57
quicksandjonas 0:88ff4115c392 58
quicksandjonas 0:88ff4115c392 59 /* Read VCNL40x0 product ID revision register */
quicksandjonas 0:88ff4115c392 60 VCNL4010.ReadID (&ID);
quicksandjonas 0:88ff4115c392 61 pc.printf("\nVCNL4010 Product ID Revision Register: %d", ID);
quicksandjonas 0:88ff4115c392 62
quicksandjonas 0:88ff4115c392 63 VCNL4010.SetCurrent (20); // Set current to 200mA
quicksandjonas 0:88ff4115c392 64 VCNL4010.ReadCurrent (&Current); // Read back IR LED current
quicksandjonas 0:88ff4115c392 65 pc.printf("\nVCNL4010 IR LED Current: %d\n\n", Current);
quicksandjonas 0:88ff4115c392 66
quicksandjonas 0:88ff4115c392 67 wait_ms(3000); // Wait 3s (only for display)
quicksandjonas 0:88ff4115c392 68
quicksandjonas 0:88ff4115c392 69 while(1)
quicksandjonas 0:88ff4115c392 70 {
quicksandjonas 0:88ff4115c392 71 /* VCNL4010 reading */
quicksandjonas 0:88ff4115c392 72 VCNL4010.ReadProxiOnDemand (&ProxiValue); // read prox value on demand
quicksandjonas 0:88ff4115c392 73
quicksandjonas 0:88ff4115c392 74 /* If motion is detected, do a sigfox transmission */
quicksandjonas 0:88ff4115c392 75 if (ProxiValue > 2500){ // threshold can be changed to personal preference (determines the maximum distance from sensor for detection)
quicksandjonas 0:88ff4115c392 76 LED_0 = 0; // turn on LED_0 to indicate motion detection and Sigfox transmission
quicksandjonas 0:88ff4115c392 77 pc.printf("\rMotion detected!\n");
quicksandjonas 0:88ff4115c392 78 char command[SER_BUFFER_SIZE];
quicksandjonas 0:88ff4115c392 79 sprintf(command, "AT$SF=03%04x,2,0\n", (int) ProxiValue );
quicksandjonas 0:88ff4115c392 80 pc.printf("Sending proximity value %5.0i over Sigfox using modem command: %s\n", ProxiValue , command);
quicksandjonas 0:88ff4115c392 81 //pc.printf("using modem command: %s", command);
quicksandjonas 0:88ff4115c392 82 modem_command_check_ok(command);
quicksandjonas 0:88ff4115c392 83 LED_0 = 1; // turn off LED_0
quicksandjonas 0:88ff4115c392 84 }
quicksandjonas 0:88ff4115c392 85
quicksandjonas 0:88ff4115c392 86 wait_ms(100);
quicksandjonas 0:88ff4115c392 87 }
quicksandjonas 0:88ff4115c392 88 }
quicksandjonas 0:88ff4115c392 89
quicksandjonas 0:88ff4115c392 90 void modem_setup()
quicksandjonas 0:88ff4115c392 91 {
quicksandjonas 0:88ff4115c392 92 /* Reset to factory defaults */
quicksandjonas 0:88ff4115c392 93 if(modem_command_check_ok("AT&F"))
quicksandjonas 0:88ff4115c392 94 {
quicksandjonas 0:88ff4115c392 95 pc.printf("Factory reset succesfull\r\n");
quicksandjonas 0:88ff4115c392 96 }
quicksandjonas 0:88ff4115c392 97 else
quicksandjonas 0:88ff4115c392 98 {
quicksandjonas 0:88ff4115c392 99 pc.printf("Factory reset TD120x failed\r\n");
quicksandjonas 0:88ff4115c392 100 }
quicksandjonas 0:88ff4115c392 101 /* Disable local echo */
quicksandjonas 0:88ff4115c392 102 modem.printf("ATE0\n");
quicksandjonas 0:88ff4115c392 103 if(modem_command_check_ok("ATE0"))
quicksandjonas 0:88ff4115c392 104 {
quicksandjonas 0:88ff4115c392 105 pc.printf("Local echo disabled\r\n");
quicksandjonas 0:88ff4115c392 106 }
quicksandjonas 0:88ff4115c392 107 /* Write to mem */
quicksandjonas 0:88ff4115c392 108 if(modem_command_check_ok("AT&W"))
quicksandjonas 0:88ff4115c392 109 {
quicksandjonas 0:88ff4115c392 110 pc.printf("Settings saved!\r\n");
quicksandjonas 0:88ff4115c392 111 }
quicksandjonas 0:88ff4115c392 112 }
quicksandjonas 0:88ff4115c392 113
quicksandjonas 0:88ff4115c392 114 bool modem_command_check_ok(char * command)
quicksandjonas 0:88ff4115c392 115 {
quicksandjonas 0:88ff4115c392 116 /* first clear serial data buffers */
quicksandjonas 0:88ff4115c392 117 while(modem.readable()) modem.getc();
quicksandjonas 0:88ff4115c392 118 /* Timeout for response of the modem */
quicksandjonas 0:88ff4115c392 119 Timeout tmout;
quicksandjonas 0:88ff4115c392 120 ser_timeout = false;
quicksandjonas 0:88ff4115c392 121 /* Buffer for incoming data */
quicksandjonas 0:88ff4115c392 122 char responsebuffer[6];
quicksandjonas 0:88ff4115c392 123 /* Flag to set when we get 'OK' response */
quicksandjonas 0:88ff4115c392 124 bool ok = false;
quicksandjonas 0:88ff4115c392 125 bool error = false;
quicksandjonas 0:88ff4115c392 126 /* Print command to TD120x */
quicksandjonas 0:88ff4115c392 127 modem.printf(command);
quicksandjonas 0:88ff4115c392 128 /* Newline to activate command */
quicksandjonas 0:88ff4115c392 129 modem.printf("\n");
quicksandjonas 0:88ff4115c392 130 /* Wait untill serial feedback, min 7 seconds before timeout */
quicksandjonas 0:88ff4115c392 131 tmout.attach(&sertmout, 7.0);
quicksandjonas 0:88ff4115c392 132 while(!modem.readable()&& ser_timeout == false);
quicksandjonas 0:88ff4115c392 133 while(!ok && !ser_timeout && !error)
quicksandjonas 0:88ff4115c392 134 {
quicksandjonas 0:88ff4115c392 135 if(modem.readable())
quicksandjonas 0:88ff4115c392 136 {
quicksandjonas 0:88ff4115c392 137 for(int i = 0; i < 5; i++)
quicksandjonas 0:88ff4115c392 138 {
quicksandjonas 0:88ff4115c392 139 responsebuffer[i] = responsebuffer[i+1];
quicksandjonas 0:88ff4115c392 140 }
quicksandjonas 0:88ff4115c392 141 responsebuffer[5] = modem.getc();
quicksandjonas 0:88ff4115c392 142 if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'O' && responsebuffer[3] == 'K' && responsebuffer[4] == '\r' && responsebuffer[5] == '\n' )
quicksandjonas 0:88ff4115c392 143 {
quicksandjonas 0:88ff4115c392 144 ok = true;
quicksandjonas 0:88ff4115c392 145 }
quicksandjonas 0:88ff4115c392 146 else if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'E' && responsebuffer[3] == 'R' && responsebuffer[4] == 'R' && responsebuffer[5] == 'O' )
quicksandjonas 0:88ff4115c392 147 {
quicksandjonas 0:88ff4115c392 148 error = true;
quicksandjonas 0:88ff4115c392 149 }
quicksandjonas 0:88ff4115c392 150 }
quicksandjonas 0:88ff4115c392 151 }
quicksandjonas 0:88ff4115c392 152 tmout.detach();
quicksandjonas 0:88ff4115c392 153 return ok;
quicksandjonas 0:88ff4115c392 154 }
quicksandjonas 0:88ff4115c392 155
quicksandjonas 0:88ff4115c392 156 /* Button 1 ISR */
quicksandjonas 0:88ff4115c392 157 void sw1interrupt()
quicksandjonas 0:88ff4115c392 158 {
quicksandjonas 0:88ff4115c392 159 pc.printf("\n\rButton 1 pressed\n\r");
quicksandjonas 0:88ff4115c392 160 }
quicksandjonas 0:88ff4115c392 161
quicksandjonas 0:88ff4115c392 162 /* Button 2 ISR */
quicksandjonas 0:88ff4115c392 163 void sw2interrupt()
quicksandjonas 0:88ff4115c392 164 {
quicksandjonas 0:88ff4115c392 165 pc.printf("\n\rButton 2 pressed\n\r");
quicksandjonas 0:88ff4115c392 166 }
quicksandjonas 0:88ff4115c392 167
quicksandjonas 0:88ff4115c392 168 /* ISR for serial timeout */
quicksandjonas 0:88ff4115c392 169 void sertmout()
quicksandjonas 0:88ff4115c392 170 {
quicksandjonas 0:88ff4115c392 171 ser_timeout = true;
quicksandjonas 0:88ff4115c392 172 }
quicksandjonas 0:88ff4115c392 173
quicksandjonas 0:88ff4115c392 174
quicksandjonas 0:88ff4115c392 175