Salut à tous,
J’imagine fort bien que je ne suis même pas sur le bon forum, mais je sais que parmi vous, certains ont déjà été confronté au problème.
Je vous explique le projet …
Cette année, je me fait un potager de A à Z et donc je fais mes semis.
Pour optimiser certaines graines, je chauffe avec 2 plateaux chauffants, mes bacs de semis.
Ces plateaux sont gérés par 2 relais via un Arduino.
Et les remontées de températures se font via 2 sondes DS18B20.
L’affichage des températures et de l’état des relais se fait sur un LCD.
Le programme est simple et rudimentaire mais pour l’urgence et le besoin, il fonctionne très bien.
J’ai voulu ajouter à ce projet la couche MySensors.
Jusque là tout va bien aussi, lorsque je check avec MysController, je vois bien tout remonter.
Par contre, ça se complique lorsque j’éloigne ma passerelle.
Je n’ai plus de connexion entre mon projet et l GateWay MySensors.
Alors, oui, d’une part, je vais voir à changer l’antenne RF24 que j’utilise pour une plus longue protée.
Mais ce n’est pas ce qui m’inquiète.
Mon problème c’est que lorsque mon projet ne capte pas la passerelle et bien il bloque sur ce point et tourne en rond.
Résultat : plus de fonctionnement de mon automatisation.
Ce que je voudrais c’et que la couche MySensors soit optionnelle.
Si tu joins la passerelle tant mieux, remontes les infos, etc.
Sinon, bah fais quand même ton boulot en local parceque çe ne va pas chauffer tout seul ce bazard!
Donc l’idée c’est comment gérer ces interuptions de communication avec la passerelle?
Forcément, ça a été géré chez MySensors ?
On ne va pas perdre la gestion d’un capteur ou actionneur simplement parce que la passerelle n’est plus joignable.
Le truc, c’est que je ne sais pas du tout comment gérer ça.
Si vous avez déjà rencontré le problème ?
Voici le code de mon sketch ci-dessous au besoin :
/*
*
* Semis4Tonyo
*
* Création du programme : 10 Février 2021
*
* Gestion de 2 plateaux de chauffage commandés par 2 relais
* et régulés par 2 sondes DS18B20
* Utilisation d'un affichage LCD 16x2 pour l'affichage des
* températures et des status des relais.
*
* Utilisation du protocole MySensors pour transmission sans
* fil des informations.
*
*
*
*
*
*
*/
// MySensors - Activation du Debug
#define MY_DEBUG
// MySensors - Activation et choix du module Radio
#define MY_RADIO_RF24
//////////////////////////////
// Inclusion des librairies //
// //
#include <TinkerKit.h> // Relais
#include <OneWire.h> // Gestion des Sonde de température DS18B20
#include <DS18B20.h> // Gestion des Sonde de température DS18B20
#include <LiquidCrystal_I2C.h> // LCD (Adresse 0x3F
#include <MySensors.h> // Librairie MySensors
// //
// Inclusion des librairies //
//////////////////////////////
//////////////////////////////////////////
// Variables globales pour le programme //
// //
// Températures des sondes
float tempSonde1; // Température de la sonde 1
float tempSonde2; // Température de la sonde 2
float LASTtempSonde1 = 99.99; // Dernière température relevée de la sonde 1
float LASTtempSonde2 = 99.99; // Dernière température relevée de la sonde 2
// Température de consigne
float tempConsigne1 = 24;
float tempConsigne2 = 24;
// Etat du chauffage (en chauffe ou non)
bool chauffe1 = false; // Etat du relais 1
bool chauffe2 = false; // Etat du relais 2
bool LASTchauffe1 = false; // Dernier état du relais 1
bool LASTchauffe2 = false; // Dernier état du relais 2
// Seuil d'Hysteresis
float hysteresis = 0.5;
// //
// Variables globales pour le programme //
//////////////////////////////////////////
/////////////////////////////
// Environnement MySensors //
// //
// On définit les identifiants des noeuds attachés à l'objet.
// Un numéro pour chaque capteur ou actionneur connecté à l'arduino
#define CHILD_ID_TEMP1 0 // Température de la sonde 1
#define CHILD_ID_TEMP2 1 // Température de la sonde 2
#define CHILD_ID_RELAIS1 2 // Etat du relais 1
#define CHILD_ID_RELAIS2 3 // Etat du relais 2
// On créé un objet MyMessage avec en paramètre son dientifiant et son type de données
MyMessage tempMsg1(CHILD_ID_TEMP1, V_TEMP);
MyMessage tempMsg2(CHILD_ID_TEMP2, V_TEMP);
MyMessage relaisMsg1(CHILD_ID_RELAIS1, V_STATUS);
MyMessage relaisMsg2(CHILD_ID_RELAIS2, V_STATUS);
// //
// Environnement MySensors //
/////////////////////////////
// Initialisation du LCD 16x2 en adresse 0x3F
LiquidCrystal_I2C lcd(0x3F,16,2); // 0x3F est l'adresse du LCD obtenu via i2C_Scanner
// Initialisation des relais chauffage sur leur PIN de connexion
TKRelay relais1(5); // relais 1 (chauffage 1) sur PIN 5
TKRelay relais2(6); // relais 2 (chauffage 2) sur PIN 6
// Initialisation des sondes de température de type OnWire sur leur PIN de connexion
#define ONE_WIRE_BUS_1 3 // Sonde 1 sur PIN 3
#define ONE_WIRE_BUS_2 4 // Sonde 2 sur PIN 4
OneWire oneWire_1(ONE_WIRE_BUS_1);
OneWire oneWire_2(ONE_WIRE_BUS_2);
// Initialisation des sondes via la libraire DS18B20
DS18B20 temperature_1(&oneWire_1);
DS18B20 temperature_2(&oneWire_2);
void setup()
{
//////////////////////////////
// Initialisation MySensors //
// //
// envoie la version info du sketch à la Gateway
sendSketchInfo("Semis4Tonyo", "1.0");
// enregitre les capteurs à la passerelle
present(CHILD_ID_TEMP1, S_TEMP); // Température de la sonde 1
present(CHILD_ID_TEMP2, S_TEMP); // Température de la sonde 2
present(CHILD_ID_RELAIS1, S_BINARY); // Etat du relais 1
present(CHILD_ID_RELAIS2, S_BINARY); // Etat du relais 2
// //
// FIN de l'initialisation MySensors //
///////////////////////////////////////
////////////////////////////////////
// Initialisation des équipements //
// //
// Initialisation du LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.noBlink();
// Initialisation de la communciation Série en vitesse 115200
Serial.begin(115200);
// Initialisation des relais 1 et 2 à OFF
relais1.off();
relais2.off();
// Initialisation des sonde de température 1 et 2
temperature_1.begin();
temperature_2.begin();
// //
// FIN de l'initialisation des équipements //
/////////////////////////////////////////////
/////////////////////////////////////////////
// Affichage des informations de démarrage //
// //
Serial.println("Semis4Tonyo");
Serial.println("Start ...");
lcd.setCursor(0, 0);
lcd.print("Semis4Tonyo");
lcd.setCursor(0,1);
lcd.print("Start ...");
delay(3000); // Attendre 1 secondes
lcd.clear();
// //
// FIN d'affichage des informations des démarrage //
////////////////////////////////////////////////////
}
void loop(){
// On récupère les températures
TraitementChangementTempRelais();
// DEBUG Serial affichage de Températures et de l'état des relais
Serial.print("Sonde 1: ");
Serial.println(tempSonde1);
Serial.print("Sonde 2: ");
Serial.println(tempSonde2);
Serial.println("");
Serial.print("Etat relais chauffage 1 : ");
Serial.println(chauffe1);
Serial.print("Etat relais chauffage 2 : ");
Serial.println(chauffe2);
// Activation / Désactivation du chauffage 1
if(tempSonde1 <= (tempConsigne1 - hysteresis)) // Si la température de la sonde 1 est inférieur ou égal à la consigne + l'hystérisis
{
relais1.on(); // On active le relais du chauffage 1
chauffe1 = true; // On passe à 1 l'état de chauffe 1
}
else if (tempSonde1 >= (tempConsigne1 + hysteresis)) // Si la température de la sonde 2 est supérieur ou égal à la consigne - l'hystérisis
{
relais1.off(); // On désactive le relais du chauffage 1
chauffe1 = false; // on passe à 0 l'état de chauffe 1
}
// Activation / Désactivation du chauffage 2
if(tempSonde2 <= (tempConsigne2 - hysteresis)) // Si la température de la sonde 1 est inférieur ou égal à la consigne + l'hystérisis
{
relais2.on(); // On active le relais du chauffage 1
chauffe2 = true; // On passe à 1 l'état de chauffe 1
}
else if (tempSonde2 >= (tempConsigne2 + hysteresis)) // Si la température de la sonde 2 est supérieur ou égal à la consigne - l'hystérisis
{
relais2.off(); // On désactive le relais du chauffage 1
chauffe2 = false; // on passe à 0 l'état de chauffe 1
}
}
//////////////////////////////////////////////////////////////////////////////
// Fonction qui traite les changements de températures et d'état des relais //
// //
void TraitementChangementTempRelais()
{
// Lecture des températures des sondes 1 et 2
temperature_1.requestTemperatures();
temperature_2.requestTemperatures();
// On affecte les températures aux variables tempSonde1 et tempSonde2
tempSonde1 = temperature_1.getTempC();
tempSonde2 = temperature_2.getTempC();
if (LASTtempSonde1 != tempSonde1) // Si changement de température depuis le dernier relevé de la sonde 1
{
// On affiche les infos à l'écran
lcd.setCursor(0,0);
lcd.print("SEM1: Ch:");
lcd.setCursor(5,0);
lcd.print(tempSonde1);
// MySensors - Envoi du message de température de la sonde 1
send(tempMsg1.set(tempSonde1,2));
LASTtempSonde1 = tempSonde1; // On actualise LASTtempSonde1
}
if (LASTtempSonde2 != tempSonde2) // Si changement de température depuis le dernier relevé de la sonde 2
{
// On affiche les infos à l'écran
lcd.setCursor(0,1);
lcd.print("SEM2: Ch:");
lcd.setCursor(5,1);
lcd.print(tempSonde2);
// MySensors - Envoi du message de température de la sonde 2
send(tempMsg2.set(tempSonde2,2));
LASTtempSonde2 = tempSonde2; // On actualise LASTtempSonde2
}
if (LASTchauffe1 != chauffe1) // Si changement d'état sur un relais
{
// On affiche les infos à l'écran
lcd.setCursor(15,0);
lcd.print(chauffe1);
// MySensors - Envoi du message de l'état du relais 1
send(relaisMsg1.set(chauffe1,2));
LASTchauffe1 = chauffe1; // On actualise LASTchauffe1
}
if (LASTchauffe2 != chauffe2)
{
// On affiche les infos à l'écran
lcd.setCursor(15,1);
lcd.print(chauffe2);
// MySensors - Envoi du message de l'état du relais 2
send(relaisMsg2.set(chauffe2,2));
LASTchauffe2 = chauffe2; // On actualise LASTchauffe2
}
}
// //
// FIN de la Fonction qui traite les changements de températures et d'état des relais //
////////////////////////////////////////////////////////////////////////////////////////