Arduino mit NRF aus PWR DOWN Modus holen

Moin Leute,

ich würde gerne bei meinem Sensornetzwerk die Nodes Schlafen legen, und erst aufwachen lassen, wenn eine Datenübertragung von der Station kommt.

Ich habe bereits ein Funktionierendes Sensornetzwerk, wo die Nodes permanent auf "Zuhören" stehen, und sobald die Basisstation einen Request sendet, sollen die Nodes aufwachen, ihre Daten senden, und dann wieder einschlafen, damit man das alles gescheit Kabellos in die Ecken stellen kann.

Ich benutze die TMRh20 RF24 Library wo man ja den IRQ-Pin einstellen kann.

Also habe ich "radio.maskIRQ(0, 0, 1)" gesetzt, was ja bedeuted, dass er den IRQ-Pin vom NRF auf LOW zieht, sobald eine payload ankommt. Den IRQ-Pin des NRF habe ich an D2 vom Arduino Mega angeschlossen, und den interrupt 0 ausgewählt.

Der Interrupt funktioniert auch super, wenn der Arduino nur im sleep_mode_idle ist.

Sobald ich den Arduino in den sleep_mode_pwr_down versetze, wacht er nicht mehr durch den Interrupt auf.

Meine vermutung ist ja, dass der Interrupt nur ausgelöst wird, wenn "radio.available" ist. Das kann er ja aber nicht abfragen, wenn er im pwr_down ist, da ja "keinerlei Code mehr auf dem Arduino läuft".

Jetzt weiss ich nicht mehr weiter und hoffe ihr könnt mir irgendwie helfen.

// Büro

#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <RF24.h>
#include <avr/sleep.h>


#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
#define SEALEVELPRESSURE_HPA (1013.25)
#define pong 1
#define id 1

RF24 radio(48, 49); // für Arduino Mega
//RF24 radio(8, 7); // für Arduino Nano/Uno/etc

static const uint64_t pipes[6] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL};

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO,  BME_SCK);

int t;
int h;
int p;
int code;
int LED = 13;

int wakePin = 2;

void wakeUpNow()
{
  digitalWrite(LED, HIGH);
}

void setup()
{
  Serial.begin(9600);
  Serial.println(F("BME280 test"));
  if (!bme.begin()) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  Serial.println(F("passed"));
  radio.begin();
  radio.setChannel(60);                // Funkkanal - Mögliche Werte: 0 - 127
  radio.setAutoAck(0);
  radio.setRetries(15, 0);
  radio.setPALevel(RF24_PA_LOW);
  // RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=dBm
  radio.maskIRQ(0, 0, 1);
  radio.openWritingPipe(pipes[0]);
  radio.openWritingPipe(pipes[1]);
  radio.openWritingPipe(pipes[2]);
  radio.openReadingPipe(1, pipes[1]);
  radio.openReadingPipe(2, pipes[2]);
  radio.openReadingPipe(3, pipes[3]);
  radio.startListening();
  pinMode(LED, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(2), wakeUpNow, CHANGE);
}

void loop()
{
  recieve();
}

void recieve()
{
  if (radio.available()) {
    long got_message[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    bool done = false;
    radio.read(&got_message, sizeof(got_message));
    code = got_message[0];
    if (code == 1337)
    {
      transmit();   // Inhalte senden
    }
  }
}

void transmit()
{
  t = bme.readTemperature() * 1000;
  h = bme.readHumidity();
  p = bme.readPressure() / 100.0F;
  //  Serial.print("Temp: ");
  //  Serial.println(t);
  //  Serial.print("Feuchtigkeit: ");
  //  Serial.println(h);
  //  Serial.print("Druck: ");
  //  Serial.println(p);
  long message[8] = {int(t), int(h), int(p), (pong), (id)};
  radio.stopListening();
  radio.write(&message, sizeof(message));
  radio.maskIRQ(0, 0, 1);
  radio.startListening();
  sleepNow();
  Serial.println("Sent");
}

void sleepNow() {
  set_sleep_mode(SLEEP_MODE_IDLE);   // sleep mode is set here
  sleep_enable();          // enables the sleep bit in the mcucr register
  sleep_mode();            // here the device is actually put to sleep!!
  // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
  sleep_disable();         // first thing after waking from sleep: disable sleep...
}

Hier der Code des Nodes. Was jetzt für eine Payload von der Basisstation ankommt, ist ja erstmal egal.

Den Teil im Code mit dem BME-Sensor könnt ihr euch ja wegdenken.

Gefallen Dir die Antworten im Nachbarforum auf Deine Frage nicht?
Crossposts gelten als unhöflich.

Gruß Tommy