sensors et relais

Un forum dédie à vos questions concernant l'intégration à Domoticz des capteurs et gateway mysensors.org
Répondre
gigi71960
Messages : 8
Enregistré le : 27 oct. 2015, 19:50

sensors et relais

Message par gigi71960 » 28 juil. 2019, 10:16

Bonjour, j'ai un soucis de programmation sur mon "multi" capteur mysensors c'est un capteur ultrason + 1 relais relié a domoticz j'envoie la distance a domoticz et celui-ci pilote le relais
le but lorsque j'arrive à 20 cm le relais doit se déclenché le code fonctionne mais pas tout le temps :(
sur domoticz le relais change bien etat la distance est bonne mais physiquement le relais change pas toujours état :?


Code : Tout sélectionner

// Enable debug prints to serial monitor
#define MY_DEBUG 

// Enable and select radio type attached
#define MY_RADIO_RF24

// Enabled repeater feature for this node
#define MY_REPEATER_FEATURE

#include <MySensors.h>

///////////////////////////////////////////////////////////////////////
//RELAIS
///////////////////////////////////////////////////////////////////////
#include <NewPing.h>
#include <Bounce2.h>
#define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
#define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
#define CHILD_ID 1   // Id of the sensor child
#define RELAY_ON 1
#define RELAY_OFF 0

Bounce debouncer = Bounce(); 
int oldValue=0;
bool state;

MyMessage msg1(CHILD_ID,V_LIGHT);



///////////////////////////////////////////////////////////////////////
//DISTANCE
///////////////////////////////////////////////////////////////////////
#include <NewPing.h>
#define CHILD_ID 1
#define TRIGGER_PIN  6  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     5  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
unsigned long SLEEP_TIME = 5000; // Sleep time between reads (in milliseconds)

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
MyMessage msg2(CHILD_ID, V_DISTANCE);
int lastDist;
bool metric = true;







void setup()  
{  
///////////////////////////////////////////////////////////////////////
//RELAIS
///////////////////////////////////////////////////////////////////////
  
  // Setup the button
  pinMode(BUTTON_PIN,INPUT);
  // Activate internal pull-up
  digitalWrite(BUTTON_PIN,HIGH);
  
  // After setting up the button, setup debouncer
  debouncer.attach(BUTTON_PIN);
  debouncer.interval(5);

  // Make sure relays are off when starting up
  digitalWrite(RELAY_PIN, RELAY_OFF);
  // Then set relay pins in output mode
  pinMode(RELAY_PIN, OUTPUT);   
      
  // Set relay to last known state (using eeprom storage) 
  state = loadState(CHILD_ID);
  digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);


///////////////////////////////////////////////////////////////////////
//DISTANCE
///////////////////////////////////////////////////////////////////////
{ 
  metric = getControllerConfig().isMetric;
}

}

void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Relay & Button & Distance Sensor", "1.0");

  // Register all sensors to gw (they will be created as child devices)
  present(CHILD_ID, S_LIGHT);
  present(CHILD_ID, S_DISTANCE);
  
}


void loop()      
{     
  int dist = metric?sonar.ping_cm():sonar.ping_in();
  Serial.print("Ping: ");
  Serial.print(dist); // Convert ping time to distance in cm and print result (0 = outside set distance range)
  Serial.println(metric?" cm":" in");

  if (dist != lastDist) {
      send(msg2.set(dist));
      lastDist = dist;
  }

  sleep(SLEEP_TIME);





{     
  int dist = metric?sonar.ping_cm():sonar.ping_in();
  Serial.print("Ping: ");
  Serial.print(dist); // Convert ping time to distance in cm and print result (0 = outside set distance range)
  Serial.println(metric?" cm":" in");

  if (dist != lastDist) {
      send(msg1.set(dist));
      lastDist = dist;
  }

  sleep(SLEEP_TIME);
}
}

void receive(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.type==V_LIGHT) {
     // Change relay state
     digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
     // Store state in eeprom
     saveState(message.sensor, message.getBool());
     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
   } 
}

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


boum
Messages : 11
Enregistré le : 18 janv. 2019, 11:34
Localisation : France

Re: sensors et relais

Message par boum » 28 juil. 2019, 11:27

Bonjour,
Je n'ai pas encore commencé à expérimenter avec MySensors, mais est-ce qu'il ne faudrait pas 2 ID différentes pour les deux systèmes ?

Code : Tout sélectionner

// Register all sensors to gw (they will be created as child devices)
  present(CHILD_ID_RELAY, S_LIGHT);
  present(CHILD_ID_DISTANCE, S_DISTANCE);
Domoticz v4.10717 sur Pi³ / Z-Wave / RFXCom

gigi71960
Messages : 8
Enregistré le : 27 oct. 2015, 19:50

Re: sensors et relais

