ESP32 i nRF24L01, nowa biblioteka

Dzięki artykułowi ze strony IoTSharing i zmodyfikowanej przez autora bibliotece udało mi się skomunikować nRF24 z ESP32 i nawiązać radiowe połączenie z Arduino Nano. Wszystkie połączenia i kody pochodzą z tego artykułu. Wielkie dzięki mister Tuan! Jedyna przeróbka to zmienna pipe, którą używa w kodach autor, a na którą u mnie burzył się kompilator. Zmiana na pip załatwiła sprawę. Poniżej lekko przerobione kody.

POŁĄCZENIE NRF24L01 Z ESP32
POŁĄCZENIE NRF24L01 Z ARDUINO

Arduino_D8      x   NRF24_CSN
Arduino_D7      x   NRF24_CE
Arduino_D13    x   NRF24_SCK
Arduino_D11    x   NRF24_MOSI
Arduino_D12    x   NRF24_MISO

Arduino_3.3      x   NRF24_Vcc
Arduino_GND  x   NRF24_GND

KODY

Arduino wysyłaESP32 odbiera /gist/

W odbiorniku dodałem prostą instrukcję sprawdzającą czy transmisja przebiega prawidłowo. Była mi pomocna przy ustalaniu maksymalnej odległość nadajnika od odbiornika.

Przesyłanie tablicy z danymi typu float

Należy pamiętać, aby ustawić odpowiednią wielkość radio.setPayloadSize(). Albo w ogóle nie ustawiać, wówczas ustawi się maksymalna. Trochę czasu mi zabrało żeby zorientować się dlaczego po skeczu “hello” ucina mi dane w trzyelementowej tablicy float.

// Nadajnik Nano

#include  <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

float msg[3] = {33.33, 66.66, 99.99};

RF24 radio(7,8);
const uint64_t pip = 0xE8E8F0F0E1LL;

void setup(void) {
  Serial.begin(115200);
  radio.begin();
  radio.setChannel(2);
  radio.setPayloadSize(16);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openWritingPipe(pip);
}
void loop(void) {
  Serial.println("send ...");
  radio.write(&msg, sizeof(msg));

  delay(3000);
}
// Odbiornik ESP32

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

const byte DEBUG = false;
float buff[3];

RF24 radio(12, 14, 26, 25, 27);
//RF24 radio(7,8);
const uint64_t pip = 0xE8E8F0F0E1LL;

uint32_t t = 0;
uint32_t t_start = 0;


void setup(void) {
  Serial.begin(115200);
  radio.begin();
  radio.setChannel(2);
  radio.setPayloadSize(16);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openReadingPipe(1, pip);
  radio.startListening();

  t_start = millis();
}

void loop(void) {

  if (radio.available()) {
    radio.read(buff, sizeof(buff));
    
    delay(10);
    Serial.println(buff[0]);
    Serial.println(buff[1]);
    Serial.println(buff[2]);
    if(DEBUG){Serial.println(t);}
    t_start = millis();
  }
  else {
    t = millis() - t_start;
    if(DEBUG){Serial.println(t);
    delay(1000);}
  }

  if (t > 5000) {
    Serial.println("ERROR!");
    delay(1000);
  }
}
LINKI

Dodaj komentarz