STM Урок 97. Подключаем bluetooth-модуль HC-05



 

Настало время немного отдохнуть от передачи данных по интерфейсу LAN.

Сегодня мы попробуем передать данные с микроконтроллера куда-нибудь, а также обратно, используя уже беспроводные технологии, то есть такие технологии, благодаря которым передача данных происходит без использования каких-либо проводов.

В качестве технологии беспроводной передачи данных мы будем использовать Bluetooth. А в качестве устройства для этого мы возьмём модуль HC-05, обзор и тестирование которого находится вот здесь. Обязательно просмотрите данный обзор и проделайте все тесты, описанные в нём, также установите программу на смартфон, которая была представлена в этом обзоре, а потом уже приступайте к изучению подключения модуля к контроллеру. То есть проект сегодняшнего занятия будет нормально работать на настроенном модуле.

Мы подключим данный модуль к контроллеру STM32F103C8T6, расположенному на недорогой отладочной плате, которая нам уже отлично знакома благодаря многочистенным урокам, которые мы просмотрели и прочитали.

Сначала давайте создадим и настроим проект.

Создадим новый проект в Cube MX, выбрав контроллер STM32F103C8Tx.

Настроим тактирование от кварцевого резонатора

 

Image01

Включим отладчик

 

Image02

 

Настроим USART. Использовать для модуля мы будем USART2, так как первый в дальнейшем нам, возможно пригодится для подключения переходника USB-TTL для связи с ПК

 

image00

 

Включим таймер 2

 

image05

 

Включим ножку порта PC13, отвечающую за светодиод, на выход

 

Image04

 

Также на выход включим ножку PA5, посредством которой мы будем включать модулю поддержку AT-команд, правла пока не в данном уроке

 

image01

 

Настроим частоты в System Configuration (нажмите на картинку для увеличения изображения)

 

Image06_0500

 

Теперь перейдём в раздел Configuration, USART трогать не будем, оставим настройки по умолчанию (скорость 115200 кбпс), а вот ножкe порта PA5 настроим чуть побыстрее

 

image02

 

 

Тем не менее в настройки USART нам зайти придётся для, того, чтобы включить прерывания, мы же и на вход будем его использовать

 

image03

 

Настроим таймер на период приблизительно 2 секунды

 

image06

 

Также включим в таймере прерывания

 

image07

 

Настроим проект, увеличив размер стека и кучи в двое (на будущее) и выбрав в качестве среды разработки Keil, а также назовём наш проект соответствующим теме занятия именем

 

image04

 

Применим настройки, соберём проект, откроем его в Keil, настроим программатор на авторезет, а также уровень оптимизации убавим до уровня 1.

Попробуем собрать проект.

Давайте посмотрим схему подключения модуля к контроллеру (нажмите на картинку для увеличения изображения)

 

image08_0500

 

Вернёмся к проекту и добавим в main.c библиотеку для работы со строками

 

/* USER CODE BEGIN Includes */

#include <string.h>

/* USER CODE END Includes */

 

Добавим также глобальный строковый массив

 

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

char str1[60]={0};

/* USER CODE END PV */

 

В main() инициируем приём данных в USART, а также запустим наш таймер

 

/* USER CODE BEGIN 2 */

HAL_UART_Receive_IT(&huart2,(uint8_t*)str1,1);

HAL_TIM_Base_Start_IT(&htim2);

/* USER CODE END 2 */

 

Добавим глобальную структуру для свойств USART, а также переменную её типа

 

char str1[60]={0};

typedef struct USART_prop{

  uint8_t usart_buf[60];

  uint8_t usart_cnt;

  uint8_t is_tcp_connect;//статус попытки создать соединение TCP с сервером

  uint8_t is_text;//статус попытки передать текст серверу

} USART_prop_ptr;

USART_prop_ptr usartprop;

 

 

Тажке добавим глобальную переменную для счётчика выводимых в модуль строк, а также массив этих самых строк

 

USART_prop_ptr usartprop;

uint8_t i=0;

char *str2[] =

{

  "String1\r\n",

  "String2\r\n",

  "String3\r\n",

  "String4\r\n",

  "String5\r\n"

};

 

Добавим также функцию разбора строки. Пока она будет почти пустая. Наполняться она будет в более поздних занятиях, а пока же в ней будет лишь изменение состояния свечения светодиода, а также возврат эхом строки источнику, его пославшему, то есть в нашем случае смартфону посредством передачи в USART

 

/* USER CODE BEGIN 0 */

//-----------------------------------------------

void string_parse(char* buf_str)

{

  HAL_UART_Transmit(&huart2,(uint8_t*)buf_str,strlen(buf_str),0x1000);

  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

}

//-----------------------------------------------

