While loop not been executed properly

why does it after switch was low and then high, not wait for 2 sek before sleep , it goes immideatly to sleep , only couple of ms long the stuff in the while loop gets send . then it sleeps

where else should sleeptime be set ?

 
 
 
//*********************************************************************  Fusspedal SENDER CODE NRF24L01  ******************************************************************************************************************  
 
 
 
 // Atmega88V
 // BOD 1,8V  on   braucht 0.020mA mehr 
 // 8 MHZ Select Clock Source: Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms
 // no Bootloader    = schneller start up + more flash space
 // variant 88       = P = Picopower in sleep,  PA  Picopower  A Variante  .......   verwendet  atmega88V da min 1,8V Vcc   statt 2,7V    V  variante  bis 10MHZ     
 // LTO disabled     = Link time optimization, compiler irgendwas 
 // eprom retained   = beim brennen alten eprom inhalt beibehalten 
 // Fuses  E2 DD F9  = int 8MHZ no devider  BOD 2,7V  spi
 // Fuses  E2 DE F9  = int 8MHZ no devider  BOD 1,8V  spi
 // Fuses  E2 DF F9  = int 8MHZ no devider  ohne BOD  spi 
 
 //  mit my avr programmieren !!!!

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

                     
                 // 5 byte adresse = 5x char
uint8_t adresse[][6] = {"MGP#1" /* , "MGE#1" */};          // adresse pedal MGP#1, da nur gesendet wird, reicht die senderadresse  / bei extra empfangen empfangeradresse hinzufugen  ,"MGE#1"}; //                                                                                                                                      



const byte CE = 8;                   // pin12
const byte CS = 10;                  // pin 14
RF24 radio(CE, CS);                  //Instanz erstellen
const byte mosfetbatt = 1;           // pin 31 
const byte mosfetpoti = 4;           // pin 2
const byte mosfetTP4056 = 21;        // pin8
const byte led33 = 18 ;              // pin 27
const byte led35 = 6;                // pin 10
const byte led37 = 5;                // pin 9                            
const byte potipin = 19;             // pin 28  
const byte battpin = 15;             // pin 24  
const byte schalter_pin = 3;         // pin 1
const byte taster_charger_pin = 2;   // pin 32
const byte enableTP4056 = 14;        // pin 23
const byte ledgrun = 17;             // pin 26
const byte ledrot= 16;               // pin 25 
const byte charger_pin = 0;          // pin 30 spannungsteiler von 5V auf 1,9V   HIGH aktiv 
const byte faktor_spannungsteiler=2; // vcc als ref und  10k + 10k  faktor 2     
unsigned long last_batt_update;      // intervallzeit beim laden um spanung zu lesen 
unsigned long sleeptime;
unsigned long last_send_out_time_poti; // intervallzeit zwischen potiwerte lesen und senden , stark begrenzt durch analogread sample size   
int poti_read;
long poti_sum;
int poti_avg;
int poti_send;
int battvalue;
long battvalue_sum;
bool show_batt_status;
int  time_batt_update; 
bool charging_done;
bool firstride;
bool ledState ;
float Vcc;
float battvoltage ;
struct meine_struktur {                          //macht einen eigenem datentyp mit mit namen mein_datentyp bis zu 32 byte ( radio.setPayloadSize(32)) setzen!!      
      int raw_poti;                             //payloadsize beachten! int = 2 byte  bool 1byte,  float 4 byte ...
      bool switch_on;
      };                            
meine_struktur  sendoutdata;                    // eine variable mit namen "senoutdata" mit der struktur von mein_datentyp 
                                               // anwahlen mit sendotdata.raw_poti
                                               // anwahlen mit sendotdata.batt_voll
bool was_active;

