Sleep monitoring / surveillance du sommeil

Bonjour olpica

Voilà une première version, elle se commande par 2 instructions, PONnn et POF

PON10 provoque un restart du relais de 10 minutes.
PON6 provoque un restart du relais de 6 minutes.
etc...
POF ou PON0 ou PON font tomber le relais.

Le relais est connecté à la pin relaisPin et tire avec le signal relaisOnEtat

Pour accélérer les essais, tu peux modifier la variable secondesMinute ainsi, si cette variable vaut 1, une minute dure 1 seconde.
unsigned long secondesMinute = 1UL; // Pour accélérer les essais, normalement 60UL

Le programme:

/*
    Name:       olpica_MonitoringSommeil.ino
    Created:	18.01.2024
    Author:     jpbbricole
				https://forum.arduino.cc/t/sleep-monitoring-surveillance-du-sommeil/1212778

				Reçoit périodiquement un PON10 pour restarter un relais d'alimentation, ici de 10 minutes
	19.01.2024	Première version et mode d'emploi #9
*/
const String progrVersion = "Vers. PON";

#include <SoftwareSerial.h>
//------------------------------------- Serial de Free Basic (fb)
const int fbRxPin = A1;     // RX de FB, à raccorder sur TX du module FTDI CNC shield Hold
const int fbTxPin = A2; // TX de FB, à raccorder sur RX du module FTDI CNC shield Resume
SoftwareSerial fbSerial(fbRxPin, fbTxPin);     // Création de l'interface série de FB

//------------------------------------- Relais 
const int relaisPin = 7;     // Commande relais On/Off
const int relaisOnEtat = LOW;     // Etat pour faire tirer le relais

unsigned long	relaisOnTempo = 10UL * 60UL * 1000UL;     // Temporisation du relais  10 minutes
unsigned long	relaisOnMillis = 0;      // Temporisation deu relais chrono

unsigned long	secondesMinute = 1UL;      // Pour accélérer les essais, normalement 60UL

//------------------------------------- Commandes (cmd)
String cmdRx = "";       // Commande reçue du moniteur ou de Bluetooth
boolean cmdRecue = false;     // Si une nouvele commande reçue du moniteur ou de Bluetooth

void setup()
{
	Serial.begin(9600);
	fbSerial.begin(9600);

	Serial.println(progrVersion);

	pinMode(relaisPin, OUTPUT);
	digitalWrite(relaisPin, !relaisOnEtat);     // Faire tomber le relais
}

void loop()
{
	//--------------------------------- Temporisation
	if (relaisOnTempo != 0 && (millis() - relaisOnMillis >= relaisOnTempo))     // Si fin de la temporisation
	{
		relaisStart(0);
	}
	//--------------------------------- Lire les ports série
	serialEvent();     // https://www.arduino.cc/reference/en/language/functions/communication/serial/serialevent/
	fbSerialEvent();

	if (cmdRecue)
	{
		cmdTraitement(cmdRx);
		cmdRecue = false;
	}
	
}
void relaisStart( int tempo)
{
	if (tempo != 0)     // Si démarrage relais
	{
		Serial.println("Relais restart " + String(tempo) + " minutes");

		relaisOnTempo = cmdRx.toInt() * secondesMinute * 1000;
		relaisOnMillis = millis();     // Démarrage du chrono
		digitalWrite(relaisPin, relaisOnEtat);     // Le relais tire
	}
	else
	{
		relaisOnTempo = 0;
		digitalWrite(relaisPin, !relaisOnEtat);     // Le relais tire
	}
}
/*
	Traitement des commandes reçues de FB
	PON10 pour restart pour 10 minutes
	POF pour couper l'alimentation

*/
void cmdTraitement(String& cmdRx)
{
	Serial.println("\nCommande : " + cmdRx);
	cmdRx.toUpperCase();     // Tout en majuscules
	cmdRx.replace(" ", "");     // Supprimer les espaces

	if (cmdRx.startsWith("PON"))     // Power ON
	{
		cmdRx.replace("PON", "");     // Ne garder que le temps
		relaisStart(cmdRx.toInt());     // Démarrage relais
	} 
	else if (cmdRx == "POF")     // Power OFF
	{
		relaisStart(0);     // Arrêt relais
	}
	else
	{
		Serial.println("\nCommande : " + cmdRx + " INCONNUE !!!");
	}
}
//------------------------------------- Ports série
void serialEvent()     // Serial
{
	if (Serial.available())
	{
		cmdRx = Serial.readStringUntil('\n');     // https://reference.arduino.cc/reference/fr/language/functions/communication/serial/readstringuntil
		cmdRx.trim();     // Pour nettoyer cmdRx  https://docs.arduino.cc/built-in-examples/strings/StringLengthTrim?

		cmdRecue = true;
	}
}

//------------------------------------- Ports série Free Basic
void fbSerialEvent()     // Free Basic
{
	if (fbSerial.available())
	{
		cmdRx = fbSerial.readStringUntil('\n');
		cmdRx.trim();     // Pour nettoyer cmdRx

		cmdRecue = true;
	}
}

Bonne journée, ici un froid de canard.
jpbbricole