Sample Program for Maker Faire Tokyo 2017
Dependencies: X_NUCLEO_6180XA1 mbed
Fork of HelloWorld_6180XA1 by
Diff: main.cpp
- Revision:
- 48:5f6dbaa777ea
- Parent:
- 47:04733a0905ba
--- a/main.cpp Mon Mar 13 19:21:16 2017 +0000 +++ b/main.cpp Thu Jul 27 04:44:31 2017 +0000 @@ -15,33 +15,70 @@ #include <stdlib.h> #include <stdio.h> #include <assert.h> - +#include <sstream> /* Definitions ---------------------------------------------------------------*/ +/*user parameter -------------------------------------------------------------*/ +#define th 150 +#define mode 1 +#define interval 30 + +/*board parameter ------------------------------------------------------------*/ #define VL6180X_I2C_SDA D14 #define VL6180X_I2C_SCL D15 - - +//#define EXPANDER_I2C_ADDRESS (0x42*2) +//#define RANAGE_MAX (765) +#define RANAGE_MAX (500) +#define DISTMAX (400) +#define OFFSET (-5) +#define DISP_TH (DISTMAX+OFFSET) +#define LUX_TH (1000) /* Variables -----------------------------------------------------------------*/ static XNucleo6180XA1 *board = NULL; +int dist_scal(int dist); +void disp_dist(int dist, XNucleo6180XA1 *board); +int lux_scal(int lux); +void disp_lux(int dist, XNucleo6180XA1 *board); +void lg_dist(int dist, XNucleo6180XA1 *board); +void lg_lux(int dist, XNucleo6180XA1 *board); +InterruptIn user_button(USER_BUTTON); +DigitalOut green_led(LED2); +int measure_flg=0; +//PortIn p /* Functions -----------------------------------------------------------------*/ /*=================================== Main ================================== Prints on the serial over USB the measured distance and lux. The measures are run in single shot polling mode. =============================================================================*/ +void button_pressed() +{ + green_led = 1; +} + +void button_released() +{ + green_led = 0; + measure_flg=1; +} + int main() { int status; - uint32_t lux, dist; + uint32_t lux=0, dist=765; + uint32_t sdist, slux; + int mflg=0; + DevI2C *device_i2c = new DevI2C(VL6180X_I2C_SDA, VL6180X_I2C_SCL); /* Creates the 6180XA1 expansion board singleton obj. */ board = XNucleo6180XA1::instance(device_i2c, A3, A2, D13, D2); + user_button.rise(&button_pressed); + user_button.fall(&button_released); /* Initializes the 6180XA1 expansion board with default values. */ status = board->init_board(); @@ -49,10 +86,140 @@ printf("Failed to init board!\n\r"); return 0; } - +#if mode == 1 + while (true) { + mflg=board->the_switch->rd_switch(); + if(mflg==0){ + board->sensor_top->get_distance(&dist); + sdist=dist_scal(dist); + disp_dist(sdist, board); + }else{ + board->sensor_top->get_lux(&lux); + slux=lux_scal(lux); + disp_lux(slux, board); + } + //printf ("Distance: %d, Lux: %d\n\r", dist, lux); + //printf ("Distance: %d\n\r", dist); + //wait_ms(60); + } +#endif +#if mode == 2 + while (true) { + mflg=board->the_switch->rd_switch(); + if(mflg==0){ + if(measure_flg){ + board->sensor_top->get_distance(&dist); + sdist=dist_scal(dist); + disp_dist(sdist, board); + measure_flg=0; + }else{ + disp_dist(sdist, board); + } + }else { + if(measure_flg){ + board->sensor_top->get_lux(&lux); + slux=lux_scal(lux); + disp_lux(slux, board); + measure_flg=0; + }else{ + disp_lux(lux_scal(lux), board); + } + } + } +#endif +#if mode == 3 while (true) { - board->sensor_top->get_distance(&dist); - board->sensor_top->get_lux(&lux); - printf ("Distance: %d, Lux: %d\n\r", dist, lux); + mflg=board->the_switch->rd_switch(); + if(mflg==0){ + board->sensor_top->get_distance(&dist); + sdist=dist_scal(dist); + if(sdist<th){ + lg_dist(sdist, board); + }else{ + disp_dist(DISP_TH, board); + } + }else{ + board->sensor_top->get_lux(&lux); + slux=lux_scal(lux); + if(slux<th){ + lg_lux(slux, board); + }else{ + disp_lux(LUX_TH, board); + } + } } +#endif + } + +int dist_scal(int dist){ + return (dist*DISTMAX)/RANAGE_MAX + OFFSET; +} + +void disp_dist(int dist, XNucleo6180XA1 *board){ + char val[4] = {'R', ' ', ' ', ' '}; + int i; + + if(dist<DISP_TH && dist>0){ + if(dist/100) sprintf(&val[1], "%d", dist); + else if(dist/10) sprintf(&val[2], "%d", dist); + else sprintf(&val[3], "%d", dist); + }else if (dist < 0) val[3]='0'; + + if(mode != 1) board->display->display_string(val, 4); + else { + for(i=0;i<5;i++){ + board->display->display_string(val, 4); + } + } +} + +int lux_scal(int lux){ + return lux; +} + +void disp_lux(int lux, XNucleo6180XA1 *board){ + char val[4] = {'A', ' ', ' ', ' '}; + int i; + + if(lux<LUX_TH){ + if(lux/100) sprintf(&val[1], "%d", lux); + else if(lux/10) sprintf(&val[2], "%d", lux); + else sprintf(&val[3], "%d", lux); + } + + if(mode != 1) board->display->display_string(val, 4); + else { + for(i=0;i<40;i++){ + board->display->display_string(val, 4); + } + } +} + +void lg_dist(int dist, XNucleo6180XA1 *board){ + int i,j; + + for(j=0;j<5;j++){ + for(i=0;i<interval;i++){ + disp_dist(dist, board); + } + for(i=0;i<interval;i++){ + wait_ms(10); + } + } + +} + +void lg_lux(int lux, XNucleo6180XA1 *board){ + int i,j; + + for(j=0;j<5;j++){ + for(i=0;i<interval;i++){ + disp_lux(lux, board); + } + for(i=0;i<interval;i++){ + wait_ms(10); + } + } + +}