Message par gigi71960 » 28 juil. 2019, 11:41

Bonjour, non je ne pense pas que cela est du à un probléme ID tout fonctionne correctement, sauf que de l'info de collage du relais est donné qu'une seul fois et de temps en temps je loupe l'info et le relais ne change pas état :?

Rpx
Messages : 53
Enregistré le : 07 mars 2018, 00:01

Re: sensors et relais

Message par Rpx » 03 août 2019, 20:39

Bonjour, gigi71960

L' utilistation de ce système manque de précisions, je ne vois pas bien à quoi il sert:
Un schéma serait pertinent. Avec quel Arduino fonctionne-t-il?
Actionner un relais quand une distance change ?
Le système est-il fixe ou mobile et quel est l' objet dont la distance est mesurée ?
L' alimentation est-elle prermanente ? Et que commute le relais ? Une lampe, une gâche électrique, une pompe ?
Avec des informations complémentaires il serait peut être possible d'imaginer le pourquoi de l'intermittance.

Et de savoir pourquoi il y a dans la boucle principale deux :

Code : Tout sélectionner

sleep(SLEEP_TIME);
qui mettent le processeur en veille pour 5 secondes à chaque fois et si pendant ce temps là, le controlleur envoie un message ... peu de chance qu'il soit reçu.
Es-ce pour mettre une temporisation, ou économiser l' énergie ?
Et que se passe-t-il lors des mises en veilles, le relais activé le reste-t-il ?
Il faudrait faire un test en supprimant les mises en veille et les remplacer dans les blocs concernés par une variable stokant une valeur -millis()- qui permettrait de déclancher une mesure toutes les 5 secondes ou autre suivant le besoin..

Mais je n'ai pas forcément bien compris la partie logicielle.

Rpx.

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


gigi71960
Messages : 8
Enregistré le : 27 oct. 2015, 19:50

Re: sensors et relais

Message par gigi71960 » 04 août 2019, 10:10

bonjour, rpx
effectivement je n'ai pas précisé l’utilisation de ce système
- ce système consiste a être utilisé dans le domaine de l' aquariophilie il me servirait a remplacer un système osmolation (complètement eau lorsque le bac ce vide ) je pourrais effectivement utilisé des flotteurs mais l'encombrement et présent et le risque qu'un flotteur ce bloque existe j'en ai fait plusieurs fois l’expérience :oops:
donc le relais piloterais une pompe

le système fonctionnerais avec un Arduino nano le sensor serais fixé au dessus de mon bac de décante afin de mesuré la "hauteur" d'eau qui varie dans le bac et renvoi l'info a domoticz
lorsque domoticz a l'info qu'il y a moins de 18 cm eau il envoie l'info du collage du relais pour démarrer la pompe et s' arrête lorsque la distance arrive a 20cm

je ne maitrise pas bien le langage arduino j'ai simplement récupérer les deux ligne de code du site Mysensors pour essayer de n'en faire q'une mais lorsque j'enleve les "sleep time" c'est encore pire

Peut tu me guider avec ton idées
"Il faudrait faire un test en supprimant les mises en veille et les remplacer dans les blocs concernés par une variable stokant une valeur -millis()- qui permettrait de déclancher une mesure toutes les 5 secondes ou autre suivant le besoin.."

Régis

domdom
Messages : 62
Enregistré le : 20 mai 2016, 10:48
Localisation : Ille-et-Vilaine

Re: sensors et relais

Message par domdom » 04 août 2019, 11:54

Bonjour,
Quel type de relais utilises-tu ? Ne serait-ce pas un module relais 5v que tu pilotes en 3,3v ? Dans ce cas, ça marche souvent, mais des fois pas...
Bonne journée

Rpx
Messages : 53
Enregistré le : 07 mars 2018, 00:01

Re: sensors et relais

Message par Rpx » 04 août 2019, 14:06

Bonjour, gigi71960,

@ domdom, s' il utilise un Nano, c'est sûrement du 5v 16Mhz, mais cela dépends aussi de l' alimentation du relais, il faut qu'elle puisse fournir la puissance nécessaire ...

@ gigi71960, d' accord, je comprend mieux, même si l' aquariophilie n'est pas du tout mon domaine, vérifier toutes les 5 secondes l' évaporation de l' eau d'un aquarium, c'est peut être un peu trop, mais c'est un début.

Pour ce qui est de la programmation Arduino, -les spécialistes me corrigeront si je dis des âneries- est divisée en plusieurs sections:
1/ une zone de définitions paramètres et inclusions en début de programme.
2/ une zone de setup -void setup()- d'initialisation générale.
3/ une zone de présentation -void presentation()- qui présente le module à la passerelle correspondante.
4/ une zone de boucle -void loop()- le programme exécuté qui boucle à l'infini jusqu'à coupure du courant.

