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 ![]()


