#include "LiquidCrystal_I2C.h"
I2C_HandleTypeDef hi2c1;
#define SMART_HOME_I2C_ADDRESS 0x30 << 1 // I2C Address of smart home 
device (slave)
// Function Prototypes
void SystemClock_Config(void);
void My_Error_Handler(void);
void I2C_Init(void);
void I2C_Write(uint8_t *data, uint8_t length);
void I2C_Read(uint8_t *data, uint8_t length);
// Main Program
int main(void)
{
 HAL_Init();
 SystemClock_Config();
 I2C_Init();
 uint8_t data_to_send[] = {0x01, 0x01}; // Example: Command to turn on a light 
(0x01 is command, 0x01 is data)
 uint8_t received_data[2]; // Array to store received data
 // Send data to the smart home controller
 I2C_Write(data_to_send, sizeof(data_to_send));
 // Receive data from the smart home controller
 I2C_Read(received_data, sizeof(received_data));
 // Check if received data matches the expected response
 if (received_data[0] == 0x01 && received_data[1] == 0x01) {
 // If data matches, then the device was successfully turned on
 HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); // Example: Toggle LED on 
successful communication
 }
 while (1) {
 // Application main loop
 }
}
// Initialize I2C peripheral
void I2C_Init(void)
{
 __HAL_RCC_I2C1_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 // Configure I2C pins (SCL: PB6, SDA: PB7)
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 hi2c1.Instance = I2C1;
 hi2c1.Init.ClockSpeed = 100000; // 100kHz I2C speed
 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
 hi2c1.Init.OwnAddress1 = 0x00;
 hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 hi2c1.Init.Ack = I2C_ACK_ENABLE;
 hi2c1.Init.AcknowledgedAddress = I2C_ACKNOWLEDGEDADDRESS_7BIT;
 if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
 My_Error_Handler();
 }
}
// Function to send data to I2C slave
void I2C_Write(uint8_t *data, uint8_t length)
{
 if (HAL_I2C_Master_Transmit(&hi2c1, SMART_HOME_I2C_ADDRESS, data, 
length, HAL_MAX_DELAY) != HAL_OK) {
 My_Error_Handler();
 }
}
// Function to receive data from I2C slave
void I2C_Read(uint8_t *data, uint8_t length)
{
 if (HAL_I2C_Master_Receive(&hi2c1, SMART_HOME_I2C_ADDRESS, data, 
length, HAL_MAX_DELAY) != HAL_OK) {
 My_Error_Handler();
 }
}
// System Clock Configuration
void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLM = 8;
 RCC_OscInitStruct.PLL.PLLN = 336;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
 RCC_OscInitStruct.PLL.PLLQ = 7;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
 My_Error_Handler();
 }
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | 
RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | 
RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != 
HAL_OK) {
 My_Error_Handler();
 }
}
// Error handler: Infinite loop
void My_Error_Handler(void)
{
 while (1) {
 // In case of an error, blink LED or stay in a loop
 }
}
nucleo:PD0
nucleo:PD2
nucleo:VDD
nucleo:PA14
nucleo:PA13
nucleo:PC6
nucleo:GND.1
nucleo:PC13
nucleo:PC14
nucleo:PF0
nucleo:PF1
nucleo:PB11
nucleo:PA2
nucleo:PD1
nucleo:PD2.2
nucleo:E5V
nucleo:GND.2
nucleo:IOREF.1
nucleo:NRST.1
nucleo:3V3.1
nucleo:5V.1
nucleo:GND.3
nucleo:GND.4
nucleo:VIN.1
nucleo:PA0
nucleo:PA1
nucleo:PA4
nucleo:PB1
nucleo:PA11
nucleo:PA12
nucleo:IOREF.2
nucleo:NRST.2
nucleo:3V3.2
nucleo:5V.2
nucleo:GND.5
nucleo:GND.6
nucleo:VIN.2
nucleo:A0
nucleo:A1
nucleo:A2
nucleo:A3
nucleo:A4
nucleo:A5
nucleo:5V.3
nucleo:PA3
nucleo:PC15
nucleo:PB12.1
nucleo:PB12.2
nucleo:PB2
nucleo:GND.7
nucleo:PF3
nucleo:PA8
nucleo:PB15
nucleo:PB14
nucleo:PB13
nucleo:AGND
nucleo:PB0.1
nucleo:PD3
nucleo:PB8
nucleo:PB9
nucleo:AVDD.1
nucleo:GND.8
nucleo:PA5
nucleo:PA6
nucleo:PA7
nucleo:PB0.2
nucleo:PC7
nucleo:PA9
nucleo:PA15
nucleo:PB5
nucleo:PB4
nucleo:PB10
nucleo:PB3
nucleo:PA10
nucleo:PB6
nucleo:PB7
nucleo:D15
nucleo:D14
nucleo:AVDD.2
nucleo:GND.9
nucleo:D13
nucleo:D12
nucleo:D11
nucleo:D10
nucleo:D9
nucleo:D8
nucleo:D7
nucleo:D6
nucleo:D5
nucleo:D4
nucleo:D3
nucleo:D2
nucleo:D1
nucleo:D0
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL