We're dedicated to making proximity technology accessible and impactful, shaping the future of human-machine interaction
A
A
Hardware Overview
How does it work?
Proximity 10 Click is based on the SI1143, a photometric sensor for the ambient light and proximity detection from Silicon Labs. Among other sections, this IC contains a LED driver, used to drive an externally connected LED, which provides feedback for the SI1143 sensory sections. Therefore, the LED should be chosen so that its spectrum matches the spectral sensitivity of the on-chip light sensor. For this reason, the Click board™ is equipped with the narrow beam LED from Rohm Semiconductor with its spectral response characteristic peaking at 870nm, which is a perfect choice for this application. The proximity detection consists of sending a pulse to the LED while measuring the response of the reflected light. Most of the parameters are user configurable, such as the sampling frequency,
pulses duration, averaging parameters and more. More in-depth information about the registers can be found in the SI1143 datasheet. Aimed towards the low consumption market, the SI1143 uses a rather low voltage range, between 1.7V and 3.6V. Since the most of the MCUs use 3.3V, this click board™ is designed so that the SI1143 IC is directly interfaced with the mikroBUS™. Proximity 10 click offers an interrupt output pin that can be used to trigger an interrupt on the host MCU. The SI1143 IC interrupt engine allows several interrupt sources, which can be used to trigger a state change on the INT pin. These sources include proximity detection interrupts (proximity OFF and proximity ON), sample interrupts, and more. The INT pin itself is highly configurable, and when asserted, this pin triggers an MCU interrupt, informing it
that the configured interrupt event has occurred. The MCU can then read the desired register output, not having to poll it constantly, which saves both MCU cycles and power. The INT pin is routed via the level shifting IC to the mikroBUS™ INT pin. As already mentioned, detailed information on the SI1143 IC registers can be found in the datasheet. However, MikroElektronika provides a library that contains functions compatible with the MikroElektronika compilers, which can be used for simplified programming of the Proximity 10 click. The library also contains an example application, which demonstrates its use. This example application can be used as a reference for custom designs.
Features overview
Development board
EasyPIC v8 is a development board specially designed for the needs of rapid development of embedded applications. It supports many high pin count 8-bit PIC microcontrollers from Microchip, regardless of their number of pins, and a broad set of unique functions, such as the first-ever embedded debugger/programmer. The development board is well organized and designed so that the end-user has all the necessary elements, such as switches, buttons, indicators, connectors, and others, in one place. Thanks to innovative manufacturing technology, EasyPIC v8 provides a fluid and immersive working experience, allowing access anywhere and under any
circumstances at any time. Each part of the EasyPIC v8 development board contains the components necessary for the most efficient operation of the same board. In addition to the advanced integrated CODEGRIP programmer/debugger module, which offers many valuable programming/debugging options and seamless integration with the Mikroe software environment, the board also includes a clean and regulated power supply module for the development board. It can use a wide range of external power sources, including a battery, an external 12V power supply, and a power source via the USB Type-C (USB-C) connector.
Communication options such as USB-UART, USB DEVICE, and CAN are also included, including the well-established mikroBUS™ standard, two display options (graphical and character-based LCD), and several different DIP sockets. These sockets cover a wide range of 8-bit PIC MCUs, from the smallest PIC MCU devices with only eight up to forty pins. EasyPIC v8 is an integral part of the Mikroe ecosystem for rapid development. Natively supported by Mikroe software tools, it covers many aspects of prototyping and development thanks to a considerable number of different Click boards™ (over a thousand boards), the number of which is growing every day.
Microcontroller Overview
MCU Card / MCU

Architecture
PIC
MCU Memory (KB)
32
Silicon Vendor
Microchip
Pin count
40
RAM (Bytes)
2048
Used MCU Pins
mikroBUS™ mapper
Take a closer look
Click board™ Schematic

Step by step
Project assembly
Track your results in real time
Application Output
1. Application Output - In Debug mode, the 'Application Output' window enables real-time data monitoring, offering direct insight into execution results. Ensure proper data display by configuring the environment correctly using the provided tutorial.

2. UART Terminal - Use the UART Terminal to monitor data transmission via a USB to UART converter, allowing direct communication between the Click board™ and your development system. Configure the baud rate and other serial settings according to your project's requirements to ensure proper functionality. For step-by-step setup instructions, refer to the provided tutorial.

3. Plot Output - The Plot feature offers a powerful way to visualize real-time sensor data, enabling trend analysis, debugging, and comparison of multiple data points. To set it up correctly, follow the provided tutorial, which includes a step-by-step example of using the Plot feature to display Click board™ readings. To use the Plot feature in your code, use the function: plot(*insert_graph_name*, variable_name);. This is a general format, and it is up to the user to replace 'insert_graph_name' with the actual graph name and 'variable_name' with the parameter to be displayed.

