Sample Program for Maker Faire Tokyo 2017
Dependencies: X_NUCLEO_6180XA1 mbed
Fork of HelloWorld_6180XA1 by
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 }
Generated on Tue Jul 26 2022 14:00:01 by 1.7.2