NRF24L01 + LowPower(реализация приёма и передачи на одном модуле NRF24L01)

Нет ответов
tobsik
tobsik аватар
Offline
Зарегистрирован: 13.03.2019

Всем привет!. Прошу указать на ошибки и косяки в коде.

есть ардуино 1: включается, опрашивает датчики, отправляет через NRF24L01, засыпает, просыпается, проверяет изменились ли показания датчиков и предшествующие значения(если изменились - отправить новые значения) 

Ардуино 2: включается, ожидает и  принимает данные. 

не получается реализовать: ардуино 2 включается, отправляет команду на ардуино1 опросить датчики и отправить, начинает ожидать данные. 

Код передатчика:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Wire.h>
#include "LowPower.h"
//#define RADAR_DEBUG 1
#define PIN_RAIN_SENSOR 0
/////////////////////////////////////////////////////////////////////////
int WaitCount = 10;
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
//////////////////////////////////////////////////////////////////////////
RF24 radio(9, 10);
Adafruit_BME280 bme;
//////////////////////////////////////////////////////////////////////////
struct package
{
  int temperature;
  int pressure;
  int humidity;
  bool enabled;
  int rain;
  bool check;
};
typedef struct package Package;
Package data;
////////////////////////////////////////////////////////////////////////
int t;
int h;
int p;
int dataReceived;
//////////////////////////////////////////////////////////////////////
void setup() {
#ifdef RADAR_DEBUG
  Serial.begin(115200);
#endif
  radio.begin();
  pinMode(PIN_RAIN_SENSOR, INPUT);
#ifdef RADAR_DEBUG
  Serial.println("Power Up");
#endif
  radio.setChannel(0x6e);
  radio.setDataRate     (RF24_1MBPS);
  radio.setPALevel      (RF24_PA_HIGH);
  radio.openWritingPipe(pipes[1]); // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем канал приема
  delay(1000);
  if (!bme.begin())
  {
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
#ifdef RADAR_DEBUG
  Serial.print("--- Wireless Weather Station ---\n");
  Serial.print("Temperature = ");
  Serial.print(bme.readTemperature());
  Serial.println(" ºC");
  Serial.print("Pressure = ");
  Serial.print(bme.readPressure() / 133.32239F); // 100 Pa = 1 millibar
  Serial.println(" mmHg");
  Serial.print("Humidity = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");
  Serial.print("rain = ");
  Serial.println(analogRead(PIN_RAIN_SENSOR));
  Serial.print("--------------------------------\n\n");
#endif
  readSensor();
  radio.write(&data, sizeof(data));
#ifdef RADAR_DEBUG
  Serial.println("radio send");
#endif
  t = int(bme.readTemperature());
  p = int(bme.readPressure()) / 133.32239F;
  h = int(bme.readHumidity());
  radio.powerDown();
#ifdef RADAR_DEBUG
  Serial.println("radio down");
#endif
}

void loop() {
  getWeather(); // отправляем погоду после сна
  getData();
  sleep();


}

void sleep() {

  for (byte i = 0; i <= WaitCount; i++) {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // уходим спать
  }

}


void readSensor() {
  if (!bme.begin())
  {
#ifdef RADAR_DEBUG
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
#endif
    data.enabled = false;
  } else {
    data.humidity = bme.readHumidity();
    data.temperature = bme.readTemperature();
    data.pressure = bme.readPressure() / 133.32239F;;
    data.rain = analogRead(PIN_RAIN_SENSOR);
    data.enabled = true;
  }
}

void getWeather() {
  int tt;
  int hh;
  int pp;
  tt = int(bme.readTemperature());
  pp = int(bme.readPressure() / 133.32239F);
  hh = int(bme.readHumidity());

  if (tt != t || pp != p || hh != h ) {
    radio.powerUp();
#ifdef RADAR_DEBUG
    Serial.println(t);
    Serial.println(tt);
    Serial.println(p);
    Serial.println(pp);
    Serial.println(h);
    Serial.println(hh);
    Serial.println("Radio PowerUP");
#endif
    readSensor();
    radio.write(&data, sizeof(data));
    t = tt;
    p = pp;
    h = hh;
    radio.powerDown();
  }
}

void getData() {
#ifdef RADAR_DEBUG
  Serial.println("check data");
#endif
  radio.startListening  ();
  delay(800);
#ifdef RADAR_DEBUG
  Serial.println("open radio");
#endif
  if ( radio.available() ) {
#ifdef RADAR_DEBUG
    Serial.println("data wait");
#endif
    radio.read(&dataReceived, sizeof(dataReceived) );
    if (dataReceived == 1) {
      radio.stopListening  ();
#ifdef RADAR_DEBUG
      Serial.println("data ok");

#endif
      getWeather();
      delay (1000);
    }
  } else {
    radio.stopListening  ();


  }



}

Код приёмника

#include <SPI.h>          // библиотека для работы с шиной SPI
#include "nRF24L01.h"     // библиотека радиомодуля
#include "RF24.h"
RF24 radio(7, 8);
int dataReceived;
struct package
{
  int temperature;
  int pressure;
  int humidity;
  bool enabled;
  int rain;
  bool check;
};
typedef struct package Package;
Package data;
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
void setup() {
  Serial.begin(115200);
  radio.begin();
  radio.setChannel(0x6e);
  radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
  radio.setPALevel      (RF24_PA_HIGH);
  radio.openWritingPipe(pipes[1]); // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем канал приема

  SendCheck();
}

void loop() {

  if (radio.available()) {
    radio.read(&data, sizeof(data));
    Serial.println((String)"Температура: " + data.temperature + " \t\t Давление: " + data.pressure + " \t\t Влажность: " + data.humidity );
    if (data.enabled == true ) {
      Serial.println("Sensor OK");
    } else {
      Serial.println("Sensor not found");
    }
    // Serial.println("$");
    // Serial.println(int(data.temperature));
    // Serial.println(" ");
    // Serial.println(int(data.humidity));
    // Serial.println(" ");
    /// Serial.println(int(data.pressure));
    //Serial.println(";");

  }

}
void SendCheck() {
  Serial.println((String)"start");
  dataReceived = 1;
  radio.stopListening();
  Serial.println((String)"stop listen");
  Serial.println((String)"OpenWrite");
  radio.write(&dataReceived, sizeof(dataReceived));
  Serial.println((String)"SendData");
  radio.startListening  ();
  Serial.println((String)"StartListen");
  if (radio.available()) {
    radio.read(&data, sizeof(data));
    Serial.println((String)"Температура: " + data.temperature + " \t\t Давление: " + data.pressure + " \t\t Влажность: " + data.humidity );
    if (data.enabled == true ) {
      Serial.println("Sensor OK");
    } else {
      Serial.println("Sensor not found");
    }
  }
}