Software Support
Library Description
This library contains API for Proximity 10 Click driver.
Key functions:
proximity10_check_int_status
- This function checks the desired interrupt flags status.proximity10_send_command
- This function allows user to execute a desired command and checks the response.proximity10_param_set
- This function sets the selected parameter to the desired value, and checks the response.
Open Source
Code example
The complete application code and a ready-to-use project are available through the NECTO Studio Package Manager for direct installation in the NECTO Studio. The application code can also be found on the MIKROE GitHub account.
/*!
* \file
* \brief Proximity10 Click example
*
* # Description
* This application enables proximity sensor to detect objects from distance up to 20cm.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initializes I2C serial interface and performs a device wake up, reset and
* all necessary configurations.
* The device will wake up and performs measurements every 10 milliseconds.
*
* ## Application Task
* Reads the proximity PS1 data value and sends result to the uart terminal.
* If measured proximity value is greater than selected proximity threshold value, the interrupt will be generated and
* the message will be showed on the uart terminal.
* When interrupt is generated the Sound function will make an alarm sound with determined duration depending on the detected proximity value,
* how much is object away or close from the sensor.
*
* *note:*
* Additional Functions :
* - checkResponse - Sends an error code message to the uart terminal if error code is detected in the response.
*
* \author MikroE Team
*
*/
// ------------------------------------------------------------------- INCLUDES
#include "board.h"
#include "log.h"
#include "proximity10.h"
// ------------------------------------------------------------------ VARIABLES
static proximity10_t proximity10;
static log_t logger;
// ------------------------------------------------------- ADDITIONAL FUNCTIONS
void check_response ( uint8_t cmd_resp )
{
switch ( cmd_resp )
{
case PROXIMITY10_INVALID_CMD_ENCOUNT :
{
log_printf( &logger, "** Invalid Command Encountered during command processing **\r\n" );
break;
}
case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_PS1 :
{
log_printf( &logger, "** ADC Overflow Encountered during PS1 measurement **\r\n" );
break;
}
case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_PS2 :
{
log_printf( &logger, "** ADC Overflow Encountered during PS2 measurement **\r\n" );
break;
}
case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_PS3 :
{
log_printf( &logger, "** ADC Overflow Encountered during PS3 measurement **\r\n" );
break;
}
case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_ALS_VIS :
{
log_printf( &logger, "** ADC Overflow Encountered during ALS-VIS measurement **\r\n" );
break;
}
case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_ALS_IR :
{
log_printf( &logger, "** ADC Overflow Encountered during ALS-IR measurement **\r\n" );
break;
}
case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_AUX :
{
log_printf( &logger, "** ADC Overflow Encountered during AUX measurement **\r\n" );
break;
}
default :
{
break;
}
}
}
// ------------------------------------------------------ APPLICATION FUNCTIONS
void application_init ( void )
{
log_cfg_t log_cfg;
proximity10_cfg_t cfg;
uint8_t w_temp;
uint8_t cmd_resp;
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, "---- Application Init ----" );
// Click initialization.
proximity10_cfg_setup( &cfg );
PROXIMITY10_MAP_MIKROBUS( cfg, MIKROBUS_1 );
proximity10_init( &proximity10, &cfg );
Delay_ms( 2000 );
w_temp = PROXIMITY10_HW_KEY;
proximity10_generic_write( &proximity10, PROXIMITY10_HW_KEY_REG, &w_temp, 1 );
cmd_resp = proximity10_send_command( &proximity10, PROXIMITY10_NOP_CMD );
check_response( cmd_resp );
cmd_resp = proximity10_send_command( &proximity10, PROXIMITY10_RESET_CMD );
check_response( cmd_resp );
Delay_ms( 2000 );
cmd_resp = proximity10_param_set( &proximity10, PROXIMITY10_CHLIST_PARAM, PROXIMITY10_EN_AUX | PROXIMITY10_EN_ALS_IR | PROXIMITY10_EN_ALS_VIS | PROXIMITY10_EN_PS1 );
check_response( cmd_resp );
cmd_resp = proximity10_param_set( &proximity10, PROXIMITY10_PSLED12_SEL_PARAM, PROXIMITY10_LED1_DRIVE_EN );
check_response( cmd_resp );
cmd_resp = proximity10_param_set( &proximity10, PROXIMITY10_PS_ADC_MISC_PARAM, PROXIMITY10_NORMAL_SIGNAL_RANGE | PROXIMITY10_NORMAL_PROX_MEAS_MODE );
check_response( cmd_resp );
cmd_resp = proximity10_param_set( &proximity10, PROXIMITY10_PS_ADC_GAIN_PARAM, PROXIMITY10_ADC_CLOCK_DIV_4 );
check_response( cmd_resp );
proximity10_default_cfg ( &proximity10 );
cmd_resp = proximity10_send_command( &proximity10, PROXIMITY10_PS_AUTO_CMD );
check_response( cmd_resp );
//Sound_Init( &GPIOE_ODR, 14 );
log_printf( &logger, "** Proximity 10 is initialized **\r\n" );
log_printf( &logger, "**************************************\r\n" );
Delay_ms( 1000 );
}
void application_task ( void )
{
// Task implementation.
uint32_t proximity;
uint8_t temp_read[ 2 ];
uint8_t int_status;
uint16_t alarm_dur;
proximity10_generic_read( &proximity10, PROXIMITY10_PS1_DATA_REG, &temp_read, 2 );
proximity = temp_read[ 1 ];
proximity <<= 8;
proximity |= temp_read[ 0 ];
log_printf( &logger, "** Proximity PS1 : %u \r\n", proximity );
int_status = proximity10_check_int_status( &proximity10, PROXIMITY10_PS1_INT_FLAG, PROXIMITY10_INT_CLEAR_DIS );
if ( int_status == PROXIMITY10_PS1_INT_FLAG )
{
log_printf( &logger, "** Object is detected **\r\n" );
alarm_dur = proximity / 100;
alarm_dur = alarm_dur + 35;
alarm_dur = ( float )( alarm_dur * 0.30928 );
alarm_dur = 180 - alarm_dur;
//Sound_Play( 1400, alarm_dur );
Delay_ms( 1000 );
}
else
{
Delay_ms( 1000 );
}
log_printf( &logger, "**************************************\r\n" );
}
void main ( void )
{
application_init( );
for ( ; ; )
{
application_task( );
}
}
// ------------------------------------------------------------------------ END