STM Урок 109. NRF24L01. Передаём влажность и температуру с датчика DHT22



В уроке 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+ без антенны можно купить здесь (целых 4 штуки) NRF24L01+

Адаптер для NRF24L01 можно купить здесь (5 штук) Адаптер для NRF24L01

Датчик температуры и влажности можно приобрести здесь DHT22

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

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

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

Индикатор светодиодный семиразрядный с драйвером MAX7219

 

 

 

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

 

STM NRF24L01. Передаём влажность и температуру с датчика DHT22

Один комментарий на “STM Урок 109. NRF24L01. Передаём влажность и температуру с датчика DHT22
  1. Михаил:

    Здравствуйте! спасибо за ваши уроки.
    Возник вопрос по данным модулям — длина связи около метра, дальше не берет.
    Пробовал: менять каналы, менять местами модули, промыл модули спиртом, по входу питания 100 мкф электролиты. В чем может быть причина такого «короткого» радиуса действия??

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

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

*