//*********************************************************  SETUP  *************************************************************************************
void setup(){                                
  Vcc = 2.515 ;                 
  time_batt_update = 5000;                    // update battvoltage  alle xxx sekunden                                                                                                                                                                                                                          000;                     // time in millisec before pedal goes to sleep 
  wdt_enable(WDTO_120MS);                     // mogliche Werte 15MS 30MS 60MS 120MS  250MS  500MS  1S  2S  4S  8S                        
  charging_done = true;                       // nach resset true ,wird von firstride beim einstecken korrigiert .
  firstride = false;     // !!! //            // fuhrt sonst bei unterspannung zu endlos reset schleife bei messen !!!!
  sendoutdata.raw_poti = 0;                   //  reset oder start wert 0
  sendoutdata.switch_on = false;   
  was_active = false ;
  SPI.begin();                                            // spi beginn vor radio begin
  radio.begin();                                          // radio begin
  radio.setPALevel(RF24_PA_MAX);                          // RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBM, and RF24_PA_MAX=0dBm.; 
  radio.setDataRate(RF24_250KBPS);                          // RF24_250KBPS for 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS for 2Mbps 
  radio.setChannel(20);                                   // At 1MHZ channel bandwidth, (max freq - min freq) 2525 - 2400 MHz = 125 channels + 1  microwellen 2450 !!
  radio.setAutoAck(1);                                    // confirmation mode, 1 on 0 off
  radio.setRetries(0, 0);                                 // How long to wait between each retry, in multiples of 250us, max is 15. 0 means 250us, 15 means 4000us. count  How many retries before giving up, max 15
  radio.setPayloadSize(3);                                // 1-32 byte  bei byte variable = 1 
  radio.stopListening ();                                 // erst stop lisiting before open writing pipe
  radio.openWritingPipe (adresse[0]);                     // adresse an die geschrieben wird , empfangeradresse 
  //radio.openReadingPipe (0, adresse[1]);                // adresse  von der gelesen werden soll also    sendeadresse des empfangers   die 1 ist erste pipe 
  pinMode(led33, OUTPUT);
  pinMode(led35, OUTPUT);
  pinMode(led37, OUTPUT);                     // LEDS
  pinMode(ledrot, OUTPUT);
  pinMode(ledgrun, OUTPUT);
  pinMode(mosfetbatt, OUTPUT);                // n-channel schaltet p-channel mosfet um stromverbrauch zu verringen 
  pinMode(mosfetpoti, OUTPUT);                // p channel mosfet schaltet spannung an poti um stromverbrauch zu verringern 
  pinMode(enableTP4056, OUTPUT);              // lader bei 4.00V ausschalten , sonst ein
  pinMode(potipin, INPUT);                    // potipin spannung einlesen
  pinMode(battpin, INPUT);                    // spannungsteiler mit p mosfet teilt halbe batt spannung 4,2V = 2,1V    
  pinMode(schalter_pin, INPUT_PULLUP);        // schalter im pedal, interrupt 1, um sleep zu beenden,   pedal start    
  pinMode(taster_charger_pin, INPUT_PULLUP);  // lader oder tatser, interrupt 0, um sleep zu beenden,  lader ein und oder  battanzeige  
  pinMode(charger_pin, INPUT);                // 5v auf 2V geteilt lader angesteckt = HIGH
  digitalWrite(enableTP4056, LOW);            // enable  LOW =  n-ch off,  pullup von 5V vom ladegerat zieht pin high auf 2V 
  digitalWrite(mosfetbatt, LOW);              // npn = off
  digitalWrite(mosfetpoti, HIGH);             // pnp = off
  digitalWrite(led33, LOW);                   // off      
  digitalWrite(led35, LOW);                   // off
  digitalWrite(led37, LOW);                   // off
  digitalWrite(ledrot, LOW);                  // off
  digitalWrite(ledgrun, LOW);                 // off
  
}
//************************************************************************************    LOOP        ********************************************************************************************** 
void loop(){
                                                



 
if (digitalRead(schalter_pin)== LOW ) {                           // Pedal gedruckt
    digitalWrite(mosfetpoti, LOW);                                // mosfetpoti ein und ein lasssen bis sleep                                            
    was_active = true;                                             // bei watchdog reset nicth aktiv gesetzt 
    sendoutdata.switch_on = true;                                 // an empfanger senden pedal ein    
    sleeptime = millis();                                    // updaten solange schalter gedruckt      
           poti_sum = 0;                                                      
           poti_avg = 0;
           for( int i = 1; i <= 3; i++){
           poti_read = analogRead(potipin);      
           delay(1);
           poti_sum += poti_read;}
           sendoutdata.raw_poti =  poti_sum/3;
           
           if(millis() - last_send_out_time_poti >=4 ){                                // 250/sek
           last_send_out_time_poti = millis();  
           bool ok = radio.write(& sendoutdata, sizeof(meine_struktur));}         
        }  
  
   
  if(( digitalRead(schalter_pin) == HIGH) && (digitalRead(taster_charger_pin) == HIGH) ) {       // schalter (pedal)ist aus  und kein lader oder taster  (sonst sendet es beim laden oder battanzeige auch!!!)                                              
         
        while(was_active ){
              sendoutdata.switch_on = false;                                                    // nur wenn aktiv war senden , bei watchdog reset nicht
              sendoutdata.raw_poti = 0; 
              bool ok = radio.write(& sendoutdata, sizeof(meine_struktur));
             if((millis() - sleeptime) >= 2000 ){                                                   // sendet zeitlang 0 und schalter aus an empfanger 
                  was_active = false ;}}
            
          sleepnow();}                                                                    


if( digitalRead(charger_pin) == HIGH){                                        // falls 5V anliegen , also charger pin HIGH    
             digitalWrite(mosfetbatt, HIGH);                                  // mosetbatt ein lassen bis sleep
             charger();}                                                      // lader ein(sowieso immer enabled pullup) , leds anzeigen bei 4V ausschalten 
if( digitalRead(charger_pin) == LOW )  {                                      // kein ladermehr angesteckt
             firstride = true;}                                               // damit es gleich und nicht erst nach 5 sek was anzeigt
           
  

if((digitalRead(taster_charger_pin) == LOW)   && (digitalRead(charger_pin) == LOW)  &&   (show_batt_status == true) ) {     // taster gedruckt, kein ladegerat eingesteckt, 1x anzeigen         
           Battanzeige();}       
if(digitalRead(taster_charger_pin) == HIGH) {                                 //  taster losgelassen                                       
           show_batt_status = true;                                           //  erneut messen und anzeigen 
           digitalWrite(led37, LOW);                                       
           digitalWrite(led35, LOW);
           digitalWrite(led33, LOW);                                          // alle leds aus
           digitalWrite(ledrot, LOW);
           digitalWrite(ledgrun, LOW);}
           
 
wdt_reset();                                                                               // Wachhund zurucksetzen , sonst reset .

}                                                                                          //loop                                                         



 
//**********************************************************************  Ladegerat  +  Battanzeige beim Laden  *******************************************************************************************

