Sortir du mode sommeil avec évènement

Hé bien salut à tous,

J'ai pour but d'allumer/éteindre une lampe grâce à un relais et un capteur ultrason. Dès que le capteur ultrason capte un obstacle le relais s'allume.

Après avoir réussi cette phase j'ai voulue réduire la consommation de l'arduino, j'ai donc pris un microcontrôleur Atmega8-8pu que j'ai mis en standalone.

Maintenant je cherche encore à réduire la consommation en mettant l'Atmega8-8pu en mode dormir et sortir de son sommeil dès que le capteur rencontre un obstacle. Mais je ne trouve aucune information là dessus (Le meilleur site qui parle de la consommation en mode sleep Gammon Forum : Electronics : Microprocessors : Power saving techniques for microprocessors).

PS: Mon circuit est alimenté en 9V convertit en 5V grâce à un régulateur 7805(pas la meilleure solution, je sais).

Question secondaire : Comment mesurer l'intensité de mon circuit avec un multimètre ? ( à chaque fois que j'essaye mon circuit s'éteint :confused: ).

Merci d'avance ^^

Voici mon code non-optimiser:

#include <avr/sleep.h>

int a = 0;
int moyenne = 0;
int trig = 12; 
int echo = 11; 
long lecture_echo; 
long cm;

void setup() 
{ 
  pinMode(trig, OUTPUT); 
  digitalWrite(trig, LOW); 
  pinMode(echo, INPUT); 
  Serial.begin(9600); 
  pinMode(13,OUTPUT);
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_enable();
  sleep_cpu ();  
}

void loop() 
{ 
  while (a < 3)
  {
    a++; 
    calibrage();
  }
 if (a == 3){
  moyenne = moyenne / 3;
  a++;
 }
  Serial.println(moyenne);
  digitalWrite(trig, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trig, LOW); 
  lecture_echo = pulseIn(echo, HIGH); 
  cm = lecture_echo / 58; 
  Serial.print("Distancem : "); 
  Serial.println(cm); 
  delay(1000);
  if (cm < moyenne)
  {
    digitalWrite(13,HIGH); 
  }
  if (cm > moyenne)
  {
    digitalWrite(13,LOW);
  }
}

void calibrage()
{
  digitalWrite(trig, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trig, LOW); 
  lecture_echo = pulseIn(echo, HIGH); 
  cm = lecture_echo / 58; 
  Serial.print("Calibrage en cours"); 
 // Serial.println(cm); 
  moyenne = cm + moyenne;
  delay(2000); //Temps du calibrage (5sec environ)
  Serial.println(".");
}

clench_35:
Maintenant je cherche encore à réduire la consommation en mettant l'Atmega8-8pu en mode dormir et sortir de son sommeil dès que le capteur rencontre un obstacle.

