Arduino basse conso -> besoins d'explications

Bonjour !
Je bosse en ce moment sur l'optimisation d'un circuit. En gros : j'ai déjà fini un exemplaire qui répond à ce qu'on lui demande sauf... Qu'il consomme trop (ça va tourner sur batterie) et qu'il est trop gros.

Donc : nouveau design de carte, mise à jour du code pour mettre l'ATmega en veille le plus souvent et sélection de composants qui consomment que dalle.

Maintenant ma demande d'aide : j'ai lu un énorme pavé sur les économies d'énergie avec l'arduino, mais c'est un peu pointu sur certains points et j'aurais besoin d'aide pour appliquer tout ça.

Mon besoin est le suivant : mettre l'arduino en veille, et si on appui sur un bouton, l'arduino se réveille pour effectuer une action, avant de se rendormir mais j'ai besoin que ce soit réactif (1ms max).

J'ajouterais un diagramme pour expliquer ça plus en détail.

Il y a bien un code donné sur ce magnifique article, mais je ne vois absolument pas comment l'implémenter dans mon code et... je ne le comprend pas.

Si vous pouvez me donner des pistes / m'expliquer ce fameux code ce serais vraiment sympa :slight_smile:

#include <avr/sleep.h>

const byte LED = 9;
  
void wake ()
{
  // cancel sleep as a precaution
  sleep_disable();
  // precautionary while we do other stuff
  detachInterrupt (0);
}  // end of wake

void setup () 
  {
  digitalWrite (2, HIGH);  // enable pull-up
  }  // end of setup

void loop () 
{
 
  pinMode (LED, OUTPUT);
  digitalWrite (LED, HIGH);
  delay (50);
  digitalWrite (LED, LOW);
  delay (50);
  pinMode (LED, INPUT);
  
  // disable ADC
  ADCSRA = 0;  
  
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_enable();

  // Do not interrupt before we go to sleep, or the
  // ISR will detach interrupts and we won't wake.
  noInterrupts ();
  
  // will be called when pin D2 goes low  
  attachInterrupt (0, wake, FALLING);
  EIFR = bit (INTF0);  // clear flag for interrupt 0
 
  // turn off brown-out enable in software
  // BODS must be set to one and BODSE must be set to zero within four clock cycles
  MCUCR = bit (BODS) | bit (BODSE);
  // The BODS bit is automatically cleared after three clock cycles
  MCUCR = bit (BODS); 
  
  // We are guaranteed that the sleep_cpu call will be done
  // as the processor executes the next instruction after
  // interrupts are turned on.
  interrupts ();  // one cycle
  sleep_cpu ();   // one cycle

  } // end of loop

Source : Bible de l'Arduinécolo

Aussi, es-ce possible de piloter un mosfet comme j'en met la datasheet ci-dessous avec 3.3v ? En sachant que la tension à contrôler est de 5v et que le courant atteindra environ 1A en pic. Suis encore novice dans le décryptage de datasheet... J'ai un peu peur de la valeur qu'ils avancent (2.5v ?? Vraiment ?)

Merci !!

AO3401.pdf (498 KB)

Salut !

Je sais maintenant exactement ce qu'il me faut, et tout ça se retrouve dans ce diagramme

En faite je me demande juste comment utiliser correctement les lignes de commandes relatives à la veille et au réveil

Oubliez la question du mosfet, j'avais une idée mais finalement ça ne marchera pas...

Merci

Très inutile comme réponse...

Merci de lire avant de répondre n'importe comment.

Merci

Le mieux serait de lire ce qu'il y a sur la page du lien et d'essayer de comprendre avant de dire que la réponse est inutile....

TrolololGames:
Très inutile comme réponse...

Très utile au contraire et hyper complet.

Je ne saurai trop te retourner le compliment que tu fais à 68tjs

1 Like

Mais je l'ai déjà lu une dizaine de fois !!!

Il y a même le lien dans mon premier post !

Il n'est pas dit ce que provoque chaque désactivation (ADC kézako ? et ça à quoi comme conséquences de la désactiver ? Pareil pour le "watchdog" !?)

Je vous demande de m'aiguiller pour savoir quel mode de veille convient le mieux à mon utilisation (en prenant en compte le temps de réveil) quand la carte se réveille, elle redémarre où dans le code ? Puis-je executer une fonction juste après le réveil de la carte ?

Merci...

http://www.google.ch/search?q=adc&ie=utf-8&oe=utf-8&client=firefox-b&gfe_rd=cr&ei=ygI2WKnHJKzC8ger-rioBw#q=adc+wiki

Ok, ça répond à une de mes questions, cool

Si on désactive ça, pas de mesures analogiques possible, si on ne se sert pas de cette fonctionnalité de l'ATmega, peut-on désactiver l'ADC sans conséquences plus que "les pins analigiques sont désactivés" ?

Le BOD aussi, pas de conséquences sur l'utilisation de l'ATmega si on ne se sert pas des pins analogs ?

Merci

ADC pour analog to digital converter. C'est le composant pour les lectures analogiques. Tu peux le désactiver si tu fait pas de mesure analogique

Le Watchdog, en français chien de garde, surveille le micro et déclenche des resets s'il détecte des soucis. Genre basse tension, blocage dans le code etc...

Super !

Merci, et le "BOD" ? Toujours même question...

Ok, ça répond à une de mes questions, cool

Il suffisait de lire le lien que je t'ai donné deux fois (2 fois qu'elle erreur !)
Il y a bien d'autres périphériques que tu peux désactiver si tu n'en sert pas.

Mais il faut lire ............

68tjs:
Mais il faut lire ............

oui ici aussi a partir de la page 62 :wink:

Ok merci, j'étais allé voir mais j'avais pris la version courte je crois.

Je ferais des tests pour les temps de réveil

Merci :slight_smile: