Nrf24l01+pa+lna klappt nicht

Hallo zusammen, bitte erschlagt mich nicht für meinen Code. Ich bin komplett neu im Thema Arduino und möchte es mir selbst aneignen mit Youtube Videos, Chat Gpt und Foren. Zu meinem Projekt: Ich möchte einen Sensor in der Pflanze haben, welcher die feuchtigkeit misst und diese einmal am Tag an meine Zentrale sendet. An der Zentrale wird dann der Werte gepüft und an Telegram gesendet. Das klappt auch alles mit den kleinen Funkmodulen ohne externe Antenne. Damit meine Zentrale alle Sender Empfängt wollte ich diese auf ein großes Funkmodul umrüsten. Doch daran scheitere ich. Habe gefühlt alles mögliche bereits probiert.. :(

Zur Hardware:
Empfänger (Zentrale): Wemos D1 Modul / ESP 8266 / Version 2015-08
Antenne: NRF24l01 + pa +lna
Spannungswandler AMS1117 (5v zu 3.3v)
Kompensator 100 yF direkt an Funkmodul

Sender:
Arduino Pro Mini 3.3v 8hz
Antenne: NRF24l01 (kleines Modul ohne externe Antenne)
Kompensator 100 yF direkt an Funkmodul

Nun zu meinen Codes:

Empfänger (Zentrale):

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>

// --- Referenzwerte ---
const int SENSOR_NASS   = 600; // Tropische Pflanzen
const int SENSOR_NORMAL = 650; // Normale Pflanzen
const int SENSOR_TROCKEN = 700; // Trockenliebende Pflanzen

int sensorReference[15]; 

// --- nRF24 Pins ---
RF24 radio(D4, D2);          // CE=D4 ; CSN=D2
const byte address[6] = "00001";

// --- WLAN ---
const char* ssid = "FRITZ!Box 7530 WB";
const char* password = "36956524180193755582";

// --- Telegram ---
const char* botToken = "8725905772:AAEy8p9mWT1VTz6NudtScgDt090cqGXVa8Q"; 
const char* chatID = "8318480983";       

WiFiClientSecure client;  // HTTPS

// --- URL-Encoding Funktion ---
String urlEncode(const String &str) {
  String encoded = "";
  char c;
  char code0;
  char code1;
  for (int i = 0; i < str.length(); i++){
    c = str.charAt(i);
    if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9')) {
      encoded += c;
    } else {
      encoded += '%';
      code0 = (c >> 4) + '0';
      if ((c >> 4) > 9) code0 = (c >> 4) - 10 + 'A';
      code1 = (c & 0x0F) + '0';
      if ((c & 0x0F) > 9) code1 = (c & 0x0F) - 10 + 'A';
      encoded += code0;
      encoded += code1;
    }
  }
  return encoded;
}

void setup() {
  Serial.begin(115200);
  delay(2000);

  // --- Sensor Referenz initialisieren ---
  for (int i=0; i<15; i++) sensorReference[i] = SENSOR_NORMAL; // alle normal

  // --- WLAN verbinden ---
  Serial.print("Verbinde WLAN");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" verbunden!");

  // --- nRF24 initialisieren ---
  if (!radio.begin()) {
    Serial.println("Radio NICHT erkannt!");
    while (1);
  }

  radio.setPALevel(RF24_PA_MIN);
  radio.setDataRate(RF24_250KBPS);
  radio.setChannel(76);
  radio.setAutoAck(false);
  radio.setRetries(0,0);
  radio.openReadingPipe(0, address);
  radio.startListening();

  Serial.println("Radio OK, ready to receive");

  // --- HTTPS: Telegram ---
  client.setInsecure();  // Zertifikatsprüfung deaktiviert
}

void loop() {

  if (radio.available()) {
    uint8_t payload[5];
    radio.read(&payload, sizeof(payload));

    uint8_t senderID = payload[0];
    int16_t value = payload[1] | (payload[2] << 8);
    uint16_t battery = payload[3] | (payload[4] << 8);

    // --- Sender interpretieren ---
    String plantName = "Unbekannt";
    if (senderID == 1) plantName = "Wohnzimmer | Efeutute";
    else if (senderID == 2) plantName = "Ankleidezimmer | Einblatt";
    else if (senderID == 3) plantName = "Pflanze ABC";

    // --- Batterie-Warnung ---
    if (battery < 2700) {
      Serial.println("⚠️ Warnung: Batterie fast leer!");
    }

    // --- Prüfen ob Gießen nötig ---
    int refValue = sensorReference[senderID-1];  // Referenzwert für diesen Sensor
    if (value > refValue) {
      Serial.println("💧 Aktion: Gießen!");
    }

    Serial.print("Empfangen: ");
    Serial.print(value);
    Serial.print(" von ");
    Serial.println(plantName);
    Serial.print("Batterie: ");
    Serial.print(battery);
    Serial.println(" mV");

    // --- Telegram Nachricht senden ---
    if (WiFi.status() == WL_CONNECTED) {

      // --- Batterie Warnung ---
      if (battery < 2700) {
        String message = plantName + " Batterie fast leer!";
        HTTPClient http;
        String url = String("https://api.telegram.org/bot") + botToken + "/sendMessage?chat_id=" + chatID;
        url += "&text=" + urlEncode(message);
        http.begin(client, url);
        int httpCode = http.GET();
        if (httpCode > 0) Serial.println("Telegram Push gesendet!");
        else Serial.println("Push fehlgeschlagen!");
        http.end();
      }

      // --- Gießen nötig ---
      if (value > refValue) {
        String message = plantName + " gießen!";
        HTTPClient http;
        String url = String("https://api.telegram.org/bot") + botToken + "/sendMessage?chat_id=" + chatID;
        url += "&text=" + urlEncode(message);
        http.begin(client, url);
        int httpCode = http.GET();
        if (httpCode > 0) Serial.println("Telegram Push gesendet!");
        else Serial.println("Push fehlgeschlagen!");
        http.end();
      }

    } else {
      Serial.println("WLAN nicht verbunden, kein Telegram Push möglich!");
    }
  }

  delay(8000);  // Push alle 8 Sekunden, kann auf 3600000 = 1 Stunde hochgesetzt werden
}

Sender:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <avr/sleep.h>
#include <avr/wdt.h>

RF24 radio(7, 8);
const byte address[6] = "00001";

const uint8_t sensorPowerPin = 2;
const uint8_t sensorPin = A0;
const uint8_t senderID = 2;

volatile bool wdtTriggered = false;
uint16_t sleepCycles = 0;  // zählt 8s Intervalle

ISR(WDT_vect) {
  wdtTriggered = true;
}

void enterSleep() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_cpu();
  sleep_disable();
}

void setupWatchdog() {
  MCUSR &= ~(1 << WDRF);
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0); // 8 Sekunden
}

void setup() {
  Serial.begin(9600);

  pinMode(sensorPowerPin, OUTPUT);
  digitalWrite(sensorPowerPin, LOW);

  if (!radio.begin()) while(1);

  radio.setPALevel(RF24_PA_LOW);
  radio.setDataRate(RF24_250KBPS);
  radio.setChannel(76);
  radio.setAutoAck(false);
  radio.setRetries(5, 15);
  radio.openWritingPipe(address);
  radio.stopListening();

  setupWatchdog();
}

long readVcc() {
  // ADMUX = 1,1V Bandgap messen gegen Vcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);

  // Warten bis Referenz stabil ist
  delay(2);  

  // erste Messung verwerfen
  ADCSRA |= _BV(ADSC);
  while (ADCSRA & _BV(ADSC));

  // zweite Messung
  ADCSRA |= _BV(ADSC);
  while (ADCSRA & _BV(ADSC));

  uint16_t result = ADC;  // direkt ADC als 16-Bit lesen

  long vcc = 1125300L / result;
  return vcc;  // mV
}

void loop() {

  // 1 Stunde = 3600 Sekunden / 8 Sekunden = 450 Zyklen 10800
  if (sleepCycles >= 10800) {

  long battery = readVcc();

  digitalWrite(sensorPowerPin, HIGH);
  delay(50);

  analogRead(sensorPin);   // ⭐ Dummy
  delay(5);
  int16_t sensorValue = analogRead(sensorPin);

  uint8_t payload[5];
  payload[0] = senderID;
  payload[1] = sensorValue & 0xFF;
  payload[2] = (sensorValue >> 8) & 0xFF;
  payload[3] = battery & 0xFF;
  payload[4] = (battery >> 8) & 0xFF;

  radio.write(&payload, sizeof(payload));

  digitalWrite(sensorPowerPin, LOW);

  sleepCycles = 0;
}

  enterSleep();

  if (wdtTriggered) {
    wdtTriggered = false;
    sleepCycles++;
  }
}

