ATtiny85 soll schlafen bis ein Magnetkontakt ausgelöst wird - aber wie?

Hallo,

mein erstes Projekt ist schon fertig :slight_smile: ich komme aber leider mit dem Stromverbrauch nicht ganz hin - :frowning:

Ich möchte eine Tür überwachen. Diese Überwachung soll mittels Magnetschalter geschehen. Wenn die Tür geschlossen wird, soll ein Programm ablaufen, welche zwei Relais schaltet. An diesen Relais ist ein Handy angeschlossen, welches mit Relai1 eingeschaltet wird und einen Anruf wird über Relai2 ausgelöst. Am Ende wird das Handy wieder abgeschaltet.

Das Passt auch alles. Leider Verbraucht meine Schaltung 0,9mA, die Batterie reicht so gerade mal zwei Tage.

const int Relai1 = 0;
const int Ausloeser = 1;     // Magnetschalter
const int Relai2 = 2;
const int led1 = 4;
int buttonState = 0;  

void setup() {
  
  pinMode(Ausloeser, INPUT);   // Magnetschalter
  pinMode(Relai1, OUTPUT);
  pinMode(Relai2, OUTPUT);
  pinMode(led1, OUTPUT);
}

void loop() {
  buttonState = digitalRead(Ausloeser);
  if (buttonState == LOW){
  digitalWrite(led1, HIGH);
  delay(100);
  digitalWrite(led1, LOW);
  delay(100);
  }
  else{
  digitalWrite(led1, HIGH);  
  delay(10000);              
  digitalWrite(led1, LOW);    
  delay(1000);   
  digitalWrite(Relai1, HIGH);
  delay(5000);
  digitalWrite(Relai1, LOW);
  delay(20000);
  digitalWrite(Relai2, HIGH);
  delay(5000);
  digitalWrite(Relai2, LOW);
  delay(10000);
  digitalWrite(Relai1, HIGH);
  delay(2000);
  digitalWrite(Relai1, LOW);
  delay(10000);
}
}

Was ich bin jetzt im Internet gefunden habe:

#include <avr/sleep.h>
#include <avr/interrupt.h>

int Relai1 = 0;
int Ausloeser = 1;     // Magnetschalter
int Relai2 = 2;
int led1 = 4;
int buttonState = 0;   

void setup() {
  
  pinMode(Ausloeser, INPUT);   // Magnetschalter
  pinMode(Relai1, OUTPUT);
  pinMode(Relai2, OUTPUT);
  pinMode(led1, OUTPUT);
  
for (int k = 0; k < 10; k = k + 1) {
        if (k % 2 == 0) buttonState = digitalRead(Ausloeser);
if (buttonState == 0){
  digitalWrite(led1, HIGH);
  delay(100);
  digitalWrite(led1, LOW);
  delay(100);
}
        else {
digitalWrite(led1, LOW);
}
}
}
void sleep() {

    GIMSK |= _BV(PCIE);                     // Enable Pin Change Interrupts
    PCMSK |= _BV(PCINT3);                   // Use PB3 as interrupt pin
    ADCSRA &= ~_BV(ADEN);                   // ADC off
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);    // replaces above statement

    sleep_enable();                         // Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
    sei();                                  // Enable interrupts
    sleep_cpu();                            // sleep

    cli();                                  // Disable interrupts
    PCMSK &= ~_BV(PCINT1);                  // Turn off PB1 as interrupt pin
    sleep_disable();                        // Clear SE bit
    ADCSRA |= _BV(ADEN);                    // ADC on

    sei();                                  // Enable interrupts
    } 

ISR(PCINT0_vect) {
    }

void loop() {
  digitalWrite(led1, HIGH);  
  delay(10000);              
  digitalWrite(led1, LOW);    
  delay(1000);   
  digitalWrite(Relai1, HIGH);
  delay(5000);
  digitalWrite(Relai1, LOW);
  delay(20000);
  digitalWrite(Relai2, HIGH);
  delay(5000);
  digitalWrite(Relai2, LOW);
  delay(10000);
  digitalWrite(Relai1, HIGH);
  delay(2000);
  digitalWrite(Relai1, LOW);
  delay(10000);
}

