Sample Program for Maker Faire Tokyo 2017
Dependencies: X_NUCLEO_6180XA1 mbed
Fork of HelloWorld_6180XA1 by
main.cpp
- Committer:
- matsuya
- Date:
- 2017-07-27
- Revision:
- 48:5f6dbaa777ea
- Parent:
- 47:04733a0905ba
File content as of revision 48:5f6dbaa777ea:
/* This VL6180X Expansion board test application performs a range measurement and als measurement in polling mode on the onboard embedded top sensor. The result of both the measures are printed on the serial over. get_distance() and get_lux() are synchronous! They block the caller until the result will be ready. */ /* Includes ------------------------------------------------------------------*/ #include "mbed.h" #include "XNucleo6180XA1.h" #include <string.h> #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=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(); if (status) { 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) { 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); } } }