Index: /trunk/fw_g473rct/Core/Inc/main.h
===================================================================
--- /trunk/fw_g473rct/Core/Inc/main.h	(revision 76)
+++ /trunk/fw_g473rct/Core/Inc/main.h	(revision 77)
@@ -58,4 +58,11 @@
 
 #define VREF								  3000
+
+#define BUZZER_ON							  GPIO_PIN_SET
+#define BUZZER_OFF							  GPIO_PIN_RESET
+
+#define BTN_PRESSED							  GPIO_PIN_RESET
+#define BTN_NOT_PRESSED						  GPIO_PIN_SET
+
 /* USER CODE END EC */
 
Index: /trunk/fw_g473rct/Core/Src/main.c
===================================================================
--- /trunk/fw_g473rct/Core/Src/main.c	(revision 76)
+++ /trunk/fw_g473rct/Core/Src/main.c	(revision 77)
@@ -122,4 +122,5 @@
 void processUSB(ring_buffer_t* const ring_in_buff, ring_buffer_t* const ring_out_buff);
 void ADC2_SetOffset(uint32_t channel, int16_t offset);
+unsigned setSlaveAddr(void);
 /* USER CODE END PFP */
 
@@ -218,5 +219,13 @@
   HAL_IWDG_Refresh(&hiwdg);
 
-  if(HAL_GPIO_ReadPin(GPIO_INPUT_BTN_MODE_GPIO_Port, GPIO_INPUT_BTN_MODE_Pin) == GPIO_PIN_RESET)
+  // Set Slave Address via user button
+  unsigned slaveAddr = setSlaveAddr();
+  if (slaveAddr)
+  {
+	  sys_data.s.parameter.slave_address = slaveAddr;
+	  EEPROM_storeConfig(&sys_data, 0);
+  }
+
+  /*if(HAL_GPIO_ReadPin(GPIO_INPUT_BTN_MODE_GPIO_Port, GPIO_INPUT_BTN_MODE_Pin) == GPIO_PIN_RESET)
   {
     HAL_Delay(50);
@@ -226,5 +235,5 @@
       EEPROM_factoryRestore(&sys_data, 1);
     }
-  }
+  }*/
   HAL_IWDG_Refresh(&hiwdg);
   LoadBackupRegister();
@@ -591,4 +600,153 @@
 /* USER CODE BEGIN 4 */
 
