Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: X_NUCLEO_6180XA1 mbed
Fork of HelloWorld_6180XA1 by
X-Nucleo-6180XA1 Hello World Application
This application provides a simple example of usage of X_NUCLEO_6180XA1 library. It provides a measurement of:
- Ambient Light (Lux),
- Distance (millimeters) of an object in front of the on-board sensor.
The values are displayed on the Hyperterminal connected through COM port over USB.
Diff: main.cpp
- Revision:
- 19:394c9a4a3046
- Parent:
- 18:6312be3b32d9
- Child:
- 20:b2e0b41a0e6b
diff -r 6312be3b32d9 -r 394c9a4a3046 main.cpp
--- a/main.cpp Wed Oct 28 15:06:09 2015 +0000
+++ b/main.cpp Fri Oct 30 11:59:52 2015 +0100
@@ -11,25 +11,8 @@
#define VL6180X_I2C_SDA I2C_SDA
#define VL6180X_I2C_SCL I2C_SCL
-//#define RANGE_SINGLE_SHOT_POLLING
-//#define ALS_SINGLE_SHOT_POLLING
-//#define RANGE_CONTINUOUS_POLLING
-//#define ALS_CONTINUOUS_POLLING
-#define RANGE_CONTINUOUS_INTERRUPT
-//#define ALS_CONTINUOUS_INTERRUPT
-//#define INTERLEAVED_MODE_INTERRUPT
-//#define RANGE_CONTINUOUS_POLLING_LOW_THRESHOLD
-//#define RANGE_CONTINUOUS_POLLING_HIGH_THRESHOLD
-//#define RANGE_CONTINUOUS_POLLING_OUT_OF_WINDOW
-//#define ALS_CONTINUOUS_POLLING_LOW_THRESHOLD
-//#define ALS_CONTINUOUS_POLLING_HIGH_THRESHOLD
-//#define ALS_CONTINUOUS_POLLING_OUT_OF_WINDOW
-//#define RANGE_CONTINUOUS_INTERRUPT_LOW_THRESHOLD
-//#define RANGE_CONTINUOUS_INTERRUPT_HIGH_THRESHOLD
-//#define RANGE_CONTINUOUS_INTERRUPT_OUT_OF_WINDOW
-//#define ALS_CONTINUOUS_INTERRUPT_LOW_THRESHOLD
-//#define ALS_CONTINUOUS_INTERRUPT_HIGH_THRESHOLD
-//#define ALS_CONTINUOUS_INTERRUPT_OUT_OF_WINDOW
+#define RANGE 0
+#define ALS 1
/* timer and digital out pin used for debugging */
//Timer timer;
@@ -39,233 +22,133 @@
DevI2C device_i2c(VL6180X_I2C_SDA, VL6180X_I2C_SCL);
static X_NUCLEO_6180XA1 *board=X_NUCLEO_6180XA1::Instance(&device_i2c);
-MeasureData_t data_sensor_top, data_sensor_bottom, data_sensor_left, data_sensor_right;
+MeasureData_t data_sensor_top;
/* flags that handle interrupt request */
-bool flag_sensor_top=false, flag_sensor_bottom=false, flag_sensor_left=false, flag_sensor_right=false, flag_stop_measure=false;
+bool flag_sensor_top=false, flag_stop_measure=false;
-/* user button used to stop measurements in interrupt mode */
-InterruptIn stop_button(USER_BUTTON);
-
-/* callback functions of the sensors */
+/* callback function of the sensor_top */
void SensorTopIRQ(void)
{
flag_sensor_top=true;
board->sensor_top->DisableInterruptMeasureDetectionIRQ();
}
-void SensorBottomIRQ(void)
-{
- flag_sensor_bottom=true;
- board->sensor_bottom->DisableInterruptMeasureDetectionIRQ();
-}
-
-void SensorLeftIRQ(void)
-{
- flag_sensor_left=true;
- board->sensor_left->DisableInterruptMeasureDetectionIRQ();
-}
-
-void SensorRightIRQ(void)
-{
- flag_sensor_right=true;
- board->sensor_right->DisableInterruptMeasureDetectionIRQ();
-}
-
+/* callback function of the user button to stop program */
void StopMeasureIRQ(void)
{
flag_stop_measure=true;
}
+void DisplayRefresh(OperatingMode op_mode)
+{
+ char str[4];
+
+ if(op_mode==range_continuous_interrupt)
+ {
+ if(data_sensor_top.range_mm!=0xFFFFFFFF)
+ {
+ sprintf(str,"%d",data_sensor_top.range_mm);
+ board->display->DisplayString(str, strlen(str));
+ }
+ }
+ else if(op_mode==als_continuous_interrupt)
+ {
+ if(data_sensor_top.lux!=0xFFFFFFFF)
+ {
+ sprintf(str,"%d",data_sensor_top.lux);
+ board->display->DisplayString(str, strlen(str));
+ }
+ }
+}
+
int main()
{
- int status, status_t, status_b, status_l, status_r;
-
- //device_i2c.frequency(400000); //change i2c frequncy from 100kHz to 400kHz
- pc.baud(115200); //change baudrate of the printf
+ OperatingMode operating_mode, prev_operating_mode;
+ /* user button used to stop measurements in interrupt mode */
+ InterruptIn stop_button(USER_BUTTON);
+ STMPE1600DigiIn measure_type(device_i2c, GPIO_11);
+ int status, measure;
+ char str[4];
+
+ pc.baud(115200); //change the printf baudrate
status=board->InitBoard();
if(status)
printf("Failed to init the board!\n\r");
-
-#ifdef RANGE_SINGLE_SHOT_POLLING
- status_t=board->sensor_top->StartMeasurement(range_single_shot_polling, NULL, &data_sensor_top, NULL, NULL);
- if(!status_t)
- printf("Top Range: %dmm\n\r",data_sensor_top.range_mm);
- else if(status==INVALID_PARAMS)
- printf("Failed to start measurement!\n\r");
- else
- printf("Invalid range value!\n\r");
- status_t=board->sensor_top->StopMeasurement(range_single_shot_polling);
- if(status_t)
- printf("Failed to stop measurement!\n\r");
-#endif
-
-#ifdef ALS_SINGLE_SHOT_POLLING
- status_t=board->sensor_top->StartMeasurement(als_single_shot_polling, NULL, &data_sensor_top, NULL, NULL);
- if(!status_t)
- printf("Top Light: %d lux\n\r",data_sensor_top.lux);
- else if(status==INVALID_PARAMS)
- printf("Failed to start measurement!\n\r");
- else
- printf("Invalid light value!\n\r");
- status_t=board->sensor_top->StopMeasurement(als_single_shot_polling);
- if(status_t)
- printf("Failed to stop measurement!\n\r");
-#endif
-
-#ifdef RANGE_CONTINUOUS_POLLING
- status_t=board->sensor_top->StartMeasurement(range_continuous_polling, NULL, &data_sensor_top, NULL, NULL);
- if(!status_t)
- {
- int i;
- for(i=0;i<10;i++)
- {
- status_t=board->sensor_top->GetMeasurement(range_continuous_polling, &data_sensor_top);
- if(!status_t)
- printf("Top Range measure %d: %dmm\n\r",i+1,data_sensor_top.range_mm);
- else
- printf("Invalid range value!\n\r");
- }
- }
- else
- printf("Failed to start measurement!\n\r");
- status_t=board->sensor_top->StopMeasurement(range_continuous_polling);
- if(status_t)
- printf("Failed to stop measurement!\n\r");
-#endif
-
-#ifdef ALS_CONTINUOUS_POLLING
- status_t=board->sensor_top->StartMeasurement(als_continuous_polling, NULL, &data_sensor_top, NULL, NULL);
- if(!status_t)
- {
- int i;
- for(i=0;i<10;i++)
- {
- status=board->sensor_top->GetMeasurement(als_continuous_polling, &data_sensor_top);
- if(!status_t)
- printf("Top Light measure %d: %d lux\n\r",i,data_sensor_top.lux);
- else
- printf("Invalid light value!\n\r");
- }
- }
- else
- printf("Failed to start measurement!\n\r");
- status_t=board->sensor_top->StopMeasurement(als_continuous_polling);
- if(status_t)
- printf("Failed to stop measurement!\n\r");
-#endif
-
-#ifdef RANGE_CONTINUOUS_INTERRUPT
+
stop_button.rise(&StopMeasureIRQ);
- status=board->sensor_top->StartMeasurement(range_continuous_interrupt, SensorTopIRQ, &data_sensor_top, NULL, NULL);
+ measure=measure_type;
+ if(measure==RANGE)
+ operating_mode=range_continuous_interrupt;
+ else if(measure==ALS)
+ operating_mode=als_continuous_interrupt;
+ status=board->sensor_top->StartMeasurement(operating_mode, SensorTopIRQ, &data_sensor_top, NULL, NULL);
+ prev_operating_mode=operating_mode;
if(!status)
{
+ printf("\nStart measurement\n\r");
while(1)
{
if(flag_sensor_top)
{
flag_sensor_top=false;
- status=board->sensor_top->HandleIRQ(range_continuous_interrupt, &data_sensor_top);
+ status=board->sensor_top->HandleIRQ(operating_mode, &data_sensor_top);
if(!status)
- printf("Range: %dmm\n\r",data_sensor_top.range_mm);
- else
- printf("Invalid range value!\n\r");
+ {
+ if(operating_mode==range_continuous_interrupt)
+ sprintf(str,"%d",data_sensor_top.range_mm);
+ else if(operating_mode==als_continuous_interrupt)
+ sprintf(str,"%d",data_sensor_top.lux);
+ board->display->DisplayString(str, strlen(str));
+ }
+ /*else
+ {
+ sprintf(str,"%s","----");
+ board->display->DisplayString(str, strlen(str));
+ }*/
}
if(flag_stop_measure)
- break;
- }
- }
- else
- printf("Failed to start measurement!\n\r");
- status=board->sensor_top->StopMeasurement(range_continuous_interrupt);
- if(status)
- printf("Failed to stop measurement!\n\r");
-#endif
-
-#ifdef ALS_CONTINUOUS_INTERRUPT
- stop_button.rise(&StopMeasureIRQ);
- status_t=board->sensor_top->StartMeasurement(als_continuous_interrupt, SensorTopIRQ, &data_sensor_top, NULL, NULL);
- if(!status_t)
- {
- while(1)
- {
- if(flag_sensor_top)
+ {
+ status=board->sensor_top->StopMeasurement(prev_operating_mode);
+ if(status)
+ printf("Failed to stop measurement!\n\r");
+ else
+ printf("Measurement stopped!\n\r");
+ printf("\nProgram stopped!\n\n\r");
+ break;
+ }
+ measure=measure_type;
+ if(measure==RANGE)
+ operating_mode=range_continuous_interrupt;
+ else if(measure==ALS)
+ operating_mode=als_continuous_interrupt;
+ if(operating_mode!=prev_operating_mode)
{
- flag_sensor_top=false;
- status_t=board->sensor_top->HandleIRQ(als_continuous_interrupt, &data_sensor_top);
- if(!status_t)
- printf("Top Light: %d lux\n\r",data_sensor_top.lux);
- else
- printf("Invalid light value!\n\r");
- }
- if(flag_stop_measure)
- break;
+ DisplayRefresh(prev_operating_mode);
+ status=board->sensor_top->StopMeasurement(prev_operating_mode);
+ prev_operating_mode=operating_mode;
+ if(status)
+ printf("Failed to stop measurement!\n\r");
+ else
+ printf("Measurement stopped!\n\r");
+ status=board->sensor_top->StartMeasurement(operating_mode, SensorTopIRQ, &data_sensor_top, NULL, NULL);
+ if(status)
+ {
+ printf("\nFailed to start measurement!\n\r");
+ break;
+ }
+ else
+ printf("\nStart measurement\n\r");
+ }
+ else
+ DisplayRefresh(operating_mode);
}
}
else
- printf("Failed to stop measurement!\n\r");
- status_t=board->sensor_top->StopMeasurement(als_continuous_interrupt);
- if(status_t)
- printf("Failed to stop measurement!\n\r");
-#endif
-
-#ifdef INTERLEAVED_MODE_INTERRUPT
- stop_button.rise(&StopMeasureIRQ);
- status_t=board->sensor_top->StartMeasurement(interleaved_mode_interrupt, SensorTopIRQ, &data_sensor_top, NULL, NULL);
- if(!status_t)
- {
- while(1)
- {
- if(flag_sensor_top)
- {
- flag_sensor_top=false;
- status_t=board->sensor_top->HandleIRQ(interleaved_mode_interrupt, &data_sensor_top);
- if(!status_t)
- printf("Top Range: %dmm\tTop Light: %d lux\n\r",data_sensor_top.range_mm, data_sensor_top.lux);
- else
- printf("Invalid range or light value!\n\r");
- }
- if(flag_stop_measure)
- break;
- }
- }
- else
- printf("Failed to stop measurement!\n\r");
- status_t=board->sensor_top->StopMeasurement(interleaved_mode_interrupt);
- if(status_t)
- printf("Failed to stop measurement!\n\r");
-#endif
+ printf("\nFailed to start measurement!\n\r");
-#ifdef RANGE_CONTINUOUS_INTERRUPT_LOW_THRESHOLD
- stop_button.rise(&StopMeasureIRQ);
- status_t=board->sensor_top->StartMeasurement(range_continuous_interrupt_low_threshold, SensorTopIRQ, &data_sensor_top, 80, NULL);
- if(!status_t)
- {
- while(1)
- {
- if(flag_sensor_top)
- {
- flag_sensor_top=false;
- status_t=board->sensor_top->HandleIRQ(range_continuous_interrupt_low_threshold, &data_sensor_top);
- if(!status_t)
- printf("Range int low threshold: %dmm\n\r",data_sensor_top.range_mm);
- else
- printf("Invalid range value!\n\r");
- }
- if(flag_stop_measure)
- break;
- }
- }
- else
- printf("Failed to start measurement!\n\r");
- status_t=board->sensor_top->StopMeasurement(range_continuous_interrupt_low_threshold);
- if(status_t)
- printf("Failed to stop measurement!\n\r");
-#endif
-
-delete board;
-
+ delete board;
}

X-NUCLEO-6180XA1 Proximity and Ambient Light Sensor