Sample Program for Maker Faire Tokyo 2017

Dependencies:   X_NUCLEO_6180XA1 mbed

Fork of HelloWorld_6180XA1 by ST

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002    This VL6180X Expansion board test application performs a range measurement
00003    and als measurement in polling mode on the onboard embedded top sensor. 
00004    The result of both the measures are printed on the serial over.  
00005    get_distance() and get_lux() are synchronous! They block the caller until the
00006    result will be ready.
00007 */
00008 
00009 
00010 /* Includes ------------------------------------------------------------------*/
00011 
00012 #include "mbed.h"
00013 #include "XNucleo6180XA1.h"
00014 #include <string.h>
00015 #include <stdlib.h>
00016 #include <stdio.h>
00017 #include <assert.h>
00018 #include <sstream>
00019 
00020 /* Definitions ---------------------------------------------------------------*/
00021 
00022 /*user parameter -------------------------------------------------------------*/
00023 #define th 150
00024 #define mode 1
00025 #define interval 30
00026 
00027 /*board parameter ------------------------------------------------------------*/
00028 #define VL6180X_I2C_SDA   D14 
00029 #define VL6180X_I2C_SCL   D15 
00030 //#define EXPANDER_I2C_ADDRESS    (0x42*2)
00031 //#define RANAGE_MAX (765)
00032 #define RANAGE_MAX (500)
00033 #define DISTMAX (400)
00034 #define OFFSET (-5)
00035 #define DISP_TH (DISTMAX+OFFSET)
00036 #define LUX_TH (1000)
00037 /* Variables -----------------------------------------------------------------*/
00038 
00039 static XNucleo6180XA1 *board = NULL;
00040 
00041 int dist_scal(int dist);
00042 void disp_dist(int dist, XNucleo6180XA1 *board);
00043 int lux_scal(int lux);
00044 void disp_lux(int dist, XNucleo6180XA1 *board);
00045 void lg_dist(int dist, XNucleo6180XA1 *board);
00046 void lg_lux(int dist, XNucleo6180XA1 *board);
00047 
00048 InterruptIn user_button(USER_BUTTON);
00049 DigitalOut green_led(LED2);
00050 int measure_flg=0;
00051 //PortIn p
00052 /* Functions -----------------------------------------------------------------*/
00053 
00054 /*=================================== Main ==================================
00055   Prints on the serial over USB the measured distance and lux.
00056   The measures are run in single shot polling mode.
00057 =============================================================================*/
00058 void button_pressed()
00059 {
00060   green_led = 1;
00061 }
00062 
00063 void button_released()
00064 {
00065   green_led = 0;
00066   measure_flg=1;
00067 }
00068 
00069 int main()
00070 { 
00071     int status;
00072     uint32_t lux=0, dist=765;
00073     uint32_t sdist, slux;
00074     int mflg=0;
00075 
00076     DevI2C *device_i2c = new DevI2C(VL6180X_I2C_SDA, VL6180X_I2C_SCL);
00077 
00078     /* Creates the 6180XA1 expansion board singleton obj. */
00079     board = XNucleo6180XA1::instance(device_i2c, A3, A2, D13, D2);
00080     user_button.rise(&button_pressed);
00081     user_button.fall(&button_released);
00082 
00083     /* Initializes the 6180XA1 expansion board with default values. */
00084     status = board->init_board();
00085     if (status) {
00086         printf("Failed to init board!\n\r");
00087         return 0;
00088     }
00089 #if mode == 1
00090     while (true) {
00091         mflg=board->the_switch->rd_switch();
00092         if(mflg==0){
00093             board->sensor_top->get_distance(&dist);
00094             sdist=dist_scal(dist);
00095             disp_dist(sdist, board);
00096         }else{
00097             board->sensor_top->get_lux(&lux);
00098             slux=lux_scal(lux);
00099             disp_lux(slux, board);
00100         }
00101         //printf ("Distance: %d, Lux: %d\n\r", dist, lux);
00102         //printf ("Distance: %d\n\r", dist);
00103         //wait_ms(60);
00104     }
00105 #endif
00106 #if mode == 2
00107     while (true) {
00108         mflg=board->the_switch->rd_switch();
00109         if(mflg==0){
00110             if(measure_flg){
00111                 board->sensor_top->get_distance(&dist);
00112                 sdist=dist_scal(dist);
00113                 disp_dist(sdist, board);
00114                 measure_flg=0;
00115             }else{
00116                 disp_dist(sdist, board);
00117             }
00118         }else {
00119             if(measure_flg){
00120                 board->sensor_top->get_lux(&lux);
00121                 slux=lux_scal(lux);
00122                 disp_lux(slux, board);
00123                 measure_flg=0;
00124             }else{
00125                 disp_lux(lux_scal(lux), board);
00126             }
00127         }
00128     }
00129 #endif
00130 #if mode == 3
00131     while (true) {
00132         mflg=board->the_switch->rd_switch();
00133         if(mflg==0){
00134             board->sensor_top->get_distance(&dist);
00135             sdist=dist_scal(dist);
00136             if(sdist<th){
00137                 lg_dist(sdist, board);
00138             }else{
00139                 disp_dist(DISP_TH, board);
00140             }
00141         }else{
00142             board->sensor_top->get_lux(&lux);
00143             slux=lux_scal(lux);
00144             if(slux<th){
00145                 lg_lux(slux, board);
00146             }else{
00147                 disp_lux(LUX_TH, board);
00148             }           
00149         }
00150     }
00151 #endif
00152 
00153 }
00154 
00155 int dist_scal(int dist){
00156     return (dist*DISTMAX)/RANAGE_MAX + OFFSET;
00157 }
00158 
00159 void disp_dist(int dist, XNucleo6180XA1 *board){
00160     char val[4] = {'R', ' ', ' ', ' '};
00161     int i;
00162 
00163     if(dist<DISP_TH && dist>0){
00164         if(dist/100) sprintf(&val[1], "%d", dist);
00165         else if(dist/10) sprintf(&val[2], "%d", dist);
00166         else sprintf(&val[3], "%d", dist);
00167     }else if (dist < 0) val[3]='0';
00168 
00169     if(mode != 1) board->display->display_string(val, 4);
00170     else {
00171         for(i=0;i<5;i++){
00172             board->display->display_string(val, 4);
00173         }
00174     }
00175 }
00176 
00177 int lux_scal(int lux){
00178     return lux;
00179 }
00180 
00181 void disp_lux(int lux, XNucleo6180XA1 *board){
00182     char val[4] = {'A', ' ', ' ', ' '};
00183     int i;
00184     
00185     if(lux<LUX_TH){
00186         if(lux/100) sprintf(&val[1], "%d", lux);
00187         else if(lux/10) sprintf(&val[2], "%d", lux);
00188         else sprintf(&val[3], "%d", lux);
00189     }
00190 
00191     if(mode != 1) board->display->display_string(val, 4);
00192     else {
00193         for(i=0;i<40;i++){
00194             board->display->display_string(val, 4);
00195         }
00196     }
00197 }
00198 
00199 void lg_dist(int dist, XNucleo6180XA1 *board){
00200     int i,j;
00201     
00202     for(j=0;j<5;j++){
00203         for(i=0;i<interval;i++){
00204             disp_dist(dist, board);
00205         }
00206         for(i=0;i<interval;i++){
00207             wait_ms(10);
00208         }
00209     }
00210 
00211 }
00212 
00213 void lg_lux(int lux, XNucleo6180XA1 *board){
00214     int i,j;
00215     
00216     for(j=0;j<5;j++){
00217         for(i=0;i<interval;i++){
00218             disp_lux(lux, board);
00219         }
00220         for(i=0;i<interval;i++){
00221             wait_ms(10);
00222         }
00223     }
00224 
00225 }