+unsigned setSlaveAddr(void)
+{
+	const unsigned MAX_PERCENT = 80U;
+	const unsigned SCAN_RATE_MS = 5U;
+	const unsigned MAX_SLAVE_ADDR = 16U;
+
+	uint16_t buff = 0U;
+	unsigned startTime = HAL_GetTick();
+	while (HAL_GetTick() - startTime < 500U)
+	{
+		if (BTN_PRESSED == HAL_GPIO_ReadPin(GPIO_INPUT_BTN_MODE_GPIO_Port, GPIO_INPUT_BTN_MODE_Pin))
+			buff = (buff << 1U) | 1U;
+		else
+			buff = (buff << 1U);
+		HAL_Delay(15U);
+	}
+
+	unsigned ones = __builtin_popcount(buff);									// 1's counter
+	if (ones < (sizeof(buff) * 8U * MAX_PERCENT) / 100U)						// if we have 80% of 1 then we assume that a button was pressed for 1 s
+	{
+#ifdef DEBUG
+		printf("Button was NOT kept pressed!\n");
+#endif
+		return 0;
+	}
+
+#ifdef DEBUG
+	printf("Button was kept pressed for a enough time\n");
+#endif
+
+	// Buzzer signalize that we are now in Slave Address Setting mode 
+	startTime = HAL_GetTick();
+	while (HAL_GetTick() - startTime < 300U)
+	{
+		HAL_GPIO_TogglePin(BUZZER_GPIO_Port, BUZZER_Pin);
+		HAL_Delay(20U);
+	}
+	HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_OFF);
+
+	// We need to wait till button release(10s)
+	startTime = HAL_GetTick();
+	while (BTN_PRESSED == HAL_GPIO_ReadPin(GPIO_INPUT_BTN_MODE_GPIO_Port, GPIO_INPUT_BTN_MODE_Pin))
+	{
+		if (HAL_GetTick() - startTime >= 60U * 1000U) return 0;
+		HAL_Delay(10U);
+	}
+
+	typedef enum ButtonState
+	{
+		BTN_STATE_NOT_PRESSED,
+		BTN_STATE_PRESSED,
+	} ButtonState_t;
+	ButtonState_t btn_state = BTN_STATE_NOT_PRESSED;
+
+	unsigned slaveAddr = 0;
+	// Waiting for button press about 2min
+	startTime = HAL_GetTick();
+	while (HAL_GetTick() - startTime < 2U * 60U * 1000U)
+	{
+		if (BTN_PRESSED == HAL_GPIO_ReadPin(GPIO_INPUT_BTN_MODE_GPIO_Port, GPIO_INPUT_BTN_MODE_Pin))
+			buff = (buff << 1U) | 1U;
+		else
+			buff = (buff << 1U);
+		
+		HAL_Delay(SCAN_RATE_MS);
+
+		switch(btn_state)
+		{
+			case BTN_STATE_NOT_PRESSED:
+				if ((buff & UINT16_MAX) == UINT16_MAX)
+				{	// Button down event is detected
+					btn_state = BTN_STATE_PRESSED;
+					buff = 0xABCD;
+#ifdef DEBUG
+					printf("Key was pressed\n");
+#endif
+				}
+				else if (buff == 0)
+				{
+#ifdef DEBUG
+					static unsigned tickStart = 0;
+					if (HAL_GetTick() - tickStart >= 1000U)
+					{
+						tickStart = HAL_GetTick();
+						printf("Key is not pressed\n");
+					}
+#endif
+				}
+				break;
+
+			case BTN_STATE_PRESSED:
+				if ((buff & UINT16_MAX) == UINT16_MAX)
+				{	// Button down event is detected
+					btn_state = BTN_STATE_PRESSED;
+					buff = 0xBCDE;
+					static unsigned pressCnt;
+					if (++pressCnt > 2000U / (SCAN_RATE_MS * sizeof(buff) * 8U))// 2s
+					{
+						pressCnt = 0U;
+
+						HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_ON);
+						HAL_Delay(1000U);
+						HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_OFF);
+						HAL_Delay(200U);
+#ifdef DEBUG
+						printf("Key long press was detected\n");
+#endif
+						return slaveAddr;
+					}
+#ifdef DEBUG
+					static unsigned tickStart = 0;
+					if (HAL_GetTick() - tickStart >= 250U)
+					{
+						tickStart = HAL_GetTick();
+						printf("Key is kept pressed\n");
+					}
+#endif
+				}
+				else if (buff == 0)
+				{
+					btn_state = BTN_STATE_NOT_PRESSED;
+					++slaveAddr;
+					if (slaveAddr > MAX_SLAVE_ADDR)
+					{	// We allow a Slave address to be lower or equal to 16
+						for (int i = 0; i < 3; ++i)
+						{
+							HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_ON);
+							HAL_Delay(400U);
+							HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_OFF);
+							HAL_Delay(75U);
+						}
+						return 0;
+					}
+					HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_ON);
+					HAL_Delay(50U);
+					HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, BUZZER_OFF);
+#ifdef DEBUG
+					printf("Key was released\n");
+					printf("Slave address = %u\n", slaveAddr);
+#endif
+				}
+				break;
+		}
+	}
+
+	return 0;
+}
+
+
 #ifndef NO_USB_SUPPORT 
 void processUSB(ring_buffer_t* const ring_in_buff, ring_buffer_t* const ring_out_buff)
