[Résolu] mettre en veuille après 60 secondes , puis reveil avec un BP sur PB3

Bonjour toujours dans mon projet de régulation de températures d’une cave à vins, j’arrives à la dernière difficulté pour moi, après avoir maîtriser les moyennes de relevés, gestion des défauts.

Pour info j’ai mis les 5 DHT22 que j’avais à la poubelle (jusqu’à 65% d’erreur sur l’humidité).
J’attends un SHT31-D qui est connecté en I2C et que tous les utilisateurs “vénère” par rapport au DHT22.

Mon dernier problème est le suivant:
Malgré tous les exemples du net je n’arrives pas à mettre en veille mon µP après 60 secondes sans appuyer sur un BP, pour ensuite le “réveiller” en appuyant sur le BP connecté en PB0 (pour l’instant).

Es ce qu’il y aurait parmi vous un “expert” en “sommeil” et “reveil” de µP arduino?..
Merci de votre aide.

dans cette exemple: http://forum.arduino.cc/index.php?topic=118477.0
la mise en veille se fait par:

PCICR |= (1<<PCIE2);
PCMSK2 |= (1<<PCINT21);
MCUCR = (1<<ISC01)|(1<<ISC00);
pinMode(PIN_INTERRUPT, INPUT);
digitalWrite(PIN_INTERRUPT,HIGH);
interrupts();

(…)

ISR(PCINT21_vec){
wakeUpNow();
}

Salut

Tu veux endormir le CPU pendant 60 secondes pour faire une mesure de température, c'est bien ça ?

@+

non c'est un ensemble de 3 jeeNode qui correspondent ensemble via un protocole défini par un ami.
Le 1er le maître attends des 2 autres des informations. Le maître et l'un des esclaves sont alimentés à partir d'un transfo 220V/12V.
Le 3eme est sur batterie. c'est un terminal muni d'un écran LCD12864.
Lorsque j'appui sur le BP je voudrais que le µP se réveille, envoit les 2 infos qui sont calculés en fonction de la date émise par un DS3232, recevoir les T° mesurées par les 2 autres JeeNode et ensuite me les afficher sur le LCD.
Au bout d'une minute ( suffisante pour allumer le LCD, acquérir les infos et les afficher), mise en veille du micro.
Donc au résumé:
Réveil à partir de l'appui sur le BP pour l'instant en BP0, mais surtout le mettre en veille au bout des 60 secondes de réveil (j'ai un calcul avec Milli() pour ne pas utiliser delay sui est incompatible avec les Int du jeenode).
Voilà Merci de t'intéresser à mon problème.
A+

CECI pourrait-il t'aider ?

De quel type de carte s'agit-il ?

bonjour merci de ton aide.
j’utilise une carte Jeenode V6.0 full compatible arduino uno
A+

Il ne devrait pas y avoir de problème pour implémenter le code du lien donné en #3.
Il suffit de mémoriser les millis() au moment du réveil et d'endormir le processeur à cette valeur + 60000 ms.

void wakeUpInterrupt() {
// Gestionnaire d’interruption
// Placer le code de gestion (court) ici
}

void enterSleepMode() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  attachInterrupt(digitalPinToInterrupt(2), wakeUpInterrupt, LOW);
  sleep_mode();

  // réveil ici
  // évite de constamment déclencher des interruptions inutiles!
  detachInterrupt(digitalPinToInterrupt(2));
}

Ensuite je ne sais pas à quoi correspondent les ports PB0 PB3 sur ta carte, mais sache que seuls les ports 2 et 3 sont capables de générer un interruption sur une NANO.

@+

Je suis plus ordonné que je ne le pensais.
Trouvé dans mes archives :

  #include <avr/sleep.h>
  
const int buttonPin = 2;     // the number of the pushbutton pin

unsigned long wakeupTime;

void setup() {
  Serial.begin(115200);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT_PULLUP);
  // Attach an interrupt to the ISR vector
  attachInterrupt(0, pin_ISR, CHANGE);
  wakeupTime = millis();
}

void loop() {
  if (millis() - wakeupTime >= 5000) {
    Serial.println("GOTO SLEEP");
    delay(10);
    enterSleepMode();
    Serial.println("WAKEUP");
  }
}

void pin_ISR() {
}

void enterSleepMode() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  attachInterrupt(digitalPinToInterrupt(2), pin_ISR, LOW);
  sleep_mode();
  detachInterrupt(digitalPinToInterrupt(2));
  wakeupTime = millis();
}

Ce code endort l’ARDUINO 5s après le boot ou le réveil par un bouton.

@+

Merci hbachetti je vais tester sur une planche à pain.

Merci pour ton aide.
A+

Bonjour, la fonction sleep_mode(); fonctionne bien (j’ai mis 15 secondes pour essai) et je le réveille avec la pin 3.
Mais les sorties restent en l’état (A1 comme je commande un LCD il reste allumé).

j’ai vu qu’il existait une fonction <avr/power.h>.
Es ce que celle-ci “fermera” les sorties?..

Je n’ai pas trouvé comment l’utiliser.

Merci de m’avoir fait progresser.
A+

sleep_mode() met le processeur en sommeil, mais elle ne fait que cela.
Avant la mise en sommeil, il te faut basculer les sorties dans l'état où elles consommeront le moins, et les remettre dans l'état actif au réveil

@+