Laisser un relais ouvert pendant le sleep mode

Bonjour à tous,
je réalise une table à semis chauffante, sur le principe assez simple d'un relais qui s'allume ou s'éteint selon la température. Pour diminuer ma consommation d'énergie, je mets l'arduino en deep sleep et ne le réveille que pour prendre une mesure toutes les huit secondes. Après quoi il se rendort sauf s'il fait moins de x degrés, auquel cas il branche il allume le relais.
Rien de sorcier... sauf que le signal vers le relais s'éteint lui aussi en même temps que l'arduino, alors que je voudrais qu'il reste allumé jusqu'à ce que la bonne température soit atteinte. Comment puis-je éviter cela?
J'espère avoir été assez clair,
Merci

Bonjour
utiliser un telerupteur ou un relais bistable

hum....

ça me semble gagne petit comparé à la table chauffante...

Suivant le type d'arduino utilisé on peut contrôler ou pas l'état d'une pin quand l'arduino dort.

De mémoire sur un AVR les pin configurées en OUTPUT conservent leur état.

Un ESP32 a une fonction gpio_deep_sleep_hold_en() (cf GPIO & RTC GPIO - ESP32 - — ESP-IDF Programming Guide latest documentation) qui permet de maintenir l'état d'une PIN pendant le sommeil profond

Merci pour vos réponses

Je suis d'accord!! Mais je fais ça pour le plaisir de progresser. D'autres projets utiliseront ces fonctions de manière plus adéquate...
J'utilise un arduino nano.
Je me demande à vrai dire si j'ai bien diagnostiqué mon problème. La led du relais s'allume quand le relais est censé s'allumer mais très faiblement, et elle s'éteint qund le relais s'éteint. Il semblerait donc que l'output reste actif même pendant la veille. Mais le relais ne claque pas et ne fait pas passer le courant.
J'ai testé le relais il fonctionne. Je vous soumets mon code, un peu confus encore car j'ai piqué des petits bouts à droite à gauche...

#include <avr/wdt.h>      // Librairie fournie avec l'IDE arduino (Watch Dog Timer)
#include <avr/sleep.h>    // Librairie fournie avec l'IDE arduino (Sleep)
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define DHTPIN 2
#define DHTTYPE DHT11
#define LCDPIN 7
#define relais 6
LiquidCrystal_I2C lcd(0x27, 16, 2);

DHT dht(DHTPIN, DHTTYPE);

volatile bool routineInterruptionExecutee = false; 
volatile bool LCDON = false; 

void setup() {

  Serial.begin(9600);
  dht.begin();
  lcd.init();
  lcd.backlight();
  lcd.clear() ;
  pinMode (LCDPIN, INPUT_PULLUP);
}

void loop() {

  if (!routineInterruptionExecutee) {
    mesureDHT();
    activationDuWatchdog();                         // Configuration du Watch Dog Timer (WDT), pour qu'il produise une interruption au bout de 8 secondes
    miseEnSommeilDuMicrocontroleur();               // Mise du µC en sommeil (il sera réveillé ultérieurement, par l'interruption du watchdog)
  } else {
    routineInterruptionExecutee = false;            // Si interruption exéctuée, on efface cette info
  }
Serial.print (digitalRead (LCDPIN));

if (digitalRead (LCDPIN) == LOW) {
      lcd.backlight ();
      lcd.display ();
      delay (5000);
      lcd.noBacklight ();
      lcd.noDisplay ();
  }
}



// =========================================
// Routine d'interruption (liée au watchdog)
// =========================================
ISR(WDT_vect) {

  desactivationDuWatchdog();
  routineInterruptionExecutee = true;
}

void activationDuWatchdog() {



  __asm__ __volatile__ ("wdr");

  WDTCSR = (1 << WDCE) | (1 << WDE);
  WDTCSR = 0b01100001;
}


void desactivationDuWatchdog() {



  WDTCSR = (1 << WDCE) | (1 << WDE);      // Déverrouille les bits de configuration du Watchdog (procédure spécifiée par le fabricant)
  WDTCSR = 0b00000000;                    // Mise à 0 des bits WDIE et WDE, pour désactiver le timer du chien de garde

}

void miseEnSommeilDuMicrocontroleur(void) {

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();


  Serial.flush();         
  sleep_mode();

  sleep_disable();

}

void mesureDHT(void) {
  dht.read (DHTPIN);
  Serial.println("Temperature = " + String(dht.readTemperature()) + " °C");
  Serial.println("Humidite = " + String(dht.readHumidity()) + " %");
  lcd.setCursor (0, 0);
  lcd.print ("T=");
  lcd.setCursor (0, 1);
  lcd.print ("H=");
  lcd.setCursor (2, 0);
  lcd.print (dht.readTemperature());
  lcd.setCursor (2, 1);
  lcd.print (dht.readHumidity());

if (dht.readTemperature () < 20) {
  digitalWrite (6,HIGH);
}
else {
  digitalWrite (6, LOW);
}

}
  

Merci!

pour tester:

#include <avr/sleep.h>
const byte pinISR = 2;
const byte pinRelais = 13;

void reveil() {
  sleep_disable();
}

void dodo() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_cpu();
}

void setup() {
  pinMode(pinRelais, OUTPUT);
  digitalWrite(pinRelais, HIGH);  // on active le relais (ici la LED interne)

  pinMode(pinISR, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(pinISR), reveil, LOW);

  dodo();
  
  digitalWrite(pinRelais, LOW);   // on désactive le relais (ici la LED interne)
}

void loop() {}

le setup() configure le réveil sur la pin 2 (vous pouvez mettre un bouton entre la pin et GND pour tester), allume la LED interne (sur la pin 13) et endort le processeur. on est réveillé par la pin 2 (appui sur le bouton) et ça éteint le relais (la LED interne).

j'ai pas testé mais ça permettra de voir si le HIGH reste pendant que vous dormez

Bon, j'ai honte. Je n'avais pas défini ma pin relais en OUTPUT. Persuadé que mon problème était dû au sleep mode que je découvre, j'en oubliais les bases. Voilà pourquoi je suis toujours hésitant à poster sur le forum.
Cela dit, cela répond à une question: les outputs restent actifs pendant la veille. Pour ceux que cela aidera...
Merci JML, c'est systématiquement vous qui m'aidez, efficacement, quand je poste une question.

ne vous en faites pas, ça nous est tous arrivé ! c'est le métier qui rentre