Quicksand micro-electronics / Mbed 2 deprecated QW-Motiondetection

Dependencies:   QW_Sensors mbed

Fork of QW-Motiondetection by Quicksand

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