void charger(){                                      
       
if (millis() - last_batt_update >=  time_batt_update || firstride == true){         // regelmassig spannung messen , wenn spannung uber 4V lader aus , wenn unter 3,8V lader enable 
        last_batt_update = millis();                                                //  oder firstride == true damit der aktuelle status gelesen wird beim anstecken, vorsicht bei reset firstride =true,  endloschleife verursachen            
        battvalue_sum = 0;                                                          // falls batt spannung zu wenig hangt sich der mc auf .. endlos reset .
        battvalue = 0;                                                           
        digitalWrite(enableTP4056, HIGH);                                           //lader off sonst misst es die ladespannung 
        delay(5);                                                                   // bissl warten                                                                                                                               
        for( int i = 1; i <=25; i++){                                                
        battvalue =  analogRead(battpin);
        delay(1);
        battvalue_sum += battvalue;}   
        battvalue = battvalue_sum /25;
        battvoltage = (Vcc/1023.00)* (battvalue * faktor_spannungsteiler);           
        firstride = false;
        }                                                                                             // ende funktion     


if (battvoltage >= 4.00) {  
        charging_done = true;                                                            
        digitalWrite(enableTP4056, HIGH);   //off                                                     // akku voll , disable   Ladegrat                                           
        digitalWrite(led37, HIGH);                               
        digitalWrite(led35, HIGH);                                                             
        digitalWrite(led33, HIGH);
        digitalWrite(ledgrun, HIGH);   
        digitalWrite(ledrot, LOW);}                                                                  
else if(battvoltage < 4.00 && battvoltage >= 3.80 && (charging_done == true)){                       // Spannung uber 3,8V und nicht unter unter 3,8V gewesen  
        digitalWrite(enableTP4056, HIGH);     // off                                                 // disable   Ladegrat                                           
        charging_done = true;
        digitalWrite(led37, HIGH);                                   
        digitalWrite(led35, HIGH);                                                             
        digitalWrite(led33, HIGH); 
        digitalWrite(ledgrun,HIGH);    
        digitalWrite(ledrot, LOW);} 
else if(battvoltage <= 4.00 &&  battvoltage >= 3.80 && (charging_done == false)) {                      // Spannung uber 3,8V und nicht unter unter 3,8V gewesen  
        digitalWrite(enableTP4056, LOW);     // on                                                      // enable  Ladegrat                                           
        charging_done = false; 
        digitalWrite(led37, HIGH);                                   
        digitalWrite(led35, HIGH);                                                             
        digitalWrite(led33, HIGH);
        digitalWrite(ledgrun,LOW);       
        digitalWrite(ledrot, HIGH);}
else if(battvoltage < 3.80 && battvoltage >= 3.50 ){ 
        digitalWrite(enableTP4056, LOW);      //on                                                    
        charging_done = false;                                                      
        digitalWrite(led37, LOW);                               
        digitalWrite(led35, HIGH);                                                                    // Spannung uber 3,5V  halbvoll
        digitalWrite(led33, HIGH);
        digitalWrite(ledgrun, LOW);
        digitalWrite(ledrot, HIGH);}
else if(battvoltage < 3.50 && battvoltage >= 3.20 ){ 
        digitalWrite(enableTP4056, LOW);      //on                                                                                                    
        charging_done = false; 
        digitalWrite(led37, LOW);                                                                      // Spannung uber 3.20V                 
        digitalWrite(led35, LOW);                                  
        digitalWrite(led33, HIGH); 
        digitalWrite(ledgrun, LOW); 
        digitalWrite(ledrot, HIGH);}
else if(battvoltage < 3.20){ 
        digitalWrite(enableTP4056, LOW );      //on                                                                                                    
        charging_done = false; 
        digitalWrite(led37, LOW);                                                                      // Spannung unter 3,2V 
        digitalWrite(led35, LOW);                                  
        digitalWrite(led33, LOW);
        digitalWrite(ledgrun, LOW);
        digitalWrite(ledrot, HIGH);}     

}
   
         
//**********************************************************************    Battanzeige bei Tasterdruck   *******************************************************************************************   

 void Battanzeige(){
        digitalWrite(mosfetbatt, HIGH);                                                      // npn high ist pnp low ist ein  
        delay(5);
        show_batt_status= false;                                                             // einmal durchlaufen bei tasterdruck = false , springt sonst bei grenzspannungen hin und her                                     
        battvalue_sum = 0; 
        battvalue = 0;                        
        for( int i = 1; i <= 25; i++){                                                       // paar mal messen 
        battvalue =  analogRead(battpin);
        delay(1);
        battvalue_sum += battvalue;}
        battvalue = battvalue_sum /25;                                                        // durchschnitt rechnen 
        battvoltage = (Vcc/1023.00)* (battvalue * faktor_spannungsteiler);                    // umrechnen in spannung 
       
      if(battvoltage >= 3.80 ){ 
        digitalWrite(led37, HIGH);                               
        digitalWrite(led35, HIGH);                                                              // Spannung uber 3,8 voll 
        digitalWrite(led33, HIGH); 
        digitalWrite(ledgrun, HIGH);    
        digitalWrite(ledrot, LOW);}    
      if (battvoltage < 3.80 && battvoltage >= 3.50 ){ 
        digitalWrite(led37, LOW);                               
        digitalWrite(led35, HIGH);                                                             // Spannung uber 3,5V  halbvoll
        digitalWrite(led33, HIGH);
        digitalWrite(ledgrun, HIGH);  
        digitalWrite(ledrot, LOW);}                             
      if(battvoltage < 3.50 && battvoltage >= 3.20 ){ 
        digitalWrite(led37, LOW);                                                               // Spannung unter 3,5V ein LED noch                   
        digitalWrite(led35, LOW);                                  
        digitalWrite(led33, HIGH);        
        digitalWrite(ledgrun, HIGH);    
        digitalWrite(ledrot, LOW);}    
      if(battvoltage < 3.20){ 
        digitalWrite(led37, LOW);                                                               // Spannung unter 3,2V 
        digitalWrite(led35, LOW);                                  
        digitalWrite(led33, LOW);
        digitalWrite(ledgrun, HIGH);    
        digitalWrite(ledrot, LOW);}                                                                // bei 2,8V schaltet S8261ABP aus.
     }                                                                                                                               
 


 