Meine Versuche hiermit haben zwar den ATtiny85 in den Standby-Modus gebracht, nur reagierte er nicht auf den Magnetkontakt.
Das Buch von John Boxall: Arduino Workshops hilft an dieser Stelle leider auch nicht weiter.

Gibt es eventuell einen besseren Weg oder eine gute „Anleitung“ die mir hier helfen kann? Der Strom kann hier leider nicht aus der Steckdose kommen, es muss eine Batterie sein...

Jetzt bin ich gespannt was passiert!
Gruss, Max

0,9mA? was hast du da für eine Batterie eingebaut? Der Fehler liegt hier vermutlich nicht am Attiny!
Ohne Aktivität würde das einer ~45mAh Baterrie entsprechen. Selbst eine kleine AAA hat hier deutlich mehr Power. Die meiste Power geht dir bei jedem Schaltvorgang des Handys/Relais flöten.

Bitte genauen Schaltplan posten, und vorallem, wie wird der Attiny betrieben. (Taktgeschwindigkeit, Spannung ...)

Arbeitet dein Magnetschalter mit einem Pulldown gegen +5V?

Hallo,

deine Sleep Funktion wird nirgendswo aufgerufen. Außerdem wüßte dein µC nicht was er machen soll wenn was wäre. Der Aufweck >Pin ist nicht definiert.

Es gibt zwei Bsp. Den Code darf nicht einfach mischen und ggf. für deinen µC Änderungen machen.

http://playground.arduino.cc/Learning/ArduinoSleepCode

@sschultewolter

Ich hoffe meine Angaben helfen weiter. Es kann sein, dass ich die werde falsch in Erinnerung habe, aber ich meine 0,9mA gemessen zu haben. Momentan versuche ich es mit der 9V Batterie, ich habe mir aber schon Batteriedecks für 4xAA Batterien bestellt. Der Verbrauch ist ja aber ohnehin zu hoch. Oder liegt das an MOSFET?

Einen Schaltplan habe ich mit Fritzing erstellt und beigefügt.

Diese Fritzing Schaltungen sind sowas von unübersichtlich. :-X

Habe aber nun einen näheren Einblick in das ganze. 9V Block ist alles andere als eine ideale Stromquelle. Wenig Leistung, hoher Innenwiderstand etc. Da sind die Batteriedecks deutlich besser. Die Beschaltung der Relais ist so nicht vorteilhaft.

Welche Ankerspannung brauchen die Relais? 5V? Wenn ja, wäre es auch möglich, den Attiny sowie Relais direkt von den 4 Batterien zu speisen ohne den Spannungsregler. Bei max 6V sollten die Relais und der Attiny das aushalten. Da diese Spannung nur bei ganz neuen Batterien anliegt, bei Akkus bist du dauerhaft drunter. Die Relais solltest du mit Transistoren speisen. Auch fehlt die Freilaufdiode bei beiden.

Was beeinflusst du am Handy genau mit den Relais. Sind hier sogar Optokoppler besser angebracht?

der 7805 benötigt schon mindestens 0,9mA
Nachtrag:
Habe gerade ins Datenblatt geschaut: Ruhestrom 5-8 mA

Dabei habe ich mit mit der Zeichnung soviel mühe gegeben... :wink:

Optokoppler habe ich versucht, 4N35. Das Funktioniert.
Den MOSFET wollte ich sowieso einsparen.

@Doc_Arduino

Danke für den Link, ich schaue mir das mal an. Ich werde mal versuchen die Beispiele zu übertragen oder sogar das ganze zu verstehen.

Ist mein erstes Projekt.

@ardubu

Der Strom fließt wenn der Kontakt geschlossen wird. Gemessen habe ich aber immer geöffnet, dass ist der "normale" Zustand.

Schalte doch mit dem Kontakt die Stromversorgung des ganzen. Solange selbsthaltend, bis alles abgearbeitet ist. Danach schaltet sich alles aus.
Evtl. ohne Bootloader, falls der Kontakt zu kurz an ist, oder mit diskreter Schaltung lösen.
Ruhestrom=0
Batteriedauer = lange

