Bonsoir,
Après une semaine d'essai, ce soir c'est ma soirée question / réponse
Peut-être le type de widget utilisé ??

- Fuite Zone.jpg (25.25 Kio) Consulté 3326 fois
Les widgets "texte" n'aurait pas de "notification" ?
C'est le 12e caractère de la chaîne
de quelle chaîne ?
send(msgFuiteZone1.set(zoneIndex));
Après l'avoir mis opérationnel dans arduino, j'ai une action "on " ou "off" sur un interrupteur dans Domoticz, mais je n'arrive pas à savoir à quel moment cela se produit
Code : Tout sélectionner
#define MY_GATEWAY_SERIAL
#include <MySensors.h>
//Definition des NODES:
#define NODE_ID_FUITE_ZONE1 1
#define NODE_ID_FUITE_TEXTE 4
//https://www.mysensors.org/download/serial_api_20
// pour une node fuite d'eau il faut utiliser V_TRIPPED ou V_ARMED
MyMessage msgFuiteZone1(NODE_ID_FUITE_ZONE1, V_TRIPPED);
MyMessage msgFuiteTexte(NODE_ID_FUITE_TEXTE, V_TEXT);
#include <Wire.h> // Bibliothèque pour la communication I2C
#include <LiquidCrystal_I2C.h> // Bibliothèque pour le contrôle de l'écran LCD en mode I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // Adresse I2C de l'écran LCD 20x4
const int brocheDebit = 2; // Broche de la sonde de débit d'eau
const int brocheElectrovanne = 3; // Broche pour contrôler l'électrovanne
const int brocheBouton = 4; // Broche du bouton-poussoir pour remise à zéro
unsigned int compteImpulsions = 0;
float debitInstantane = 0.0;
float totalLitres = 0.0; // Changement d'unité de litres à mètres cubes
unsigned long tempsPrecedent = 0;
const long intervalle = 500; // Intervalle d'échantillonnage en millisecondes
const unsigned long delaiFermetureElectrovanne = 1000; // Délai de fermeture de l'électrovanne en millisecondes
enum Etat { REPOS,
ACTIF,
STOP };
// tous les éléments contenus dans la structure seront identifiés par un . précédant le nom de l'élément à rechercher
//par exemple, pour identifier le "seuilDebitCoupe", on inscrit "digitalRead(zone.seuilDebitCoupe)"
struct SZone {
const byte broche; // N° de la broche pour information de la zone d'arrosage
const float seuilDebitCoupe; // Débit maxi autorisé
Etat etat; //
unsigned long tempsDebutDebit;
unsigned long tempsDebutEtat;
};
SZone zones[] = {
{5, 1.1, REPOS, 0, 0}, // N° broche , Débit maxi, Etat etat , temps début débit, temps début Etat
{6, 2.1, REPOS, 0, 0},
{7, 3.1, REPOS, 0, 0},
{8, 4.1, REPOS, 0, 0},
{9, 5.1, REPOS, 0, 0},
{10, 6.1, REPOS, 0, 0}
};
void setup() {
lcd.begin(20, 4); // Initialisation de l'écran LCD 16x2
lcd.print("Debit: 0.0 m3/h");
lcd.setCursor(0, 1);
lcd.print("Total: 0.0 m3");
pinMode(brocheDebit, INPUT);
pinMode(brocheElectrovanne, OUTPUT);
pinMode(brocheBouton, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(brocheDebit), compteurImpulsions, FALLING);
}
void loop() {
unsigned long tempsActuel = millis(); // Obtient le temps actuel en millisecondes
if (tempsActuel - tempsPrecedent >= intervalle) {
// calcul et affichage du débit
noInterrupts();
unsigned int compteurLocal = compteImpulsions; // Conversion du nombre d'impulsions en débit instantané en Litres par minute
compteImpulsions = 0;
interrupts();
tempsPrecedent = tempsActuel;
float volume=compteurLocal/450.0; // volume en litre
debitInstantane=volume/intervalle*1000*60; // débit en l/mn
totalLitres += volume;
lcd.clear();
lcd.print("Debit: ");
lcd.print(debitInstantane, 0);
lcd.print(" L/mn");
lcd.setCursor(0, 1);
lcd.print("Total: ");
lcd.print(totalLitres, 0);
lcd.print(" L");
}
for (auto &zone : zones) // effectue le traitement pour toutes les zones
{
if (digitalRead(zone.broche) == HIGH) { //Lecture de l'information de l'arrosage de la Zone
switch (zone.etat) {
case REPOS:
digitalWrite(brocheElectrovanne, HIGH);
if (debitInstantane > zone.seuilDebitCoupe) {
zone.tempsDebutDebit = tempsActuel;
zone.etat = ACTIF;
}
break;
case ACTIF:
if (debitInstantane > zone.seuilDebitCoupe) {
if (tempsActuel - zone.tempsDebutDebit >= delaiFermetureElectrovanne) {
digitalWrite(brocheElectrovanne, LOW);
zone.etat = STOP;
zone.tempsDebutEtat = tempsActuel;
}
} else {
zone.etat = REPOS;
}
break;
case STOP:
const int zoneIndex = &zone - zones + 1;
//lcd.clear(); // Effacer l'écran après le message de démarrage
lcd.setCursor(0, 2);
lcd.print("Fuite Zone "); // Affiche un avertissement de fuite
lcd.print(zoneIndex); // affiche numéro de zone
//A placer a l'endroit de ton code ou tu veux remonter la fuite dans domoticz:
send(msgFuiteZone1.set(zoneIndex));
char messageFuite[] = "Fuite zone 0";
messageFuite[11] += zoneIndex;
send(msgFuiteTexte.set(messageFuite));
//lcd.clear(); // Effacer l'écran après le message de démarrage
//lcd.setCursor(0, 2);
//lcd.print("Fuite Zone"); // Affiche un avertissement de fuite
//lcd.print(&zone - zones + 1); // affiche numéro de zone
//A placer a l'endroit de ton code ou tu veux remonter la fuite dans domoticz:
//send(msgFuiteZone1.set(1));
//send(msgFuiteTexte.set("Fuite zone 1"));
// Nouvelle condition pour la réinitialisation avec maintien de 2 secondes
if (digitalRead(brocheBouton) == LOW) {
if (tempsActuel - zone.tempsDebutEtat >= 2000) {
digitalWrite(brocheElectrovanne, HIGH);
zone.etat = REPOS;
lcd.setCursor(0, 0);
lcd.print(" "); // Efface le texte "Fuite" lors du retour à l'état REPOS
lcd.setCursor(0, 1);
lcd.print(" "); // Efface le texte "Fuite" lors du retour à l'état REPOS
}
} else {
zone.tempsDebutEtat = tempsActuel;
}
break;
}
}
}
}
void compteurImpulsions() {
compteImpulsions++;
}
//Fonction de presentation a rajouter
void presentation()
{
// Present locally attached sensors
present(NODE_ID_FUITE_ZONE1, S_WATER_LEAK);
present(NODE_ID_FUITE_TEXTE, S_INFO);
}
Dernière question
Oui les pins TX et RX,(UART) comme le port USB(SERIAL) de l'arduino permettent une communication série.
Donc en principe tout ce que tu as pu lire ci-dessus est applicable aux 2 branchements.
Avec un rappel sur l'UART, il te faudra probablement adapter les niveaux de tensions 3v3/5v.
En utilisant mon cable USB de l'arduino connecté au Raspberry, je ne peux pas télécharger le code dans l'Arduino, et vice versa
Puis-je utiliser les broches TX et RX de l'arduino et du Raspberry pour moyen de communication entre les deux ?
Si oui, merci de me confirmer que la broche TX d'un doit être reliée à RX de l'autre , et vice versa ?
Ce n'est peut-être pas trop sympa de ma part de vous solliciter autant en week-end !!, mais votre aide est trop précieuse pour comprendre tous ces langages
Merci encore