//*************************************************************************************      SLEEP    *******************************************************************************************************************

void sleepnow(){
    radio.powerDown ();                      // nrf24 aus, bringt nicht viel aber dennoch 
    digitalWrite(led37, LOW);
    digitalWrite(led35, LOW);
    digitalWrite(led33, LOW);                // LEDS LOW
    digitalWrite(ledrot, LOW);
    digitalWrite(ledgrun, LOW);
    digitalWrite(mosfetpoti, HIGH);          // pnp off poti versorgungsspannung , zieht sonst strom 
    digitalWrite(mosfetbatt, LOW);           // npn off spannungsteiler akku 
    digitalWrite(enableTP4056, LOW);         // lader enable ein , damit es bei lader anstecken ladt, low ist npn off enable hat pullup widerstand                                                                             
    static byte prevADCSRA = ADCSRA;         // ADC register merken
    ADCSRA = 0;                              // adc aus   
    set_sleep_mode (SLEEP_MODE_PWR_DOWN);    // modus wahlen
    sleep_enable();                          // sleep ermoglichen
    noInterrupts();                          // keien interrupts jetzt
    attachInterrupt(1, wakeup, LOW);         //Interrupt  1 schalter LOW ! not falling 
    attachInterrupt(0, wakeup, LOW);         //Interrupt  0 taster   LOW ! not falling
    interrupts();                            // interrupts jetyt moglich 
   //MCUSR = 0;                              // Sonst funktioniert das Abschalten des Watchdogs nicht
   //wdt_disable();                                             
    wdt_enable(WDTO_8S);                     // entweder watchdog ausschalten oder auf 8 sek stellen , resettet alles 8 sek in sleep .......... oder ganz aus ??
    sleep_cpu();

                                              // a sleep now //                          
        
    wdt_enable(WDTO_120MS);                   // watchdog auf kleineren Wert setzen als vorher 8 sek
    ADCSRA = prevADCSRA;                      // ADC register  wieder einschalten                              
    show_batt_status = true;                  // nach interrupt tasterdruck battanzeige moglich falls tster gedruckt
    firstride = true;                         // damit es bei laden sofort die richtige spanung anzeigt / leds einschaltet , nicht erst nach 5 sek , nach resets ....
    radio.powerUp();                          // nrf24 in standby mode (0,022mA)
   }                       

void wakeup(){                               // Interrupt Service routine  
  sleep_disable();                           // schlaf aus
  detachInterrupt(0);                        // keine interrupts ab hier fur nr 0
  detachInterrupt(1);                        // keine interrupts ab hier fur nr 1
  }


//******************************************************************************************  ENDE  **************************************************************************************************
















      

It would be helpful if you posted your entire sketch. How is sleeptime declared?

unsigned long sleeptime , defaults to 0 after reset
but it gets set to millis if switch is low , after switch turns from low to high it should send 2 sec long , but it does not

sleeptime is only used in schalterpin low and schalterpin high and unsigned long sleeptime, it should be fine the schalterpin wakes with low and sends data, sleeptime gets reset every time around new to millis .

if schalterpin HIGH , send 2 sec long, then sleep

this also does not wait 2 sec

 if(( digitalRead(schalter_pin) == HIGH) && (digitalRead(taster_charger_pin) == HIGH) ) {       // schalter (pedal)ist aus  und kein lader oder taster  (sonst sendet es beim laden oder battanzeige auch!!!)                                              
        sleeptime = millis();   
        while(was_active ){
              sendoutdata.switch_on = false;                                                    // nur wenn aktiv war senden , bei watchdog reset nicht
              sendoutdata.raw_poti = 0; 
              bool ok = radio.write(& sendoutdata, sizeof(meine_struktur));
             if((millis() - sleeptime) >= 2000 ){                                                   // sendet zeitlang 0 und schalter aus an empfanger 
                  was_active = false ;}
              }
            
          sleepnow();}                                                                    

why not just use delay()?

it should send

sendoutdata.switch_on = false;
sendoutdata.raw_poti = 0;

more than once , for safety , a delay does not do that

i thougth a while loop executes till its condition is false , but........ i dont get it

is it the if loop or the wrong set sleeptime ?

was_active is set on purpose to false in the setup. because the wdt resets every 8s and it should not send 2 sec long after every reset.

but after the switch was active , was active is set to true .
and it does send for a short time (i see the current consumtion sleep 0 active 15ma) and after the switch is high it does not take 2 seconds until the current is 0 .02ma.

does not work ether , can some one xplain while loops

 if(( digitalRead(schalter_pin) == HIGH) && (digitalRead(taster_charger_pin) == HIGH) ) {       // schalter (pedal)ist aus  und kein lader oder taster  (sonst sendet es beim laden oder battanzeige auch!!!)                                              
        sleeptime = millis();   
        while(was_active  ){
              sendoutdata.switch_on = false;                                                    // nur wenn aktiv war senden , bei watchdog reset nicht
              sendoutdata.raw_poti = 0; 
              bool ok = radio.write(& sendoutdata, sizeof(meine_struktur));
             //if((millis() - sleeptime) >= 2000 ){                                                   // sendet zeitlang 0 und schalter aus an empfanger 
                   delay(2222);
                   was_active = false ;
                  //}
              }
            
          sleepnow();}                                   type or paste code here

If was_active is true when entering this loop then a 2222ms delay should occur and the loop should exit on the next iteration. Can you use a serial console to print the value of was_active before entering the loop?

execute the body of the while loop if the condition is true? are you sure sleeptime has the value you expect?

are you sure it is true?