Les parties 1 à 3 ne sont lues qu'une seule fois au démarrage puis la 4 boucle indéfiniment.

Je n'ai pas étudié le comportement de la fonction sleep() qui n'existe pas dans l' Arduino, mais est spécifique à MySensors.
Mais je pense qu'elle utilise les fonctions Arduino pour mettre le processeur en veille avec les "timers" en fonction et le réveiller à la fin du temps prédéfini.
Donc, au réveil le programme se poursuit à l'instruction suivante.

Mais pour réaliser la surveillance du niveau de l'eau, il n'y a pas besoin d'utiliser Domoticz, tout peut se faire en local sur l' Arduino.
Avec des fonctions supplémentaires comme gestion des températures, de l'éclairage etc...

Voir la référence Arduino sur le net https://www.arduino.cc/reference/en/ -en Anglais-
ou mieux, parcourir http://mon-club-elec.fr/
variable = millis() renvoie le nombre du millisecondes dans un type unsigned long depuis le lancement du programme.
Petit problème, au bout d'environ 50 jours, le comptage repart à zéro.
Il suffit de mettre le bloc dans un test et n'y passer que toutes le x millisecondes.

exemple:

if tmp0=0 then tmp0=millis() //la première fois mise à jour. Il faut penser à à créer les variables en zone 1 et à les initialiser en zone 2

tmp1=millis()
if tmp1-tmp0 > duree then

//... on exécute le bloc et on recale tmp0

tmp0=millis()
elseif
// si la duree n'est pas atteinte on ne fait rien on passe à la suite
endif // Fin de test.


Enfin, pour parer au problème des 50 jours, il suffit de faire un test suppémentaire pour s'assurer que tmp1 est plus grand qu tmp0

Voilà ce que ça peut donner en code Arduino après positionnement des parenthéses, accolades et autres points-vigules... :

Code : Tout sélectionner

//
unsigned long tmp0;
unsigned long tmp1;
unsigned long duree;


void setup() {
duree = 5000;
tmp0 = 0;
}

void loop() {
  
if (tmp0==0) {
  tmp0=millis() ; //la première fois mise à jour. Il faut penser à à créer les variables en zone 1 et à les initialiser en zone 2
}
// Début de test.
tmp1=millis();
if (tmp1 > tmp0 && (tmp1-tmp0) > duree) {

//... on exécute le bloc et on recale tmp0 à la valeur actuelle

tmp0=millis();
}
else {
// si la duree n'est pas atteinte on ne fait rien on passe à la suite
}   // Fin de test.  
 
}  // Fin de void loop()

J'espère que c'est compréhensible.

Rpx.

gigi71960
Messages : 8
Enregistré le : 27 oct. 2015, 19:50

Re: sensors et relais

Message par gigi71960 » 05 août 2019, 14:53

bonjour,
merci Rpx pour ta réponse et ton implication le choix de passer par my sensors et domoticz me permet d'avoir une visu du niveau et de contrôler a distance , créer des alarmes (sms, mail, ... )en cas de problème.
je souhaite vraiment que les infos passe par domoticz

Régis

vil1driver
Messages : 5030
Enregistré le : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: sensors et relais

Message par vil1driver » 05 août 2019, 15:05

Salut,

Tester le retour à zero de millis() n'est pas nécessaire.
Autrement ceci aurait été plus juste

Code : Tout sélectionner

tmp1 < tmp0 || (tmp1-tmp0) > duree
Open your calculator, to Progamming mode. Select HEX mode.
Unsigned long goes from 0000 0000 to FFFF FFFF, 32 bits.

Time comparisons are done using subtraction: current time - earlier time.
So a post rollover number, say 0000 0010, minus a pre-rollover number, FFFF FF00, will result in a correct result:
FFFF FFFF 0000 0110
Ignoring the upper 32 bits of the 64 bit result leave 0000 0110, which is the correct answer: 100 befor the rollover + 10 after = 110.
Arduino does the same - results past the lowe 32 bits fall off.
Looking in the decimal world leads to confusion - need to look at in binary world (with HEX just being a convenient to look at binary)
https://forum.arduino.cc/index.php?topic=184596.0

L'initialisation de tmp0=millis() au début n'est pas indispensable, on ne va pas chipoter pour quelque milisecondes.. ;)

Je me passerais probablement de l'instruction else.. A moins d'en avoir besoin.

https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

.
MAJ = VIDER LE CACHE(<-Clicable)


Domoticz v4.10078 (ubuntu server) OpenZwave v1.4-3229 (zwave+ sigma designs) rfxtrx433 fw1015T1

433mhz : thgn800, ms13e2, phenix, Di.O, zk1pa, creasol sender
868mhz : fgms-001, fgfs-101, dsd37-zweu, ZW098


modules.lua

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre