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); } }