본문 바로가기

MCU

ESP32-BLE-Raspberry pi

STM32 보드에 없는 통신 기능을 이용하기 위해 ESP32 C3 를 SPI로 연결.

 

 

 

 

동작: 

1. STM32 보드는 DHT22에서 주기적으로 온습도 정보를 읽는다.

2. ESP32 보드로 온습도 값을 전송한다.

3. CAN으로 주기적으로 값을 Raspberry pi 보드에 전송한다.

4. LCD 에 온습도 값을 출력한다.

5. ESP32 보드는 BLE에 연결된 기기(Raspberry pi)가 있으면 요청에 따라 온습도 값을 전송한다.

 

 

 

 

DHT22Task

void StartDHT22Task(void *argument)
{
  for(;;)
  {
    DHT_GetData(&dht22Data);
    xQueueSend(dht22Queue, &dht22Data, pdMS_TO_TICKS(100));
    xQueueSend(spiQueue, &dht22Data, pdMS_TO_TICKS(100));
  }
}

 

DisplayTask

void StartDisplayTask(void *argument)
{
  ssd1306_Init(&hi2c1);

  for(;;)
  {
    if (xQueueReceive(dht22Queue, &dht22Data, pdMS_TO_TICKS(100)) == pdPASS)
    {
      vMainCanTransmit(&hcan1, &dht22Data);

      ssd1306_WriteString(temperature, Font_7x10, White);
      ssd1306_WriteString(humidity, Font_7x10, White);
      ssd1306_UpdateScreen(&hi2c1);
    }
    vTaskDelay(pdMS_TO_TICKS(500));
  }
}

 

 

BleTask

void StartBleTask(void *argument)
{
  for(;;)
  {
    if (xQueueReceive(spiQueue, &dht22Data, pdMS_TO_TICKS(100)) == pdPASS)
    {
       HAL_StatusTypeDef status = HAL_SPI_Transmit(&hspi2, txData, 4, HAL_MAX_DELAY);
    }
  }
}

 

BLE는 요청할때만 읽는 방식으로 

static const esp_gatts_attr_db_t gatt_db[HRS_IDX_NB] = {
    // Temperature Characteristic Value
    [IDX_CHAR_TEMP_VAL] = {{ESP_GATT_RSP_BY_APP}, {ESP_UUID_LEN_16, (uint8_t *)&gatts_char_temperature_uuid, ESP_GATT_PERM_READ,
            sizeof(uint16_t), 0, NULL}},

    // Humidity Characteristic Value
    [IDX_CHAR_HUMID_VAL] = {{ESP_GATT_RSP_BY_APP}, {ESP_UUID_LEN_16, (uint8_t *)&gatts_char_humidity_uuid, ESP_GATT_PERM_READ,
            sizeof(uint16_t)*2, 0, NULL}},
};

 

테스트용으로만 데이터 읽어오기.

async def periodic_read(client):
    while True:
        try:
            temperpature = await client.read_gatt_char(TEMPERATURE_CHAR_UUID)
        await asyncio.sleep(1)

        try:
            humidity = await client.read_gatt_char(HUMIDITY_CHAR_UUID)
        await asyncio.sleep(3)

async def main():
    devices = await BleakScanner.discover(timeout=5)

    async with BleakClient(target.address) as client:
        read_task = asyncio.create_task(periodic_read(client))
        while True:
            await asyncio.sleep(1)

 

 

실행화면

 

 

STM32의 전원을 ESP32에 연결해놓으니

둘중 어느 한 보드에 전원이 들어가도 두 보드 모두에 전원이 함께 들어가는 상황이 되었다.

각각을 USB 허브에 연결하니 두 보드의 펌웨어를 수정하기 편한 상황이 되었다.

 

코드

https://github.com/ipondroid/mcus/tree/main

 

GitHub - ipondroid/mcus: STM32 - ESP32 - RaspberryPi

STM32 - ESP32 - RaspberryPi. Contribute to ipondroid/mcus development by creating an account on GitHub.

github.com

 

'MCU' 카테고리의 다른 글

Vector table  (0) 2025.06.17
STM32-CAN-Raspberry Pi  (0) 2025.04.07
DHT22 온습도 센서  (0) 2025.03.23
OLED display 128x32  (0) 2025.02.28
STM32 clock  (0) 2025.01.23