Attiny84 avec batterie

Bonjour,
j’ai testé le circuit suivant, composé d’un attiny84, d’un ILS et d’un nrf24l01.
Celui-ci me permet de détecter une ouverture.
Sur le schéma le nrf24l01 n’est pas branché mais en réalité il l’est.
Le circuit est alimenté par une pile comme celle-ci:
http://www.dx.com/p/trustfire-14500-3-7v-900mah-rechargeable-lithium-batteries-2-pack-19771#.VSd27vmsX2M

je l’ai laissé branché 6h30 et ma pile est passé de 3,91V à 2.91V.
Par défaut l’ILS est toujours fermé (aimant collé à l’ILS )
Comment faire pour que cela consomme moins?

Merci

Mon code:

#include <RF24Network.h>
#include <RF24.h>
#include <avr/sleep.h>

#include "init_variable.h"
#include "check_btn.h"

#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off)
#define adc_enable()  (ADCSRA |=  (1<<ADEN)) // re-enable ADC

int this_node = 011;
int other_node = 0;

volatile byte comptageILS1;
volatile boolean detectchange;

unsigned long difference;
unsigned long difference1;
unsigned long time;

int numberOfDevices; // Number of temperature devices found
String val;

String Capteur_ID;
String sTemp;

int SensorBtnPrec;

uint8_t ce_pin = 8; 
uint8_t csn_pin =7; 
RF24 radio(8,7); //attiny84
RF24Network network(radio);

int serial_putc( char c, FILE * )
{
  return c;
}

void printf_begin(void)
{
  fdevopen( &serial_putc, 0 );
}

char etat;
int pin;
int buf;




void enterSleep(void)
{
  radio.powerDown();
  digitalWrite(csn_pin,LOW);
//  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
}

void setup() {
  pinMode(2, INPUT);
  pinMode(csn_pin, OUTPUT);
  pinMode(3, OUTPUT);
  attachInterrupt(2, check_btn, RISING ); 
  printf_begin();
  SPI.begin();
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  network.begin(95, this_node);
  detectchange = false;
  adc_disable(); // ADC uses ~320uA
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
}

void check_btn(void)
{
  detectchange = true;
}

void loop() {
  digitalWrite(3,LOW);    
  power_adc_disable();
  enterSleep();
  if (detectchange) {
    digitalWrite(csn_pin,HIGH);
    radio.powerUp();
    char SendPayloadBtn[10] = "";
    val = "5@1:1";
    val.toCharArray(SendPayloadBtn, 10);
    RF24NetworkHeader header(other_node, /*type*/ 'S');
    network.write(header, &SendPayloadBtn, sizeof(SendPayloadBtn));
    detectchange = false;
  }
}

Il faut utiliser un interruption pour sortir le processeur de son sommeil lors d'un changement sur une pin.
Sinon c'est normal de vider sa pile.

Il me semble avoir utilisé une interruption :

void setup() {
pinMode(5, INPUT);
attachInterrupt(0, check_btn, RISING ); // attache l'interruption externe n°0 à la fonction blink

et la mise en veille:

void enterSleep(void)
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
}

Indice : l’Attiny est peut-être en sommeil, et le nrf alors ?

@Batto: Bonne question ;), je n'ai pas pensé à ce point.
Peux tu tout de même me confirmer que l'attiny est bien en veille avec le code que j'utilise

J'ai envie de te dire oui mais la mise en sommeil sur atmega je l'ai jamais vraiment expérimentée ...

Dans tous les cas : même si l'Attiny était à fond les ballons, il ne devrait normalement pas permettre une cute si brutale du niveau de la batterie.

A noter également que dans l'absolu, du courant passe au travers de la R de pull up et que ce n'est donc pas la bonne méthode à appliquer

Enfin, ce méfier des autonomie annoncée par les chinois ... 900 mAh j'y crois très très moyennement

Quelle serait la meilleur méthode à appliquer pour la Résistance de pull up?

pour le nrf j'ai trouvé les deux methodes à utiliser pour mettre en veille et reveiller : radio.powerdown et radio.powerup

Le mieux est encore de tester :wink:

Pour le pull up le principal problème est que tu es fermé la plupart du temps. Comme ça je vois pas de solution simple mis à part augmenter la résistance mais être alors plus vulnérable faces aux divers perturbations environnementales. On peut imaginer certains système mais ça complexifie pas mal. Et puis bon la pour le moment c'est surement pas la cause de tes misères si R>100k

Ok, je vais déjà tester avec la mise en veille du nrf et verrai par la suite si la pile se vide toujours aussi vite.
Il faudrait regarde comment fonctionne un detecteur d'ouverture comme celui-ci : http://i2.cdscdn.com/pdt2/8/2/4/1/300x300/auc3760074137824/rw/detecteur-autonome-d-ouvertu.jpg

Ne pas oublier avant de mettre en veille à bien désactiver tous les périphériques inutiles.

Me revoilà après quelque test.
J'ai modifié un peu mon code afin d’être sur que tout les sorties de l'attiny84 soit bien en LOW lorsqu'elle ne sont pas utilisée.
Ensuite j'ai mis une résistance de 15K à la place d'une de 8K.
Je passe donc maintenant à une intensité de 0.243mA (charge de la pile 100%) mais ma pile se vide quasiment toujours aussi vite.
Auriez vous des idées pour éviter une baisse aussi rapide de la pile?

Merci d'avance

Une erreur sur la mesure ... y'a pas de secret, si tu consommais effectivement 243 µA, ta pile de 900 mAh devrait durer 900 000 / 243 = 3703h

Donc si elle ne dure pas ce temps c'est que ta mesure est fausse. Pour ce genre de mesure on ne peut pas utiliser simplement un amperemetre vu que la conso fait des pics énormes et très court en permanence en jonglant entre le mode éveillé et le mode sommeil.