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!
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.
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 :