NRF24L01 + LowPower(реализация приёма и передачи на одном модуле NRF24L01)
- Войдите на сайт для отправки комментариев
Чт, 04/04/2019 - 00:26
Всем привет!. Прошу указать на ошибки и косяки в коде.
есть ардуино 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");
}
}
}