• STM32 NRF24L01 Sensor Node with ESP32 NRF24L01 Gateway

QC

STM32 NRF24L01 Sensor Node with ESP32 NRF24L01 Gateway

 

STM32 NRF24L01 Sensor Node with ESP32 NRF24L01 Gateway

Nút cảm biến STM32 NRF24L01 với cổng ESP32 NRF24L01

Tổng quát

Trong dự án này, chúng tôi sẽ theo dõi dữ liệu cảm biến không dây bằng cách sử dụng Bo mạch NRF24L01 STM32 & Mô-đun Wifi ESP32. Đầu tiên chúng ta sẽ tạo một Nút cảm biến không dây. Một nút cảm biến được tạo thành từ bốn thành phần cơ bản như bộ phận cảm biến, bộ xử lý, bộ thu phát và bộ nguồn. Bộ phận Cảm biến có thể được tạo thành từ bất kỳ Bộ cảm biến nào. Tôi đang sử dụng Cảm biến áp suất khí quyển BME280. Đơn vị xử lý là Vi điều khiển STM32F103C và đơn vị thu phát là Mô-đun thu phát không dây NRF24L01 2,4 GHz hoạt động như một đơn vị phát. Trong khi xem xét đơn vị nguồn, thiết bị có thể được cấp nguồn bằng Pin Lithium-Ion 3.7V.

Chúng tôi sẽ tạo Cổng Wifi bằng Mô-đun Wifi ESP32 & Mô-đun NRF24L01. Cổng kết nối IoT thực hiện một số chức năng quan trọng từ dịch giao thức đến mã hóa, xử lý, quản lý và lọc dữ liệu. Nếu bạn tưởng tượng về một hệ sinh thái IoT, một cổng kết nối nằm giữa các thiết bị và cảm biến để giao tiếp với đám mây. Trong dự án này, cổng thu thập dữ liệu cảm biến từ nhiều nút cảm biến và sử dụng mạng wifi, cổng này tải dữ liệu lên đám mây. Máy chủ đám mây mà chúng tôi đang sử dụng ở đây là Máy chủ Thingspeak. ThingSpeak là một ứng dụng và API Internet of Things mã nguồn mở để lưu trữ và truy xuất dữ liệu từ mọi thứ bằng cách sử dụng giao thức HTTP và MQTT qua Internet hoặc qua Mạng cục bộ.

Trong một dự án trước đây của chúng tôi, chúng tôi đã tạo một cổng bằng cách sử dụng ESP8266 & NRF24L01 & Nút cảm biến bằng Arduino & NRF24L01. Bạn có thể kiểm tra dự án tại đây: NRF24L01 Gateway + Node


Bill of Materials

Tất cả các thành phần cần thiết để tạo cổng và nút cảm biến được liệt kê bên dưới. Bạn có thể mua tất cả các thành phần từ Amazon.

S.N.COMPONENTS NAMEDESCRIPTIONQUANTITY
1ESP32 BoardESP-WROOM-32 ESP-32S Development Board1
2STM32 MicrocontrollerSTM32F103C Bluepill Board2
3NRF24L01NRF24L01+PA+LNA2
4Barometric Pressure SensorBME2801
5Power Supply5V DC Adapter or 3.7V Battery2
6Connecting WiresJumper Wires20
7Breadboard-1

NRF24L01 Module


NRF24L01 là một mô-đun thu phát không dây, tức là mỗi mô-đun đều có thể gửi và nhận dữ liệu. Nó hoạt động trong tần số 2,4GHz. Tần số này thuộc băng tần ISM và được sử dụng hợp pháp ở hầu hết các quốc gia cho các dự án kỹ thuật. Các mô-đun khi hoạt động hiệu quả có thể bao phủ khoảng cách 100 mét.

Mô-đun hoạt động ở 3.3V nhưng chân SPI của nó có thể chịu được 5V. Mỗi mô-đun có dải địa chỉ là 125 và mỗi mô-đun có thể giao tiếp với 6 mô-đun khác do đó có thể thiết lập mạng lưới với mô-đun này. Mô-đun NRF24L01 hoạt động với sự trợ giúp của giao tiếp SPI do đó bạn có thể sử dụng NRF24L01 với bất kỳ bộ vi điều khiển nào có Chân SPI như Bảng mạch STM32 hoặc Arduino.

Sensor Node Using NRF24L01 & STM32F103C

Hãy để chúng tôi xem mạch Node cảm biến. Chúng ta có thể sử dụng bất kỳ vi điều khiển nào có NRF24L01 để thiết kế Nút cảm biến. Ví dụ, STM32F103C Bluepill Board là lựa chọn tốt nhất. Ngoài bộ vi điều khiển, bạn có thể sử dụng bất kỳ cảm biến nào và giao diện nó với STM32 Board. Tôi thích Cảm biến áp suất khí quyển BME280 cho mục đích trình diễn.

