Ceci est une ancienne révision du document !
Faire tourner un ATtiny / ATmega pendant 1 an avec une pile ?
Pour rappel, ATmega = le chip d'un Arduino et un ATtiny c'est encore plus petit.
Un ATtiny45/85 en marche consomme à peu près 1mA à 1Mhz (et 5mA à 8Mhz), voir https://arduino.stackexchange.com/questions/13983/attiny85-power-consumption-vs-clock-speed/13987#13987
En un an, cela consommerait 8760 mAh ; ce qui dépasse largement la capacité de piles 1.5V.
Mais il est possible d'atteindre … 0.2 µA, c'est à dire 5000 fois moins de consommation si l'on met l'ATtiny en “sommeil profond” de temps en temps.
Conclusion: 1 an? Pfiouu, petit joueur! On peut atteindre 100 ans de durée avec une seule pile bouton de 3V et l'ATtiny qui ne se réveille que lorsqu'un bouton est pressé (voir Méthode 2 ci-dessous) :) En bref, l'auto-décharge de la pile par elle-même consommera plus que l'ATtiny!
Méthode 1 : TinySnore
Il suffit d'inclure “tinysnore.h” ici: https://github.com/connornishijima/TinySnore et de remplacer les commandes delay(…) par snore(…).
#include "tinysnore.h" void setup() { pinMode(4, OUTPUT); // LED } void loop() { digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); // on allume la LED pendant 100ms snore(1000); // puis on dort profondément pendant 1 seconde }
On descend à une très faible consommation de 4.7 µA pendant la période de sommeil ! Mais 1 seconde de sommeil peut être beaucoup pour certaines applications. Exemple avec 20ms de sommeil:
void loop() { ... snore(20); }
J'ai obtenu 0.82 mA à 8mhz, et 0.24 mA à 1mhz avec des périodes de 20ms de sommeil profond.
Mais on peut faire encore mieux, voir le paragraphe suivant.
Méthode 2 : utiliser des interruptions
On peut mettre l'ATtiny en Low power jusqu'à ce qu'un pin ne change d'état avec une interruption.
Exemple avec trois “Pin Change INTerrupt” (PCINT, à distinguer des INT):
#include <avr/interrupt.h> #include <avr/sleep.h> ISR(PCINT0_vect) { if (digitalRead(0) == LOW) # PB0 = pin 5 enfoncé => on allume la LED digitalWrite(4, HIGH); else if (digitalRead(1) == LOW) # PB1 = pin 6 enfoncé => on éteint la LED digitalWrite(4, LOW); else if (digitalRead(2) == LOW) # PB2 = pin 6 enfoncé => on allume la LED digitalWrite(4, HIGH); } void setup() { pinMode(4,OUTPUT); // LED pinMode(0,INPUT_PULLUP); pinMode(1,INPUT_PULLUP); pinMode(2,INPUT_PULLUP); ADCSRA = 0; // ADC disabled GIMSK = 0b00100000; // General Interrupt Mask Register, / Bit 5 – PCIE: Pin Change Interrupt Enable / When the PCIE bit is set (one) and the I-bit in the Status Register (SREG) is set (one), pin change interrupt is enabled. Any change on any enabled PCINT[5:0] pin will cause an interrupt. The corresponding interrupt of Pin Change Interrupt Request is executed from the PCI Interrupt Vector. PCINT[5:0] pins are enabled individually by the PCMSK0 Register. / see https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf PCMSK = 0b00000111; } void loop() { sleep_enable(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_cpu(); }
Consommation :
- 0.2 µA en temps normal
- 0.3 ma = 300 uA quand un bouton est enfoncé (c'est la résistance PullUp interne à l'ATtiny qui consommme cela lorsqu'elle est activée)
- 5 mA quand la LED est allumé (normal)