Ca y est, j'ai une bonne première release de mon "Sleep monitoring" ...
Je dois pouvoir déclencher un switch off sans trop me gourrer ... Saus erreur, le programme fait une stat de variation des franges des formes de l'image et peut conclure à l'endormissement d'un spectateur
Reste donc un Sketch Aduino qui active un relai capable de gérer du 220V ... une sorte de coupe circuit donc... (moins complexe j'espère que le FlySpott...)
Es-tu partant ? ... si on se contente (dans un premier temps) d'un simple interrupteur... et peut-être d'un télérupteur dans un deuxième temps?
Je n'ai pas encore beaucoup réfléchi mais je ne vois qu'un pb: Lorsque qu'on lance le programme, le relai doit être impérativement sur ON pour ne pas couper la télé ou la radio qui seraient sur le circuit...
A te lire...
Ol
PS dans ce cas on devra peut-être changer de thème ...
On peut faire avec de simples ordres, envoyés comme le programme précédent:
POWERON15 et POWEROFF.
On peut très bien imaginer un POWERON10 qui a une durée de vie de 10 minutes et qui devrai être "rechargé" avant échéance, sinon le sketch fait POWEROFF de sa propre initiative.
Oui parfait impec pour un Poweron10 ou 15 mais après le Poweroff, disons le lendemain, il faut pouvoir remettre la télé ou la radio en marche... sans nécessairement le programme de veille en fonction, d'où la nécessité d'un bouton poussoir permettant un Poweron manuel ... ?
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;
}
}
Waou ! je rêve ! Merci JP ! du coup je suis à la bourre pour tester...
Je m'interroge sur mes relais actuels: je crois qu'ils ne peuvent pas gérer du 220v... as-tu une préconisation ?
Je commande une nouvelle Arduino Uno et un relai (et un bouton permettant le power on/off) ,
n'hésite pas à me donner les bonnes références si tu les as...
Ce n'est pas nécessaire, tu as tout le temps, chez nous on a une expression qui dit: "il n'y a pas le feu au lac"
Je ne sais pas quelle puissance du dois commuter, mais regarde du côté des relais électroniques (SSR)