• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Transmisja danych nrf24l01 z Arduino pro mini 3.3V do ESP32 wrom-32
#1
Cześć.

Próbuję zastąpić centralkę Arduino mega z dodatkowym internet shield mniejszym rozwiązaniem na ESP32 wroom-32, ale niestety rozsypują mi się odebrane dane.

Opis funkcjonalności w skrócie:
Pomiar temperatury i wilgotności na Arduino pro mini 3.3V 8Mhz przekazuje po nrf24L01 dane do centralki na Arduino mega z podpiętym internet shield (wystawienie danych do Home Assistanta).

Przekazywane dane:
Kod:
typedef struct {
  int unit_id;        // Sensor unit ID UNIT_ID.
  char parameter[4];  // Measurement parameter name.
  float value;        // Measurement value.
} myData;

Problem:
Bazując na tym samym kodzie (oczywiście zmieniają się piny dla rnf24 w zależności od płytki):
Arduino pro mini -> Arduino Mega - dane odebrane poprawnie;
Arduino pro mini -> ESP32 wroom-32 - dane niepoprawne (poniżej screen);
ESP8266 -> ESP32 wroom-32 - dane odebrane poprawnie.

Załącznik (screen z monitora):
   

Opis załącznika:odbiornik na ESP32 wroom-32;
nadajnik ESP 8266 przykładowa linijka "unit 9: esp|1.00"
nadajnik Arduino pro mini przykładowa linijka "unit 1918959625: d|0.00".

Tak jakby typedef struct był różny dla Arduino i dla ESP :/

Poniżej testowy kod:

Nadajnik:
Kod:
#include <RF24.h>
#include <SPI.h>

const int UNIT_ID  = 9;
typedef struct {
  int unit_id;        // Sensor unit ID UNIT_ID.
  char parameter[4];  // Measurement parameter name.
  float value;        // Measurement value.
} myData;
const uint64_t address_center = 0xF9A3F7BBE00L;
RF24 radio(2, 4);  // ESP2866
//RF24 radio(9, 10);  // Arduino pro mini 3.3V
int counter = 0;

void setup()
{
  Serial.begin(115200);

  // Radio initialize.
  radio.begin();
  radio.setPALevel(RF24_PA_HIGH);    // RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH or RF24_PA_MAX.
  radio.setChannel(108);              // Above most Wifi Channels.
  radio.setDataRate(RF24_250KBPS);    // RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
  radio.openWritingPipe(address_center);
  radio.stopListening();
//  radio.printDetails();
}

void loop()
{
  counter++;
  postData("esp", counter);
  delay(5000);
}

bool postData(char* parameter, float value)
{
  // Prepare data to send.
  myData post_data;
  post_data.unit_id = UNIT_ID;
  strncpy(post_data.parameter, parameter, sizeof(post_data.parameter));
  post_data.value = value;

  bool result = radio.write(&post_data, sizeof(myData));
  if (result)
  {
    return true;
  }
  return false;
}


Odbiornik:
Kod:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

/**
* Receiver nRF24L01 settings.
*/
RF24 radio(4, 5); // CE, CSN
const uint64_t address_getway    = 0xF9A3F7BBE00L;

/**
* Data structure received from sensors.
*/
struct unitDataStructure {
  int id;
  char parameter[4];
  float value;
};

/**
* --------------- ARDUINO BASIC FUNCTIONS ---------------
*/
void setup() {
  Serial.begin(115200);

  // Initialize RF24 Radio.
  radio.begin();
//  radio.setRetries(15, 10);          // optionally, increase the delay between retries & #  of retries
  radio.setPALevel(RF24_PA_HIGH);      // RF24_PA_MIN or RF24_PA_MAX
  radio.setChannel(108);              // Above most Wifi Channels
  radio.setDataRate(RF24_250KBPS);    // RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
//  radio.setAutoAck(1);
  radio.openReadingPipe(1, address_getway);
  radio.startListening();
  radio.printDetails();
}

void loop() {

  // Declare clean received data variable from sensors.
  unitDataStructure unitData;

  // Receives radio data.
  if ( radio.available() ) {
    radio.read(&unitData, sizeof(unitDataStructure));
    Serial.println("<- unit " + String(unitData.id) + ": " + String(unitData.parameter) + "|" + String(unitData.value));
  }
}

Pytanie: Co przeoczyłem i co poprawić żeby dane z Arduino pro mini do ESP32 były kompatybilne?

Dodam, że próbowałem różnych bibliotek nrf24 (instalowanej z bibliotek Arduino IDE i z github-ów) łącznie z software SPI; efekt wciąż ten sam.
 
Odpowiedź
#2
int unit_id; - to nie jest jednoznaczne określenie zmiennej, dla AVR int jest 16 bit, dla ESP32 jest 32 bit. Użyj zmiennej typu int32_t albo int16_t w obu.
 
Odpowiedź
#3
Tak, dzięki kaczakat. Typ zmiennej okazał się częścią rozwiązania. Dodatkowo problem był w przesunięciu.

Jako rozwiązanie, po stronie odbiornika (ESP32) użyłem
Kod:
struct unitDataStructure {
int8_t id;
char parameter[4];
float value;
} attribute((packed, aligned(1)));

a po stronie nadajnika
Kod:
struct unitDataStructure {
int8_t id;
char parameter[4];
float value;
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości