deux programmes mysensors sur un arduino

Un forum dédie à vos questions concernant l'intégration à Domoticz des capteurs et gateway mysensors.org
Vincy76
Messages : 13
Enregistré le : 13 janv. 2018, 08:12

deux programmes mysensors sur un arduino

Message par Vincy76 »

Bonjour a tous,
depuis quelques jours je me pose la question de comment on fait pour mettre deux programmes mysensors sur un Arduino.
je m'explique, j'aimerais me faire un capteur de température avec un autre programme qui fait sonner un buzzer en cas de problème, donc faire 1 programme avec le capteur de température et 1 programme qui fait sonner un buzzer, pour ça il n'y a pas de problème mais quand il s’agit de compiler les deux sur un même Arduino je sais pas trop comment faire.
j'ai chercher sur google mais j'ai pas trouvé.

merci d'avance pour vos reponses

Fredok
Messages : 85
Enregistré le : 12 août 2016, 15:04

Re: deux programmes mysensors sur un arduino

Message par Fredok »

Bonjour, il n'y a pas de difficulté
on fait un prg qui gere
-la mesure de temp (dht ou ds18)
-le buzzer
il n'y a pas 2 programmes mais tj un seul

Bye
Opi
RFXCOM
RFLINK 433&315
Mysensors
Wifi & Mqtt

Vincy76
Messages : 13
Enregistré le : 13 janv. 2018, 08:12

Re: deux programmes mysensors sur un arduino

Message par Vincy76 »

Oui mais j ai les deux programmes à part, ils fonctionnent. mais je sais pas trop comment compiler les deux pour en faire un seul. Si quelqu'un a un exemple pour que je puisse m inspiré et le transposé à mon cas.


Envoyé de mon GEM-702L en utilisant Tapatalk

digdogger
Messages : 213
Enregistré le : 16 juil. 2017, 09:21

Re: deux programmes mysensors sur un arduino

Message par digdogger »

Salut,
le problème ne relève plus de MySensor à ce niveau. Il faut revoir les bases de la programmation sur Arduino.
Raspberry Pi 3 + Raspbian Jessie Lite + Domoticz V4.9700 - RFlink USB V48 433.42MHz - Volets Somfy RTS - MySensors USB V2.1.1 - IDE Arduino 1.8.8

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

Re: deux programmes mysensors sur un arduino

Message par domdom »

Il n'y a pas de méthode automatique pour fusionner deux programmes.

Il faut 'juste" comprendre comment les programmes fonctionnent. Avec un peu de volonté (et éventuellement qq explications sur ce forum si tu galères trop), ça n'est pas très compliqué. Et ça ouvre des possibilités géniales (j'ai par exemple à la maison une carte qui gère un capteur de température / hygrométrie, deux capteurs de présence, un buzzer et huit relais).

Vincy76
Messages : 13
Enregistré le : 13 janv. 2018, 08:12

Re: RE: Re: deux programmes mysensors sur un arduino

Message par Vincy76 »

domdom a écrit :Il n'y a pas de méthode automatique pour fusionner deux programmes.

Il faut 'juste" comprendre comment les programmes fonctionnent. Avec un peu de volonté (et éventuellement qq explications sur ce forum si tu galères trop), ça n'est pas très compliqué. Et ça ouvre des possibilités géniales (j'ai par exemple à la maison une carte qui gère un capteur de température / hygrométrie, deux capteurs de présence, un buzzer et huit relais).
Merci domdom.
Aurais tu la possibilité de mettre un extrait de ton programme pour que comprenne comment ça fonctionne.
La volonté je l ai mais je galère un peux je sais pas trop comment partir.

Envoyé de mon GEM-702L en utilisant Tapatalk

hbachetti
Messages : 74
Enregistré le : 03 févr. 2018, 12:44
Localisation : Besançon
Contact :

Re: deux programmes mysensors sur un arduino

Message par hbachetti »

Il suffit en général de copier / coller les deux sketches dans un même fichier. Ensuite il faut réunir le code des deux fonctions setup() au sein d'une seule, ainsi que le code des deux fonctions loop().

Exemple :

Code : Tout sélectionner

#include <MySensors.h>  
#include <DallasTemperature.h>
#include <OneWire.h>

#define SLEEP_TIME            900000L

void setup()
{
  Serial.begin(115200);
}
void setup()
{
  sensors.begin();
}
devient :

Code : Tout sélectionner

void setup()
{
  Serial.begin(115200);
  sensors.begin();
}

Code : Tout sélectionner

void loop()
{
  Serial.print("loop");
  sleep(SLEEP_TIME);
}

void loop()     
{
  readDS18B20();
  sleep(SLEEP_TIME);
}
devient :

Code : Tout sélectionner

void loop()
{
  Serial.print("loop");
  readDS18B20();
  sleep(SLEEP_TIME);
}
Toutes les fonctions portant le même nom (setup, before, presentation, lop()) devront subir la même opération.

Ensuite il faut veiller à :
Regrouper tes directives #include, #define, etc. en haut du fichier, éliminer les doublons.
Éviter d'avoir des variables globales ou statiques portant le même nom.
Si tu veux poster tes deux codes, je peux aider.
@+

Vincy76
Messages : 13
Enregistré le : 13 janv. 2018, 08:12

Re: deux programmes mysensors sur un arduino

Message par Vincy76 »

merci hbachetti pour ton aide.
donc j'ai essayé de faire par moi meme mais ce n'ai qu'une demi victoire car je n'ai que la temperature qui fonctionne mais pas le relais, pourtant il a etait reconnu par domoticz mais impossible de le piloter.

voici le code compilé

Code : Tout sélectionner

// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95

// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE

#include <SPI.h>
#include <MySensors.h> 
#include <DHT.h> 

//zone declarative pour buzzer
#define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay

//zone declarative pour la sonde DHT22
#define CHILD_ID_TEMP 0  
#define CHILD_ID_HUM 1
 
#define DHTPIN 3        // Broche sur laquelle est branché le DHT / what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), DHT11
 
float lastTemp;
float lastHum;
boolean metric = true; 
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);


void before()
{
    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);
        // Set relay to last known state (using eeprom storage)
        digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
    }
}

void setup()
{

}

void presentation()
{
    // Présenttion du sketch / Send the sketch version information to the gateway and Controller
  sendSketchInfo("Sonde Temp/Hum DHT22", "1.0");
 
  // Déclaration des capteurs attachés au noeud
  present(CHILD_ID_TEMP, S_TEMP);
  present(CHILD_ID_HUM, S_HUM);
  
    // Send the sketch version information to the gateway and Controller
    sendSketchInfo("Relay", "1.0");

    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Register all sensors to gw (they will be created as child devices)
        present(sensor, S_BINARY);
    }
}

void loop()      
{    
  DHT dht(DHTPIN, DHTTYPE,3); // Creation d'un objet dht dans la loop sinon les valeurs ne sont pas mesurées au réveil
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  if (isnan(temperature)) {
      Serial.println("Impossible de lire la temperature sur le DHT");
  } else {
    if (temperature != lastTemp) {
      lastTemp = temperature;
      if (!metric) {
        temperature = dht.readTemperature(true);
      }
      
      Serial.print("T: ");
      Serial.print(temperature);
      Serial.print(" | H: ");
      Serial.println(humidity);
      send(msgTemp.set(temperature, 1));
      send(msgHum.set(humidity, 1));
    } else {
      Serial.println("Temperature identique => on force l'envoi");  
      Serial.print("T: ");
      Serial.print(temperature);
      Serial.print(" | H: ");
      Serial.println(humidity);
      send(msgTemp.set(temperature, 1));
      send(msgHum.set(humidity, 1));
    }
  }
  }
Code de base du DHT22

Code : Tout sélectionner

// Active le mode debug / Enable debug prints to serial monitor
#define MY_DEBUG 
 
// Mode Radio / Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
 
#define MY_RF24_PA_LEVEL RF24_PA_LOW
 
// Noeud de l'objet / Object Node
#define MY_NODE_ID 3
 
#include <SPI.h>
#include <MySensors.h> 
#include <DHT.h> 
 
#define CHILD_ID_TEMP 0  
#define CHILD_ID_HUM 1
#define SLEEP_NODE true // Mettre à True pour activer la mise en sommeil (Sleep Mode) / True to activate Sleep Mode
unsigned long SLEEP_TIME = 45 * 1000; // Temps de mise en sommeil (en ms) / Sleep time between reads (in milliseconds)
 
#define DHTPIN 3        // Broche sur laquelle est branché le DHT / what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), DHT11
 
float lastTemp;
float lastHum;
boolean metric = true; 
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
 
void setup() { 
}
 
void presentation()  {
  // Présenttion du sketch / Send the sketch version information to the gateway and Controller
  sendSketchInfo("Sonde Temp/Hum DHT22", "1.0");
 
  // Déclaration des capteurs attachés au noeud
  present(CHILD_ID_TEMP, S_TEMP);
  present(CHILD_ID_HUM, S_HUM);
}
 
void loop()      
{    
  DHT dht(DHTPIN, DHTTYPE,3); // Creation d'un objet dht dans la loop sinon les valeurs ne sont pas mesurées au réveil
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  if (isnan(temperature)) {
      Serial.println("Impossible de lire la temperature sur le DHT");
  } else {
    if (temperature != lastTemp) {
      lastTemp = temperature;
      if (!metric) {
        temperature = dht.readTemperature(true);
      }
      
      Serial.print("T: ");
      Serial.print(temperature);
      Serial.print(" | H: ");
      Serial.println(humidity);
      send(msgTemp.set(temperature, 1));
      send(msgHum.set(humidity, 1));
    } else {
      Serial.println("Temperature identique => on force l'envoi");  
      Serial.print("T: ");
      Serial.print(temperature);
      Serial.print(" | H: ");
      Serial.println(humidity);
      send(msgTemp.set(temperature, 1));
      send(msgHum.set(humidity, 1));
    }
  }  
  
  if (SLEEP_NODE) {
    Serial.println("Sleep");
    sleep(SLEEP_TIME);
  } else {
    delay (SLEEP_TIME);
  }
}
code de base du relais

Code : Tout sélectionner

// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95

// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE

#include <MySensors.h>

#define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay


void before()
{
    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);
        // Set relay to last known state (using eeprom storage)
        digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
    }
}

void setup()
{

}

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

    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Register all sensors to gw (they will be created as child devices)
        present(sensor, S_BINARY);
    }
}


void loop()
{

}

void receive(const MyMessage &message)
{
    // We only expect one type of message from controller. But we better check anyway.
    if (message.type==V_STATUS) {
        // 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());
    }
}

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

Re: deux programmes mysensors sur un arduino

Message par vil1driver »

Salut,

Et en copiant également la partie
void receive
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien

hbachetti
Messages : 74
Enregistré le : 03 févr. 2018, 12:44
Localisation : Besançon
Contact :

Re: deux programmes mysensors sur un arduino

Message par hbachetti »

Dans ton code, il y a bien une déclaration de RELAY_PIN, ensuite une configuration de cette pin en sortie puis une présentation de ton relais au serveur.
Dans ta fonction presentation() il faudrait que tu appelles present() avec un numéro de device différent de 1, car ton capteur d'humidité a déjà cet ID.
Appelr deux fois sendSketchInfo() ne sert à rien, autant regrouper les infos dans un seul appel.

donc voici les modifs que je propose :

Code : Tout sélectionner

#define CHILD_ID_RELAY 2

void presentation()
{
    // Présenttion du sketch / Send the sketch version information to the gateway and Controller
  sendSketchInfo("Sonde Temp/Hum DHT22 + RELAY", "1.0");
 
  // Déclaration des capteurs attachés au noeud
  present(CHILD_ID_TEMP, S_TEMP);
  present(CHILD_ID_HUM, S_HUM);
  present(CHILD_ID_RELAY, S_BINARY);
}
De plus, il te manque une fonction de réception pour piloter ton relais :
Tu as du t'inspirer de ceci :
https://www.mysensors.org/build/relay
Mais tu en as oublié un morceau.
Dans la fonction receive, j'ai remplacé simplement CHILD_ID par CHILD_ID_RELAY :

Code : Tout sélectionner

void receive(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.isAck()) {
     Serial.println("This is an ack from gateway");
  }

  if (message.type == V_LIGHT) {
     // Change relay state
     state = message.getBool();
     digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF);
     // Store state in eeprom
     saveState(CHILD_ID_RELAY, state);

     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
   } 
}

Répondre