Verkabelung Zentrale (Wemos D1)
GND -> GND AMS1117
5V -> VIN AMS1117

GND OUT -> GND NRF24l01 pa+ lna
VIN OUT -> VIN NRF24l01 pa+ lna
CE -> D4
CNS -> D2
SCK -> D5
MOSI -> D7
MISO -> D6

Ich hoffe Ihr habt vielleicht noch eine Idee.
Habe bereits mehrere AMS1117 probiert.
7 nrf24l01 pa+lna module (weil diese wohl oft defekt sein sollen)

Wenn benötigte Informationen fehlen, bitte ich bereits jetzt um Entschuldigung :slight_smile:

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Entschuldigung. Danke fürs verschieben.

Willkommen im Forum.
Sorry, aber ich verstehe nicht den Sinn deines Konstruktes. Wieso vermischst du Funk (NRF24L01) und Wlan (ESP8266) miteinander ?
Das kann so nicht funktionieren. Das sind zwei unterschiedliche Techniken, die nicht miteinander kompatibel sind.

Habe keine Probleme mit nRF24L01+ PA + LNA als Empfänger und nRF24L01 als Sender, es muss nichts im Sketch geändert werden.
Mittlerweile nutze ich als Empfänger auch SI24R1 der hat größere Sendeleistung ist ist Kompatibel mit nRF24 , empfangen und ausgewertet werden zu Zeit 4 Sender.
Jedoch nutze ich nur direkte Auswertung, anzeige der Daten auf Display.
die Sender sind die hier . Als Empfänger wurde schon Arduino Nano, ESP32 und ESP8266 genutzt

So wie ich das verstanden habe es werden die Daten vom nRF24 empfangen und mit HTML angezeigt.

@Hotsystems Genau ich nutze nrf zum senden von den sendern an den empfänger, da diese mit batterie betrieben werden und funk viel weniger verbaucht als per wlan modul zu senden. (So zumindest meine information) der empfänger ist direkt am strom angeschlossen, da habe ich meine probleme mit batterie verbrauch. Von dort sende ich dann die daten per html an einen telegram bot.

@fony Hmm komisch ich dachte auch es würde einfach klappen indem ich das "große" modul anstecke. Denn im dem kleinen funktioniert ja alles ohne probleme. Dann habe ich mir extra diese spannungsumwandler besorgt weil ich dachte der 3.3v. Pin vom wemos d1 bringt vielleicht nicht genug leistung für das große modul sodass ich den spannungswandler zwischen den 5v pin vom wemos d1 und dem nrf modul gesetzt habe. Klappt nur leider auch nicht.

Du Sendest und empfängst mit

radio.setPALevel(RF24_PA_MIN);

das sind nur paar mA, Ein Nano am 3,3V kann nur 20mA abgeben und damit funktioniert der nRF24L01+ PA + LNA ohne Probleme.
Hast du auch die Antenne dran?


ist das dass Modul?
Dann kann sein das hier
image
ein 0R SMD Widerstand fehlt, es dürfen nicht gleichzeitig zwei Antennen im Betrieb sein.

Ja habe es normalerweise auf low eingestellt und testweise mal mit min probiert. Ja Antenne ist dran. Hatte halt wirklich gedacht das modul wäre eventuell defekt. Aber habe mittlerweile 7 stk. getestet. Funktioniert sowohl am wemos d1 nicht als auch an den pro minis nicht. Aber das kleine modul funktioniert halt bei beiden ohne probleme.

Genau das ist das kleine modul ohne antenne, die funktionieren ohne Probleme. Wollte statt des kleinen moduls eines mit antenne nutzen um die reichweite zu erhöhen. Und das Modul klappt nicht

Was sagt SerMon wird das Modul gefunden?

Ich wurde versuchen alles rauswerfen und mit nur die empfangene Daten im Serial Monitor zeigen, nur wie geschrieben bist der Erster wo das nicht funktioniert.

Setze mal bei beiden (Sender + Empfänger) die radio.setDataRate auf 1MBPS.

Habe ich auch bereits probiert. Oder kann man soviel pech haben das 7 module kaputt sind? Oder es liegt an diesem wemos d1 board? Ist ja irgendwie auch nicht das gelbe vom ei :sweat_smile:

Sermon zeigt an radio active. Also müsste es richtig verkabelt sein und gefunden werden. Wenn ich das richtig verstehe.

Sonst wurden die kleine Module auch nicht tun.