ardubu:
der 7805 benötigt schon mindestens 0,9mA
Nachtrag:
Habe gerade ins Datenblatt geschaut: Ruhestrom 5-8 mA

Na da habe ich wohl den Strom von der Batterie zum MOSFET gemessen. Passt ja.
Jetzt messe ich 2,2 mA mit 5V (vom Ardoino).

Der Strom fließt wenn der Kontakt geschlossen wird. Gemessen habe ich aber immer geöffnet, dass ist der "normale" Zustand.

der Ruhestrom durch den 7805 fließt sobald der 7805 an der Batterie hängt.

nehme lieber einen Litium Accu (3 - 4,2V) oder 3 AA Batterien (4,5V) und dann ohne Längstregler

ElEspanol:
Schalte doch mit dem Kontakt die Stromversorgung des ganzen. Solange selbsthaltend, bis alles abgearbeitet ist. Danach schaltet sich alles aus.
Evtl. ohne Bootloader, falls der Kontakt zu kurz an ist oder mit diskreter Schaltung lösen.
Ruhestrom=0
Batteriedauer = lange

:o

Da fällt mich nicht viel zu ein. Außer: GUTE IDEE!

Auch wenn die Technische Lösung durchaus "einfach" ist. 8)

ardubu:
der Ruhestrom durch den 7805 fließt sobald der 7805 an der Batterie hängt.

Richtig.

Wollte ebenfalls gerade sagen, das der 7805 eine bessere Heizung ist. Ein Schaltregler, der die Spannungsdifferenz nicht verheizt, sondern wie ein Schaltnetzteil effizent runter oder auch rauf transformiert, ist hier wesentlich besser geeignet. Ein LM2576-5 ist schon mal besser. Es geht aber sicherlich noch effizienter.
Was ebenfalls noch Energie sparen hilft:
Takte den Tiny langsamer. 1 MHz langt immer noch. Bei so geringem Takt kannst du die Betriebsspannung runterschrauben. Wenn ich das richtig im Kopf habe, sogar bis auf 1,8V
Optokoppler statt Relais hat sschultewolter ja schon geschrieben.

derMaxxx:
Da fällt mich nicht viel zu ein. Außer: GUTE IDEE!

Klemmst du das ganze noch an die Handybatterie und betreibst den uC mit 3,3V, hast du es noch einfacher.

nix_mehr_frei:
Wollte ebenfalls gerade sagen, das der 7805 eine bessere Heizung ist. Ein Schaltregler, der die Spannungsdifferenz nicht verheizt, sondern wie ein Schaltnetzteil effizent runter oder auch rauf transformiert, ist hier wesentlich besser geeignet. Ein LM2576-5 ist schon mal besser. Es geht aber sicherlich noch effizienter.
Was ebenfalls noch Energie sparen hilft:
Takte den Tiny langsamer. 1 MHz langt immer noch. Bei so geringem Takt kannst du die Betriebsspannung runterschrauben. Wenn ich das richtig im Kopf habe, sogar bis auf 1,8V
Optokoppler statt Relais hat sschultewolter ja schon geschrieben.

Hallo nix_mehr_frei, ein Schaltregler ist nicht zwingend besser als der alte 7805, LM1117, ..... Es kommt immer auf den benötigten Strom an, der hier zum fließen kommt.
Da bislang im Aufbau noch die Relais sitzen, ist die Spannungsreduzierung begrenzt. Sollten hier aber Optokoppler, etc zum Einsatz kommen, spielt die Spannungsversorgung keine Rolle mehr. Dann kannst du das ganze auch mit 2 AAA Batterien speisen. Lipo halte ich hier für überflüssig, aus folgenden Gründen.
Deutlich höheres Gefahrenpotential bei Kurzschluss oder Tiefentladung (in sofern keine mit PCB).
Ladegerät muss man besitzen. (Habe mir mal vor einem Jahr ein gescheitest Universal Gerät (NITECORE DigiCharger D2) gegönnt. Dieser lädt die üblichen Akkus wie auch Lipo/LiIon).
Einfacher Austausch, falls das teil leer ist. Die AAA/AA hat jeder daheim. Un wenn man diese aus einer FB klauen muss :wink: