В уроке 105 мы научились не просто читать и писать регистры и буферы, а также передавать данные от передатчика к приёмнику, только это был обычный счётчик каких-то неопределённых тиков.
А сегодня мы попробуем передать по беспроводной связи с помощью модулей NRF24L01 какие-нибудь осознанные данные. Но так как мы температуру с датчика DS18B20 уже передавали с помощью Bluetooth, то нам это уже будет не так интересно, давайте передадим сразу и влажность и температуру с датчика DHT22, с которым мы с вами познакомились в уроке 107.
Схемы мы все оставим такие же как и в уроке 105, только во-первых мы модуль NRF на передатчике попробуем подключить не через стабилизатор, который был у нас под термоусадкой, а через специально-предназначенный для наших модулей переходник со стабилизатором (нажмите на картинку для увеличения изображения)
И также отличием от схемы вышеуказанного урока будет у нас то, что мы ещё к схеме подключим датчик DHT22. После этого схема передатчика примет следующий вид (нажмите на картинку для увеличения изображения)
Датчик мы подключили точно так же, как и в уроке 107 — информационным входом к ножке PB11.
Сначала займёмся, соответственно передатчиком. Проект мы возьмём из урока 105, предназначенный для передатчика, NRF24_TX и создадим на его основе проект с именем NRF24_TX_DHT22.
Откроем наш проект в Cube MX и включим в нём ножку PB11 на вход
Сгенерируем проект для Keil, откроем его, установим программатор на аторезет, включим уровень оптимизации в 1, подключим файл NRF24.c и попробуем собрать проект. Если всё нормально собралось, то займёмся датчиком температуры. Для этого возьмём из проекта урока 107 DHT22 файлы dht22.h и dht22.c и скопируем их в соответствующие папки нашего проекта. Подключим файл dht22.c к дереву проекта и подключим в файле main.c нашу библиотеку для датчика
#include "NRF24.h"
#include "dht22.h"
Проинициализируем датчик в функции main()
/* USER CODE BEGIN 2 */
port_init();
dht22_init();
NRF24_ini();
Мы не будем посылать значения температуры и влажности. Мы перешлём сырые данные из буфера, в которые датчик отдаст свои значения при считывании.
Поэтому этим мы и займёмся в бесконечном цикле, где предварительно мы удалим весь код. Также мы здесь давайте выведем наши сырые значения, считанные с датчика, в терминальную программу. После всех исправительных процедур код в бесконечном цикле примет следующий вид
/* USER CODE BEGIN 3 */
if(dht22_GetData(buf1))
{
sprintf(str1,"dt: %02X:%02X:%02X:%02X:%02X\r\n",buf1[4],buf1[3],buf1[2],buf1[1],buf1[0]);
HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000);
NRF24L01_Send(buf1);
}
HAL_Delay(2000);
/*
Также удалим из функции main() все наши локальные переменные, они нам теперь не потребуются
uint8_t retr_cnt, dt;
uint16_t i=1,retr_cnt_full;
Соберём код, прошьём контроллер и посмотрим результат нашей работы пока в терминальной программе, так как в приёмном индикаторе будет непонятно что, мы код приёмника ещё не исправляли
Отлично! Датчик работает. Теперь займёмся приёмником. Для этого мы запитаем контроллер передатчика от автономного источника, а плату приёмника, наоборот подключим к ПК.
Проект для приёмника также используем из урока 105 NRF24_RX_DHT22. Назовём его теперь NRF24_RX_DHT22.
Только файлы max7219.c и max7219.h в нём заменим, скопировав их проекта DHT22 урока 107, так как там мы добавили функции для вывода значений с плавающей точкой на индикатор.
Откроем проект в Cube MX и, ничего не трогая в нём, сгенерируем проект для Keil, откроем его, настроим программатор на авторезет, уровень оптимизации выставим в 1, подключим файлы NRF24.c и max7219.c к дереву проекта.
Попробуем собрать проект. Только он вряд ли соберётся, потому что восьмиразрядный индикатор мы подключали к другому контроллеру. Поэтому идём в файл max7219.h и исправим там подключение библиотеки
#include "stm32f4xx_hal.h"
Теперь идём в файл max7219.c и исправим там подключение хендла шины SPI
extern SPI_HandleTypeDef hspi3;
Также исправим это в функции Send_7219
HAL_SPI_Transmit (&hspi3, (uint8_t*)aTxBuf, 1, 5000);
aTxBuf[0]=dt;
HAL_SPI_Transmit (&hspi3, (uint8_t*)aTxBuf, 1, 5000);
Не забываем также о ножке Chip Select. Она у нас тоже другая. Если мы её не исправим, то проект-то соберётся, но работать индикатор не будет
#define cs_set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET)
#define cs_reset() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET)
Вот теперь проект должен будет собраться. Если всё нормально собралось то идём в файл NRF24.c и внесём некоторые исправления в функцию приёма пакета NRF24L01_Receive, так как здесь нам нужно будет преобразовать пришедшие сырые байты пакета в значения температуры и влажности. Это мы уже делали в уроке по датчику DHT22, поэтому, думаю труда особого это не составит.
Уберём из данной функции объявление вот этой локальной переменной
uint16_t dt=0;
Добавим в другие локальные переменные для влажности и температуры
uint8_t status=0x01;
float temper, hum;
Удалим из функции вот эти строки
dt = *(int16_t*)RX_BUF;
Clear_7219();
Number_7219(dt);
dt = *(int16_t*)(RX_BUF+2);
NumberL_7219(dt);
Вместо них теперь будет вот такой код
temper = (float)((*(uint16_t*)(RX_BUF+1)) & 0x7FFF) / 10;
if((*(uint16_t*)(RX_BUF+1)) & 0x8000) temper *= -1.0;
hum = (float)(*(int16_t*)(RX_BUF+3)) / 10;
Clear_7219();
NumberLF_7219(hum);
NumberF_7219(temper);
Код практически совпадает с кодом из бесконечного цикла функции main() урока по датчику, поэтому объяснение ему не требуется.
Соберём код, прошьём контроллер и посмотрим результат на индикаторе приёмника
Отлично! У нас всё передаётся и отображается корректно.
Ну и конечно же я не удержался, вынес датчик приёмника на улицу и измерил отрицательную температуру (нажмите на картинку для увеличения изображения)
А вот так вот полностью выглядит теперь вся наша схема (нажмите на картинку для увеличения изображения)
Таким образом, в данном уроке мы научились передавать посредством модулей передачи данных по беспроводной связи NRF24L01 не просто строки либо какие-то не несущие полезной информации данные, а вполне осознанные данные, которые могут потребоваться на практике — в нашем случае значения влажности и температуры с датчика DHT22, подключенного к схеме приёмника.
Всем спасибо за внимание!
Предыдущий урок Программирование МК STM32 Следующий урок
Модуль NRF24L01+ с антенной можно купить здесь NRF24L01+
Модуль NRF24L01+ без антенны можно купить здесь NRF24L01+
Адаптер для NRF24L01 можно купить здесь (5 штук) Адаптер для NRF24L01
Датчик температуры и влажности можно приобрести здесь DHT22
Отладочную плату можно приобрести здесь Nucleo STM32F401RE
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Индикатор светодиодный восьмиразрядный с драйвером MAX7219
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Здравствуйте! спасибо за ваши уроки.
Возник вопрос по данным модулям — длина связи около метра, дальше не берет.
Пробовал: менять каналы, менять местами модули, промыл модули спиртом, по входу питания 100 мкф электролиты. В чем может быть причина такого «короткого» радиуса действия??