Как передать значения float датчика через модуль NRF24L01?

Я пытаюсь выяснить, как передать четыре значения датчиков: напряжение, ток, мощность и потребление, но я не могу этого сделать. Тем не менее, мой синтаксис верен... что я упускаю?

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

#define ACS712 A0

int lastData = 0;
int dataSum = 0;
int Count = 0;

float Voltage;
float Current;
float Power;
float kWh;
float Consumption;
String Data;

float vpc = 4.882813; // approx. voltage per count

RF24 radio(9, 10); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};

void setup() {
  Serial.begin(115200);
  pinMode(13, OUTPUT);
  radio.begin();
  radio.openWritingPipe(addresses[1]); // 00001
  radio.openReadingPipe(1, addresses[0]); // 00002
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {

  radio.stopListening();

  if (millis() > lastData + 1) {
    dataSum += sq(analogRead(ACS712) - 512);
    Count++;

    lastData = millis();
  }
  // If statement to make calculations.
  if (Count == 1000) {

    // To get the RMS of the data.
    float mean = dataSum / Count;
    float value = sqrt(mean);

    // To get the Voltage (in volts) consumed.
    float Voltage = value * vpc;

    // To get the Current (in amps) consumed.
    float Current = Voltage / 66;

    // To get the Power (in watts) consumed.
    float Power = Current * 240;

    float kWh = Power / 1000;
    float Consumption = kWh;

    dataSum = 0;
    Count = 0;

    Data += F("\nVoltage: ");
    Data += String(Voltage, 3);
    Data += F("\nCurrent: ");
    Data += String(Current, 3);
    Data += F("\nPower: ");
    Data += String(Power, 3);
    Data += F("\nConsumption: ");
    Data += String(Consumption, 3);
    //Serial.println(Data);

    radio.write(&Data, sizeof(Data));
    if (radio.write(&Data, sizeof(Data)) && true) {
      Serial.println("Sent!");
    } else {
      Serial.println("Failed!");
    };
    delay(10);
  }
}

, 👍1

Обсуждение

`Я не в состоянии сделать это " бессмысленно ..... ясное описание наблюдаемых результатов имеет смысл, @jsotola

Подсказка: Каков максимальный размер полезной нагрузки? И что будет передано для radio.write(&Data, sizeof(Data)), строкового объекта или его значения?, @Mikael Patel

Вы пробовали отправлять командные значения вместо строковых? Например, отправьте "0x01" для напряжения, "0x02" для тока и т. Д. Таким образом, вы не отправляете строки (которые в встроенном программировании вы действительно не должны использовать!!) и уменьшит передаваемые данные., @Tom

Почему бы просто не отправить напряжение и не сделать все эти вычисления на приемнике, так как есть только базовое деление/умножение с заданными константами. Кроме того, сначала попробуйте более простую программу, чтобы заставить радио работать. Удалось ли вам запустить один из примеров скетчей и заставить радио работать?, @Gerben


1 ответ


2

Простая float передача:

Для использования в TX

float payload = 0.12345;
radio.write(&payload, sizeof(payload));

Для использования в RX

float payload = 0;
radio.read(&payload, sizeof(payload));
,

здесь он хочет передать полную строку, ни одно значение с плавающей точкой, ваш ответ будет применим, если это будет один поплавок, но здесь вопрос касается того, как он может передать полную строку., @Maaz Sk