Bonjour
Ton evenement est la detection d'un obstacle (echo proche)
mais pour detecter cet echo , il faut que le module ultrason soit commandé en permanence (envoi d'un signal US, ecoute retour signal US, calcul distance) , et comme cette fonction est realisée par le MCU , ile ne peut pas etre mis en sommeil.

Si j'ai bien compris je ne peut pas endormir l'arduino et en même tant envoyer un signal.

Alors serait possible d'éteindre la branche d'alimentation (Vcc) de l'Atmega relier au relais et l'allumer dès qu'un obstacle est détecté ?

Non effectivement si vous avez un capteur (genre SR04, SRF05, SRF06, DYP-ME007) à Ultrason c'est l'Arduino qui demande au module d'envoyer un train d'ondes puis l'Arduino doit écouter la réponse du module pour connaître la distance, et suivant la distance (fonctionne entre 2cm et 4m environ) ça prend plus ou moins longtemps

La recommendation serait éventuellement d'utiliser d'une part la libraire NewPing qui est plus performante que celle standard si vous ne le faites pas déjà et ensuite en fonction de la vitesse de réaction que vous souhaitez obtenir vous pouvez faire dormir votre système un peu. Par exemple s'il ne s'agit pas d'un engin motorisé mais que vous voulez allumer la lampe en approchant la main assez proche du capteur alors réveiller le systeme une ou deux fois par seconde doit être acceptable en terme de réactivité utilisateur

Si vous faites de la détection plus globale d'une personne entrant dans une pièce avec un capteur PIR infrarouge (obstacle genre humain, émettant de la chaleur / IR dans son environnement ) alors pas besoin vraiment d'arduino il y'a des PIR intégrant directement un relai et si vous tenez à l'Arduino les PIRs mettent une broche à HIGH ou LOW quand ils détectent un mouvement et vous pouvez vous en servir comme interruption qui va réveiller votre arduino en sommeil

Enfin Posez vous aussi la question de savoir si les économies que vous obtiendrez ne sont pas négligeables en regard de la consommation du capteur si lui doit rester branché en permanence

Bref ça dépend de ce que vous voulez faire et du type de capteur que vous avez.

Merci pour ta réponse J-M-L, je regarde ça tout de suite.

J'utilise comme capteur ultrason "SR04".

Pour les personnes qui veulent savoir, j'ai finalement utiliser la bibliothèque JeeLib :

#include <JeeLib.h>
ISR(WDT_vect) { Sleepy::watchdogEvent(); }

void setup(){
}

void loop(){
[u][b]Sleepy::loseSomeTime(60000);[/b][/u]
}

Cette simple ligne permet de faire dormir l'Arduino 1min.

liende fonctionnement : » Developing a low-power sketch » JeeLabs
bibliothèque jeelib : GitHub - jeelabs/jeelib: JeeLib for Arduino IDE: Ports, RF12, and RF69 drivers from JeeLabs


Pour encore baisser la consommation, j'ai mis un transistor dans mon montage pour éviter que le relais sois allumer 24H/24.

clench_35:
Pour les personnes qui veulent savoir, j'ai finalement utiliser la bibliothèque JeeLib :

Bonsoir
OK
Mais comment fais tu pour détecter un evenement "obstacle" avec ton SR04 pendant la période d'endormissement ? 8)

pepe:
Bonsoir

Pour réduire la consommation de courant d'un micro-contrôleur megaAVR en activité, on peut commencer par :

  • éliminer les circuits extérieurs inutiles,
  • réduire sa fréquence de fonctionnement,
  • réduire sa tension d'alimentation.

De cette manière on peut très facilement parvenir à rendre négligeable cette consommation par rapport à celle des autres circuits en activité.

Un Arduino Pro Mini 3.3V/8MHz ne consomme qu'environ 7 mA en activité. Et si on le fait tourner sur son horloge RC interne à 128 kHz (par reprogrammation de ses fuses), si l'on supprime son régulateur et sa led ON (par coupure du strap prévu à cet effet) et si on l'alimente directement avec une source de tension extérieure, alors on peut faire chuter sa consommation :

  • à moins de 0,12 mA en activité et à moins de 0,025 mA en sommeil sur une source de 5V régulée,
  • à moins de 0,08 mA en activité et à moins de 0,02 mA en sommeil sur une batterie au lithium de 3,7V.

En comparaison, un module HC-SR04 consomme environ 15 mA en fonctionnement et 2 mA au repos !

Je n'avais pas penser à tous ça avant d'acheter le matériel, du coup je suis forcé d'utiliser l'atmega8 et une alimentation de 9v avec régulateur. Sinon j'aurais utilisé cette méthode.

Artouste:
Bonsoir
OK
Mais comment fais tu pour détecter un evenement "obstacle" avec ton SR04 pendant la période d'endormissement ? 8)

Hé bien au final, j'ai utilisé la solution proposer par J-M-L , allumer et éteindre l'Arduino toutes les 3secs, si un obstacle l'Arduino reste allumer 10min.

Bonjour,

pepe:
Pour sa 10000ème, Artouste paye une tournée générale au bar :

:slight_smile:

J'arrive :slight_smile:

pepe:
Pour sa 10000ème, Artouste paye une tournée générale au bar :

Bonjour
Je n'avais même pas fait gaffe
:grin: