• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь nrf24lo1 esp-01

xekz

New member
Добрый день. Делаю шлюз nrf24lo1 <-> esp-01.

nrf24lo1 подключена к arduino Nano стандартно. Esp подключается к Nano по Uart.

по Nrf данные отправляются используя вот такую структуру
Код:
typedef struct data {
  int sensor; // проверяемый сенсор
  int value; // значение сенсора
};
data t;
typedef struct ModuleInfo {
  data d[5]; // данные
  char Device[8]; // устройство
  int num_sensor; // количество датчиков на устройстве
};
и для того того чтобы не преобразовывать структуру во что либо другое (например Json , реализация сейчас работает) решил отправлять эту структуру по uart и на стороне esp уже производить разбор данных и отправку на сервер, но возникла проблема на стороне esp не происходит преобразования из uart в struct. если использовать вместо esp Nano то все работает. в чем может быть проблема?

код Nano
Код:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//#include <SoftEasyTransfer.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

typedef struct data {
  int sensor; // проверяемый сенсор
  int value; // значение сенсора
};
data t;
typedef struct ModuleInfo {
  data d[5]; // данные
  char Device[8]; // устройство
  int num_sensor; // количество датчиков на устройстве
};
ModuleInfo mi;

RF24 radio(9, 10); //номера каналов приема и передачи 3,4 pin nrf
const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0A1LL}; // адреса каналов приема и передачи
const uint64_t pipes_send2 = 0xF0F0F0F0A2LL; // адреса каналов приема и передачи

#define ONE_WIRE_BUS 6                             // Data wire is plugged into digital pin 3 on the Arduino

OneWire oneWire(ONE_WIRE_BUS);                     // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);               // Pass our oneWire reference to Dallas Temperature.

//SoftEasyTransfer ET;
// ---------------------------------------- setup ------------------------------------------------ //
void setup() {
  mySerial.begin(9600);
  //  ET.begin(details(mi), &mySerial);
  Wire.begin();
  Serial.begin(57600);
  Serial.println( "Start");
  radio.begin();
  radio.setChannel(120); // Номер канала от 0 до 127
  radio.setRetries(10, 15); // Кол-во попыток и время между попытками
  radio.setPALevel(RF24_PA_MAX); //выходная мощность
  radio.openWritingPipe(pipes[0]); // Открываем канал передачи
  radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
  radio.setPayloadSize(32);
  radio.powerUp();

}

// ---------------------------------------- loop ------------------------------------------------ //
void loop() {
  ModuleInfo uart;
  t.sensor = 22;
  t.value = 4443;
  uart.d[0] = t;
  uart.d[1] = t;
  uart.d[2] = t;
  radio.startListening();
  delay(50);
  strcpy(uart.Device, "Coridor");
  uart.num_sensor = 3;

  int len = sizeof(uart);
  char aux[len];
  memcpy(aux, &uart, len);
 
  mySerial.write((uint8_t *)&aux, len);
  Serial.write((uint8_t *)&aux, len);
  Serial.println();

  delay(5000);

  if (radio.available()) {
    while (radio.available()) {
      radio.read(&mi, sizeof (mi));
    }

    Serial.print("rf24 network available >> ");
    //ET.sendData();
    Serial.println(mi.Device);
    Serial.println();
 
  }
}
код ESP
Код:
typedef struct data {
  int sensor; // проверяемый сенсор
  int value; // значение сенсора
};
typedef struct ModuleInfo {
  data d[5]; // данные
  char Device[8]; // устройство
  int num_sensor; // количество датчиков на устройстве
};
ModuleInfo mi;

// ---------------------------------------- setup ------------------------------------------------ //
void setup() {
  Serial.begin(9600);
  Serial1.begin(57600);
  Serial.println( "Start");
  Serial1.println( "Start");
}
// ---------------------------------------- loop ------------------------------------------------ //
void loop() {
  String str = "";
  if (Serial.available() > 0) {
    str = Serial.readStringUntil('\n');
  } else {
    str = "";
  }

  if (str.length() > 3) {
    int i = str.length();
    Serial1.println(str);
    Serial1.println(i);
    char data[i];
    for (int j = 0; j < i; j++) {
      data[j] = (char) str[j];
    }
    memcpy(&mi, data, sizeof(data));
    Serial1.print( mi.Device);
    Serial1.println();
    for (int k = 0; k < mi.num_sensor; k++) {
      Serial1.println(mi.d[k].sensor);
    }
  }
}
П.С. Arduino IDE 1.6.8
 
Сверху Снизу