Kết nối giữa Bo mạch STM32F103C, Mô-đun thu phát không dây NRF24L01 & Cảm biến BME280 được đưa ra bên dưới.


NRF24L01 VCC ………………………………………… 3.3V of STM32F103C
NRF24L01 CSN ………………………………………… PA4 of STM32F103C
NRF24L01 MOSI ………………………………………… PA7 of STM32F103C
NRF24L01 GND ………………………………………… GND of STM32F103C
NRF24L01 CE ………………………………………… PB0 of STM32F103C
NRF24L01 SCK ………………………………………… PA5 of STM32F103C
NRF24L01 MISO ………………………………………… PA6 of STM32F103C

Bạn cũng có thể thiết kế mạch Người gửi và Người nhận đơn giản với một cặp Bo mạch NRF24L01 & STM32. Kiểm tra nó ở đây: Giao diện mô-đun thu phát NRF24L01 với STM32.

WiFi Gateway Using NRF24L01 & ESP32

Cổng nhận dữ liệu từ một hoặc nhiều nút cảm biến bằng cách sử dụng Mô-đun thu phát NRF24L01. Sau khi nhận dữ liệu nó sẽ tải dữ liệu lên Server. Để thiết lập kết nối với Máy chủ, Mạng WiFi có thể được sử dụng. ESP32 cùng với NRF24L01 được ưu tiên tốt nhất để thiết kế Cổng WiFi.

Kết nối giữa Bo mạch ESP32 & Mô-đun thu phát không dây NRF24L01 được đưa ra bên dưới

NRF24L01 VCC ………………………………………… 3.3V of ESP32
NRF24L01 CSN ………………………………………… D5 of ESP32
NRF24L01 MOSI ………………………………………… D23 of ESP32
NRF24L01 GND ………………………………………… GND of ESP32
NRF24L01 CE ………………………………………… D4 of ESP32
NRF24L01 SCK ………………………………………… D18 of ESP32
NRF24L01 MISO ………………………………………… D19 of ESP32

Library Installation

