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ła – ESP32 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);
}
}