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