it does execute the while statement once ( but ignores the delay , jumps to false and then sleeps.

unfortunatly it is a custom board with atmega88 and no free rx tx pins ( not able to change that )

but the code is not that complicated ! :face_with_raised_eyebrow:

print millis() and sleeptime before entering the loop

i cant print anything, custom board, no serial , i know it sucks

I have never used that board but it is highly unlikely the compiler (assuming the correct BSP) "ignores the delay ". It makes me wonder if the timer that millis() and delay() uses is not setup correctly somehow. I'm not sure which timer that is in this board support package. Can you just write a simple "blink" program to test the delay() function?

as you can see i use the millis in several other locations and all time event are fine i checked with blink 1 sec .

the while loop ges entered and of not set false runs forever , but all time things are ignored

this here never goes to sleep idle of MC at 3mA

 if(( digitalRead(schalter_pin) == HIGH) && (digitalRead(taster_charger_pin) == HIGH) ) {       // schalter (pedal)ist aus  und kein lader oder taster  (sonst sendet es beim laden oder battanzeige auch!!!)                                              
        
          
        while(was_active  ){
              sendoutdata.switch_on = false;                                                    // nur wenn aktiv war senden , bei watchdog reset nicht
              sendoutdata.raw_poti = 0; 
              bool ok = radio.write(& sendoutdata, sizeof(meine_struktur));
            
              if((millis() - sleeptime) >= 1000 ){                                                   // sendet zeitlang 0 und schalter aus an empfanger 
                   was_active = false ;}
                  
              }
             delay(2000);
          sleepnow();}                    

ok i tried now for loops and other stuff and visualised it wih an led .

nothing i tried keeps the while loop for 2 sek , nothing .

if i remove the "was active = false" it stays forever

what am i missing here?????????????

the led turns on briefly and off immeditaly by the sleep function , neither the millis or delay works

  if(( digitalRead(schalter_pin) == HIGH) && (digitalRead(taster_charger_pin) == HIGH) ) {       // schalter (pedal)ist aus  und kein lader oder taster  (sonst sendet es beim laden oder battanzeige auch!!!)                                              
         sleeptime = millis();          
       while (was_active == true ){
              digitalWrite(led37, HIGH); 
              sendoutdata.switch_on = false;                                                    // nur wenn aktiv war senden , bei watchdog reset nicht
              sendoutdata.raw_poti = 0; 
              bool ok = radio.write(& sendoutdata, sizeof(meine_struktur));
              //delay(2000);
              if((millis() - sleeptime) > 2000 ){ 
                  was_active = false; }
              }
                                 
                  sleepnow();}                                              // sendet zeitlang 0 und schalter aus an empfanger
                                                                                
          

this works fine

 if(( digitalRead(schalter_pin) == HIGH) && (digitalRead(taster_charger_pin) == HIGH) ) {       // schalter (pedal)ist aus  und kein lader oder taster  (sonst sendet es beim laden oder battanzeige auch!!!)                                              
         
          if (was_active == true ){
              digitalWrite(led37, HIGH); 
              sendoutdata.switch_on = false;                                                    // nur wenn aktiv war senden , bei watchdog reset nicht
              sendoutdata.raw_poti = 0; 
              bool ok = radio.write(& sendoutdata, sizeof(meine_struktur));}
        
         if((millis() - sleeptime) > 1000 ){ 
                  was_active = false;                         
                  sleepnow();}}                                              // sendet zeitlang 0 und schalter aus an empfanger

this not why ?

 if(( digitalRead(schalter_pin) == HIGH) && (digitalRead(taster_charger_pin) == HIGH) ) {       // schalter (pedal)ist aus  und kein lader oder taster  (sonst sendet es beim laden oder battanzeige auch!!!)                                              
         
          while(was_active == true ){
              digitalWrite(led37, HIGH); 
              sendoutdata.switch_on = false;                                                    // nur wenn aktiv war senden , bei watchdog reset nicht
              sendoutdata.raw_poti = 0; 
              bool ok = radio.write(& sendoutdata, sizeof(meine_struktur));}
        
         if((millis() - sleeptime) > 1000 ){ 
                  was_active = false;                         
                  sleepnow();}}                                              // sendet zeitlang 0 und schalter aus an empfanger
                                                

where is the value of "was_active" changed within the while loop

(you should at least line the closing "}" with the "while"

i found it the WDT with 120ms does not like 2 sek while loops or 2 sec delays ..

 wdt_reset();   

what prevents this condition being repeatedly invoked?

so it waits 2 seconds during the first invocation and doesn't wait on subsequent executions

it sleeps after that condition