1. Thư viện BME280
Thư viện BME280 cung cấp một thư viện để đọc và giải thích dữ liệu cảm biến môi trường Bosch BME280 qua I2C, SPI hoặc Sw SPI. Nó đọc nhiệt độ, độ ẩm và áp suất bằng cách bao gồm các tính toán về môi trường.
2. Thư viện NRF24L01
Bảng STM32 không hỗ trợ Thư viện RadioHead nRF24L01 (#include <RH_NRF24.h>). Do đó, chúng ta cần sử dụng Thư viện RF24. Thư viện này được thiết kế để tuân thủ tối đa hoạt động dự kiến của chip & được xây dựng dựa trên thư viện SPI tiêu chuẩn. Bạn có thể tải xuống thư viện từ liên kết Github sau đây. Thêm thư viện vào Arduino IDE.



Setting Up Thingspeak Server

ThingSpeak là một dịch vụ nền tảng phân tích IoT cho phép bạn tổng hợp, trực quan hóa và phân tích các luồng dữ liệu trực tiếp trên đám mây. Bạn có thể gửi dữ liệu tới ThingSpeak từ thiết bị của mình, tạo trực quan tức thì về dữ liệu trực tiếp và gửi cảnh báo.

Chúng ta cần thiết lập bảng điều khiển Thingspeak để nhận dữ liệu và hiển thị ở định dạng đồ họa. Bạn có thể truy cập Thingspeak và tạo tài khoản tại đây.

Tạo một kênh mới với các thông số sau như được hiển thị trong hình ảnh bên dưới. Sau khi điền tất cả các chi tiết này, hãy nhấp vào kênh Lưu.


Đi tới Khóa API và sao chép Khóa API. Khóa API là bắt buộc trong Mã cổng.




Source Code/Program for Sensor Node


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <nRF24L01.h>
#include <RF24.h>
 
RF24 radio(PB0, PA4); // CE, CSN on Blue Pill
const uint64_t address = 0xF0F0F0F0E1LL;
int counter = 0;
 
 
float temperature;
float humidity;
float altitude;
float pressure;
 
#define SEALEVELPRESSURE_HPA (1013.25)
 
Adafruit_BME280 bme;
 
struct MyData
{
  int counter;
  float temperature;
  float humidity;
  float altitude;
  float pressure;
};
MyData data;
 
void setup()
{
Serial.begin(115200);
radio.begin();                  //Starting the Wireless communication
radio.openWritingPipe(address); //Setting the address where we will send the data
radio.setPALevel(RF24_PA_MIN);  //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
radio.stopListening();          //This sets the module as transmitter
 
if (!bme.begin(0x76))
{
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
 
}
 
void loop()
{
  data.counter = counter;
  data.temperature = bme.readTemperature();
  data.pressure = bme.readPressure() / 100.0F;
  data.altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
  data.humidity = bme.readHumidity();
  
  Serial.print("Packet No. = ");
  Serial.println(data.counter);
  
  Serial.print("Temperature = ");
  Serial.print(data.temperature);
  Serial.println("*C");
 
  Serial.print("Pressure = ");
  Serial.print(data.pressure);
  Serial.println("hPa");
 
  Serial.print("Approx. Altitude = ");
  Serial.print(data.altitude);
  Serial.println("m");
 
  Serial.print("Humidity = ");
  Serial.print(data.humidity);
  Serial.println("%");
 
  Serial.println();
  
  radio.write(&data, sizeof(MyData));
  
  Serial.println("Data Packet Sent");
  Serial.println("");
  
  counter++;
  delay(5000);
}

Source Code/Program for ESP32 Wifi Gateway

Trước khi tải mã lên, hãy thực hiện các thay đổi đối với SSID và mật khẩu Wifi. Đồng thời thay thế Khóa API Thingspeak bằng Khóa API của riêng bạn.
#include <WiFi.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
 
String apiKey = "C25ICK6FHOR7PST4";
 
const char* ssid = "Alexahome";
const char* password = "loranthus";
 
const char* server = "api.thingspeak.com";
 
RF24 radio(4, 5);
const uint64_t address = 0xF0F0F0F0E1LL;
 
struct MyData
{
  int counter;
  float temperature;
  float humidity;
  float altitude;
  float pressure;
};
MyData data;
 
WiFiClient client;
 
void setup()
{
  Serial.begin(115200);
  radio.begin();
  
 
  Serial.println("Receiver Started....");
  Serial.print("Connecting to ");
  Serial.println(ssid);
  Serial.println();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  radio.openReadingPipe(0, address);   //Setting the address at which we will receive the data
  radio.setPALevel(RF24_PA_MIN);       //You can set this as minimum or maximum depending on the distance between the transmitter and receiver.
  radio.startListening();              //This sets the module as receiver
}
 
int recvData()
{
  if ( radio.available() )
  {
    radio.read(&data, sizeof(MyData));
    return 1;
    }
    return 0;
}
 
 
void loop()
{
  if(recvData())
  {
 
  Serial.println("Data Received:");
  Serial.print("Packet No. = ");
  Serial.println(data.counter);
  
  Serial.print("Temperature = ");
  Serial.print(data.temperature);
  Serial.println("*C");
 
  Serial.print("Pressure = ");
  Serial.print(data.pressure);
  Serial.println("hPa");
 
  Serial.print("Approx. Altitude = ");
  Serial.print(data.altitude);
  Serial.println("m");
 
  Serial.print("Humidity = ");
  Serial.print(data.humidity);
  Serial.println("%");
 
  Serial.println();
 
  if (client.connect(server, 80))
  {
        String postStr = apiKey;
        postStr += "&field1=";
        postStr += String(data.temperature);
        postStr += "&field2=";
        postStr += String(data.pressure);
        postStr += "&field3=";
        postStr += String(data.altitude);
        postStr += "&field4=";
        postStr += String(data.humidity);
        postStr += "\r\n\r\n\r\n\r\n";
        
        client.print("POST /update HTTP/1.1\n");
        client.print("Host: api.thingspeak.com\n");
        client.print("Connection: close\n");
        client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(postStr.length());
        client.print("\n\n");
        client.print(postStr);
        delay(1000);
        Serial.println("Data Sent to Server");
      }
        client.stop();
  }
}

Result: ESP32+ NRF24L01 Wifi Gateway with STM32+ NRF24L01 Node


Sau khi lắp ráp Nút cảm biến & Cổng vào trên bảng mạch, bạn có thể tải các mã trên lên các nút tương ứng.

Ngay sau khi mã được tải lên, bạn có thể mở Serial Monitor tương ứng.

Dữ liệu cảm biến BME280 từ Bộ phát được nhận bởi Bộ thu / Cổng. Gateway hiển thị dữ liệu nhận được như nhiệt độ, độ ẩm, áp suất và độ cao trên Serial Monitor.


Tương tự, bạn có thể giám sát dữ liệu trực tuyến trên Thingspeak Server. Để làm điều đó, hãy chuyển đến chế độ xem riêng tư của Máy chủ Thingspeak. Dữ liệu sẽ được đăng nhập sau khoảng thời gian 15 giây. Để làm cho thiết bị tốt hơn, bạn có thể triển khai tính năng Chế độ ngủ và thay đổi Khoảng thời gian gửi dữ liệu.








Hex

 :020000040800F2 :10000000000003200D3700085D3700085D37000849 :100010005D3700085D3700085D3700085D37000870 :100020000000000000000000000000005D...