/* USER CODE END 0 */

 

Теперь добавим обработчик приёма символа из USART

 

//-----------------------------------------------

void UART2_RxCpltCallback(void)

{

  uint8_t b;

  b = str1[0];

  //если вдруг случайно превысим длину буфера

  if (usartprop.usart_cnt>59)

  {

    usartprop.usart_cnt=0;

    HAL_UART_Receive_IT(&huart2,(uint8_t*)str1,1);

    return;

  }

  usartprop.usart_buf[usartprop.usart_cnt] = b;

  if(b==0x0A)

  {

    usartprop.usart_buf[usartprop.usart_cnt+1]=0;

    string_parse((char*)usartprop.usart_buf);

    usartprop.usart_cnt=0;

    HAL_UART_Receive_IT(&huart2,(uint8_t*)str1,1);

    return;

  }

  usartprop.usart_cnt++;

  HAL_UART_Receive_IT(&huart2,(uint8_t*)str1,1);

}

//-----------------------------------------------

/* USER CODE END 0 */

 

Данный обработчик принимает символ из порта USART, заносит его в буфер по адресу, находящемуся в счётчике, проверяет на символ перевода строки, если таковой имеет место, то приём прекращается, набранная в буфере строка передаётся в функцию разбора строки и счётчик обнуляется, если другой символ, то счётчик наращивается. Также на ряду с этим в функцию был включен код проверки на превышение строкой размера буфера.

Добавим теперь официальный обработчик приёма из USART, в котором и вызовем наш «самодельный» обработчик

 

/* USER CODE BEGIN 4 */

//-----------------------------------------------

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

  if(huart==&huart2)

  {

    UART2_RxCpltCallback();

  }

}

//-----------------------------------------------

/* USER CODE END 4 */

 

Соберём код, прошьём контроллер и проверим работу кода в терминальной программе на смартфоне.

Чтобы не мучиться и постоянно не вводить строки, в программе предусмотрены пять кнопок, в обработчики нажатий которых можно добавить любые строки. Вот эти кнопки

 

image09

 

Давайте, например, пятой кнопке назначим строку, которую она будет по нажатию отправлять в bluetooth. Зайти в настройки мы можем по нажатию на кнопку

 

image10

 

Мы можем здесь настроить несколько параметров. Изменить имя кнопки (имя отображаемое на самой кнопке, также тип данных, саму отправляемую строку, а также заканчивать ли строку кодами возврата каретки и перевода строки. Настроим всё как на скриншоте и сохраним настройки. Теперь по нажатию на нашу кнопку строка, текст которой мы добавили в поле Command, будет отправляться в порт. Конечно, будет логичный вопрос: «а как же зайти обратно в настройки и перенастроить свойства кнопки?». Ответ: «посредством длинного нажатия на кнопку (длинного тапа)»

Нажмём на кнопку и строка наша из кнопки попадёт в чат отправки, а также попадёт и в чат приёма. А в чат приёма она попадёт благодаря эху в функции разбора строки. Тем самым мы проверили, что строка отправляется в микроконтроллер и отправляется обратно из микроконтроллера в смартфон посредством подключенного модуля HC-05

 

image11

 

Теперь давайте добавим также обработчик события от таймера, благодаря которому строки из массива будут отправляться в смартфон

 

//-----------------------------------------------

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  if(htim==&htim2)

  {

    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

    HAL_UART_Transmit(&huart2,(uint8_t*)str2[i],strlen(str2[i]),0x1000);

    i++;

    if(i>4)

    {

      i=0;

    }

  }

}

//-----------------------------------------------

/* USER CODE END 4 */

 

Соберём в очередной раз код и прошьём контроллер. После этого строки приблизительно раз в 2 секунды из нашего контроллера по интерфейсу bluetooth будут приходить в окно терминальной программе на смартфоне

 

image12

 

Отлично! Строки приходят, причём за период в 2 секунды контроллер может выполнять любые операции благодаря использованию прерывания от таймера. проверим это, нажимая на нашу кнопку со строкой в терминальной программе смартфона. Если всё нормально, то строки, посланные по кнопке, должны эхаться практически мгновенно, не дожидаясь вывода следующей строки из МК

 

image13

 

Так и есть, мы можем сколько угодно отправлять данные и они не уходят ни в какую очередь, процесс работает мгновенно.

Таким образом, мы за столь короткий урок научились подключать модуль bluetooth HC-05 к микроконтроллеру, принимать и отправлять данные из контроллера и в контроллер другим устройствам с поддержкой bluetooth, в частности, смартфону.

Спасибо всем за внимание!

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Модуль bluetooth HC-05 можно купить здесь bluetooth HC-05

Отладочную плату можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM Подключаем bluetooth-модуль HC-05

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*