Sample Program for Maker Faire Tokyo 2017

Dependencies:   X_NUCLEO_6180XA1 mbed

Fork of HelloWorld_6180XA1 by ST

Files at this revision

API Documentation at this revision

Comitter:
matsuya
Date:
Thu Jul 27 04:44:31 2017 +0000
Parent:
47:04733a0905ba
Commit message:
Sample Program for Maker Faire Tokyo 2017

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 04733a0905ba -r 5f6dbaa777ea main.cpp
--- 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);
+		}
+	}
+
+}