Outils pour utilisateurs

Outils du site


attiny_atmega_verylowpower

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
attiny_atmega_verylowpower [2019/11/19 21:03] – [1 an avec un ATtiny / ATmega avec des piles ?] josephattiny_atmega_verylowpower [2020/04/06 16:10] (Version actuelle) serge
Ligne 1: Ligne 1:
-(brouillon) +====== Faire tourner un ATtiny / ATmega pendant 1 an avec une pile ? ======
- +
-====== 1 an avec un ATtiny / ATmega avec des piles ? ======+
  
 Pour rappel, ATmega = le chip d'un Arduino et un ATtiny c'est encore plus petit. Pour rappel, ATmega = le chip d'un Arduino et un ATtiny c'est encore plus petit.
Ligne 11: Ligne 9:
 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. 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.
  
-====== Comment faire ? ======+**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 Il suffit d'inclure "tinysnore.h" ici: https://github.com/connornishijima/TinySnore
Ligne 24: Ligne 24:
  
 void loop() { void loop() {
-  digitalWrite(4, HIGH); +  digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW);  // on allume la LED pendant 100ms 
-  delay(5000); +  snore(1000);                                              // puis on dort profondément pendant 1 seconde
-  digitalWrite(4, LOW); +
-  snore(5000);+
 } }
 </code> </code>
  
- +On descend à une très faible consommation de 4.7 µA pendant la période de sommeil ! 
-====== Consommation ====== +Mais 1 seconde de sommeil peut être beaucoup pour certaines applications. Exemple avec 20ms de sommeil:
- +
-On arrive à obtenir une consommation faible en faisant ça: //sommeil d'une seconde; action; sommeil d'une seconde; action; etc.// +
-Mais 1 seconde peut être beaucoup pour certaines applications. Exemple avec 20ms de sommeil:+
  
 <code> <code>
Ligne 44: Ligne 39:
 </code> </code>
  
-J'ai obtenu 820 µA à 8mhz, et 240 µA à 1mhz.+J'ai obtenu 0.82 mA à 8mhz, et 0.24 mA à 1mhz avec des périodes de 20ms de sommeil profond.
  
-{{tag>attiny arduino electronique joseph}}+Mais on peut faire encore mieux, voir le paragraphe suivant.
  
-====== Autre solution : utiliser des interruptions ======+===== 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**. On peut mettre l'ATtiny en Low power //jusqu'à ce qu'un pin ne change d'état// avec une **interruption**.
  
-Exemple: https://github.com/rocketscream/Low-Power/blob/master/Examples/powerDownWakeExternalInterrupt/powerDownWakeExternalInterrupt.ino+Exemple avec trois "Pin Change INTerrupt" (PCINT, à distinguer des INT):
  
-====== Références intéressantes ======+<code> 
 +#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();  
 +
 +</code> 
 + 
 +Consommation : 
 + 
 +    * 0.2 µA en temps normal 8-) 
 +    * 0.11 ma = 110 uA quand un bouton est enfoncé (c'est la résistance PullUp interne à l'ATtiny qui consommme cela lorsqu'elle est activée) 
 +    * 5.43 mA quand la LED est allumée (normal) 
 + 
 + 
 +===== Références intéressantes =====
  
 https://www.gammon.com.au/forum/?id=11497 https://www.gammon.com.au/forum/?id=11497
 +
 +
 +{{tag>attiny arduino electronique joseph}}
attiny_atmega_verylowpower.1574197389.txt.gz · Dernière modification : 2019/11/19 21:03 de joseph