Anfängerproblem - Fensterkontakt (Reed) mit Attiny85 und sleep modus

Hallo zusammen,
seit Wochen beschäftige ich mich meinem Projekt, dass mich an den Rand der Verzweifelung gebracht hat. Meine Hardware stellt sich aus dem Arduino Nano, Attiny85, einem Taster als Reedkontaktersatz und einem Sender (FS1000A) zusammen. Der Empfänger ist schon länger im Gebrauch und funktioniert auch soweit ganz gut. Der Sender funktionierte eigentlich auch soweit, er war halt an 5V angeschlossen. Da ich jetzt mehrere Sender bauen wollte, möchte ich die Sender (Fensterreedkontakt) im Batteriebetrieb laufen lassen. Habe aus den Foren die Codeabschnitte für den sleep modus eingefügt und einige Kleinigkeiten so weit ich konnte geändert. Zurzeit ist der Taster an einem PULL-UP Widerstand angeschlossen. Das Senden funktioniert. ABER – drücke ich den Taster - wird gesendet und nach dem Senden fällt der Strom im sleep modus auf 0,47 mA (Bild). Lasse ich den Taster wieder los - fällt der Strom im sleep modus auf 0,4 microA (Bild). Wie muß der Code geschrieben werden, damit mein Attiny85 bei gedrücktem Taster im sleep modus auch nur im microA Bereich Strom verbraucht.
Da ich noch blutiger Anfänger bin und gar nicht mehr weiter komme, hätte ich gerne eure Hilfe. Danke im vorraus.

Mein Sender Code

#include <RCSwitch.h> // Einfügen der RCSwitch Library
RCSwitch mySwitch = RCSwitch();
#define FensterAuf 2020 // Definiere FensterAuf als 2020
#define FensterZu 0202 // Definiere FensterZu als 0202
#include <avr/sleep.h>   
                   
volatile int Reedkontakt = 3;                  // Reedkontakt an PIN 3
void gotoSleep(void);                      

    
void setup() {
         
    pinMode(Reedkontakt, INPUT);
    mySwitch.enableTransmit(0); // Der Sender ist an PB0 angeschlossen
    
  //Setzen der Register fuer Pin-Change-Interrupt Pin PB3
  //Loeschen des Global Interrupt Enable Bits (I) im Status Register (SREG)
  SREG &= 0x7F; //entspricht "cli();"
  //Setze des Pin Change Interrupt Enable Bit
  GIMSK |= (1 << PCIE);
  //Setzen des Pin Change Enable Mask Bit 3 (PCINT3)  ==> Pin PB3
  PCMSK |= (1 << PCINT3);
  //Setzen des Global Interrupt Enable Bits (I) im Status Register (SREG)
  SREG |= 0x80; //entspricht "sei();"
  }
void loop()
{
  delay(20);
  
  //Taster(Reedkontakt)am Breadboard mit einem PULLUP Widerstand
  if (digitalRead(Reedkontakt)==LOW) // Wenn (Taster) Reedkontakt geschlosseen ...
   {    
    mySwitch.send(FensterAuf, 24); // ...Sende FensterAuf (2020)
//    delay(3000);
   }  
  else   
   {    
    mySwitch.send(FensterZu, 24); // Sende FensterZu (0202)
//    delay(3000);
   }
      {
        gotoSleep();
      }
}

//Attiny in den Schlafmodus setzen
void gotoSleep()
{
  
  byte adcsra;

  adcsra = ADCSRA; //ADC Control and Status Register A sichern
  ADCSRA &= ~_BV(ADEN); //ADC ausschalten

  MCUCR |= (1 << SM1) & ~(1 << SM0); //Sleep Modus = Power Down
  MCUCR |= _BV(SE); //Sleep Enable setzen
  sleep_cpu(); //Schlafe ....
  MCUCR &= ~(1 << SE); //Sleep Disable setzen
  ADCSRA = adcsra; //ADCSRA-Register rückspeichern
}
//Interrupt Serviceroutine (Pin-Change-Interrupt)
ISR(PCINT0_vect)
{
  // leer
}

fällt der Strom im sleep modus auf 0,47 mA (Bild).

Dein Pullup ermöglicht bei 5V einen Stromfluss von 0,5mA.

Es ist also kein Code Problem.

Combie - Vielen dank für die Antwort. Sie ist zwar recht kurz, aber dafür hat es (glaube ich ) bei mir klick gemacht. Ich kann mich leider erst jetzt melden und mich bedanken.
Ich habe einfach einen größeren Widerstand genommen (10 Mohm). Es funktioniert so wie ich es mir vorgestellt habe. Vielen dank.

10Mohm halte ich für zu groß, da der Innenwiderstand der ATmega-Eingänge in dieser Größenordnung liegt und darum kein sicheres HIGH zustande kommt. Es kann zwar im Moment funktionieren aber zB be Höheren Temperaturen ganz anders aussehen.
Du könntest den internen Pullup verwenden und nur für die Messung des Eingangs dazuschalten.

Grüße Uwe

Hallo Uwe, leider kann ich mich erst jetzt melden (Familie,Urlaub,etc). Mit der entstehenden höheren Temperatur und des daraus eventuell resultierenden unsicheren HIGH Signals werde ich beobachten.

Wenn ich nur den internen Pullup verwende fließt doch ein höherer Strom und folglich habe ich doch eine geringere Batterielebensdauer ?! Im Winter sind die Fenster nun mal viel länger geschlossen als im Sommer ! Oder habe ich deinen letzten Satz falsch verstanden ?

tommes67: Oder habe ich deinen letzten Satz falsch verstanden ?

Vermutlich ja. So könnte der Ablauf sein:

  • aufwachen
  • internen PullUP-Widerstand einschalten pinMode(Reedkontakt, INPUT_PULLUP);
  • Messung durchführen und senden
  • internen PullUP-Widerstand ausschalten pinMode(Reedkontakt, INPUT);
  • schlafen