Page 1 sur 1

Gateway USB avec DHTnew et Bus CAN

Publié : 10 juin 2020, 15:56
par maticz
Bonjour

après 4jours à ratissé les bas fond du web, je post mon problème.

la base : Domoticz <--- Usb --- Arduino uno <---filaire--- 2x capteurs DHT22 (temp/humidité)

affichage sur le terminal Série de L'IDE :

Code : Tout sélectionner

15:06:04.334 -> 0;255;3;0;14;Gateway startup complete.
15:06:04.334 -> 0;255;0;0;17;2.3.2
15:06:04.334 -> 0;255;3;0;11;TempHumidDHT22
15:06:04.334 -> 0;255;3;0;12;1.1
15:06:04.334 -> 0;1;0;0;7;
15:06:04.334 -> 0;2;0;0;6;
15:06:04.334 -> 0;3;0;0;7;
15:06:04.334 -> 0;4;0;0;6;
15:06:07.351 -> 0;2;1;0;0;20.4
15:06:07.351 -> 0;1;1;0;1;51.2
15:06:07.351 -> 0;4;1;0;0;20.2
15:06:07.351 -> 0;3;1;0;1;52.3

le Human readable output:

https://www.mysensors.org/build/parser? ... 3B1%3B52.3


sur la 2éme sonde les valeurs ne varie pas
(j'ai testé sans la partie MySensors, c'est bon, le câblage est bon)

le croquis :

Code : Tout sélectionner

/*
 *            MYSENSORS V2 - 2020
 * HISTORY: (une base de Henrik EKblad et Torben Woltjen)
 * INFO: 
 * https://www.mysensors.org/download/sensor_api_20 
 * https://www.mysensors.org/download/serial_api_20 
 *  
 * Description:
 * MySensors Gateway USB avec capteurs direct non Hertzien.  
 * 
 * Libraries:
 * - ACAN2515 ver.2.0.4 de pierre Molinaro
 * - DHTNEW Ver:0.1.5 de Rob Tillaart's
 * 
 * Modification:
 * -X- 2 capteurs DHT22 (température-humidité)
 * -o- 
 * -o- 
 * -o- 
 *
 * 
 */

/*   Selection du type de connection */ 
  //#define MY_RS485          //RS485
  #define MY_GATEWAY_SERIAL   // serial gateway

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

  DHTNEW Capteur1 (6);
  DHTNEW Capteur2 (7);

  #define CHILD_ID_HUM_1  1
  #define CHILD_ID_TEMP_1 2
  
   #define CHILD_ID_HUM_2 3
   #define CHILD_ID_TEMP_2 4

  //uint8_t nNoUpdatesTemp2;
  //uint8_t nNoUpdatesHum2;
  //bool metric = true;

/* déclaration du conteneur pour l'envoi de message*/
/* identifiant du capteur et type de variable */
  MyMessage msgHum1(CHILD_ID_HUM_1, V_HUM);
  MyMessage msgTemp1(CHILD_ID_TEMP_1, V_TEMP);
  MyMessage msgHum2(CHILD_ID_HUM_2, V_HUM);
  MyMessage msgTemp2(CHILD_ID_TEMP_2, V_TEMP);

/* liste des types de variables*/
/*https://www.mysensors.org/download/serial_api_20#variable-types */

/*reset du compteur des millisecondes*/
 unsigned long previousMillis = 0;  
/*Fréquence d'utilisation du capteur (60000millisecondes=1mn) */
 const long interval = 3000;

 void setup()      /*------ Setup --------*/
 {
// Serial.begin(115200);
 Capteur1.read();
 Capteur2.read();
 }

 void presentation()    /* -----void MySensors----*/
 { 
  /* Envoi inf de version d'esquisse à la passerelle */
 sendSketchInfo("TempHumidDHT22", "1.1");
  
/* Enregistrez tous les capteurs sur gw */
/*(ils seront créés en tant qu'appareils enfants)*/
  present(CHILD_ID_HUM_1, S_HUM);
  present(CHILD_ID_TEMP_1, S_TEMP);
  present(CHILD_ID_HUM_2, S_HUM);
  present(CHILD_ID_TEMP_2, S_TEMP);
 
 // metric = getControllerConfig().isMetric;
 }

 void loop()   /*----------- Loop ---------*/
 {  
 unsigned long currentMillis = millis();
 /*calcul temps ecouler du capteur*/
     if (currentMillis - previousMillis >= interval)
       {
        previousMillis = currentMillis; 
            
  float temperature1 = Capteur1.temperature;  
  float humidity1 = Capteur1.humidity;
  float temperature2 = Capteur2.temperature;
  float humidity2 = Capteur2.humidity;

/* ------ control des  capteurs  ---------*/ 
    const int error = Capteur1.read(); 
       if (error != DHTLIB_OK)
       { 
       Serial.println(" Panne sur DHT22 ");
        }
                    
/* envoi des valeurs sur le serveur */     
    send(msgTemp1.set(temperature1, 1));
    send(msgHum1.set(humidity1, 1));
    send(msgTemp2.set(temperature2, 1));
    send(msgHum2.set(humidity2, 1));
  
/* --------- Visu sur terminal Debug -------------*/
 /*      Serial.print("humidite 1 : ");
        Serial.print(humidity1);
        Serial.print(" %\t");
        Serial.print("Temperature 1 : ");
        Serial.print(temperature1);
        Serial.println(" C");
         Serial.print("humidite 2 : ");
         Serial.print(humidity2);
         Serial.print(" %\t");
         Serial.print("Temperature 2 : ");
         Serial.print(temperature2);
         Serial.println(" C");
   */     
     }
 }  

 
Pour les DHT22 la librairie et une version DHTNEW Ver:0.1.5 de Rob Tillaart's
pour MySensors c'est version 2.3.2

tester avec un capteur DHT22 et Domoticz c'est bon :D

Merci

pour info:
https://github.com/domoticz/domoticz/issues/276
https://easydomoticz.com/forum/viewtopi ... sor#p43770

Re: Gateway USB et DHTnew

Publié : 10 juin 2020, 16:34
par boum
À vue d'œil, il manque la lecture du 2e capteur dans la fonction boucle loop() :

Code : Tout sélectionner

/* ------ control des  capteurs  ---------*/ 
    const int error1 = Capteur1.read(); 
       if (error1 != DHTLIB_OK)
       { 
       Serial.println(" Panne sur premier DHT22 ");
        }
                    
    const int error2 = Capteur2.read(); 
       if (error2 != DHTLIB_OK)
       { 
       Serial.println(" Panne sur deuxieme DHT22 ");
        }
Aussi, tu envoies les valeurs précédentes au contrôleur. Sur 3s, ce n'est pas grave, mais si tu augmentes l'intervalle, il faudra peut-être ajouter des wait après les CapteurX.read() et récupérer les valeurs après.

Re: Gateway USB et DHTnew

Publié : 10 juin 2020, 17:35
par maticz
.... " il manque la lecture du 2e capteur dans la fonction boucle loop() : "

j'le crois pas :o Impec, les valeurs sont rafraîchi.
( comprend pas pourquoi le control du capteur bloquer le 2eme DHT??)

et pour .."peut-être ajouter des wait " ... oui le temps de latence lecture/mesure des DHT est à prendre en compte.

boum .... merci beaucoup.

Super vais pouvoir continuer mon Binz avec mon module CAN2515/spi et crée une "virtuelle" sur l'Arduino

Re: Gateway USB et DHTnew

Publié : 10 juin 2020, 19:22
par maticz
... champagne pour le Forum :lol:

une recopie du terminal

Code : Tout sélectionner

Configuration du MCP2515
configuration ok

0;2;1;0;0;19.9
0;1;1;0;1;52.2

0;4;1;0;0;20.2
0;3;1;0;1;49.0

0;6;1;0;0;23.2
0;5;1;0;1;48.8
les derniers valeurs remonte par le bus CAN

capteurs virtuel 6 et 5

le croquis brouillon de la Gateway USB CAN ( le nom est pas très clair)

Code : Tout sélectionner

/*
 *            MYSENSORS V2 - 2020
 * HISTORY: (une base de Henrik EKblad et Torben Woltjen)
 * INFO: 
 * https://www.mysensors.org/download/sensor_api_20 
 * https://www.mysensors.org/download/serial_api_20 
 *  
 * Description:
 * MySensors Gateway USB avec capteurs direct non Hertzien.  
 * 
 * Libraries:
 * - ACAN2515 ver.2.0.4 de pierre Molinaro
 * - DHTNEW Ver:0.1.5 de Rob Tillaart's
 * 
 * Modification:
 * -X- 2 capteurs DHT22 (température-humidité)
 * -X- Ajout module ACAN2515
 * -o- 
 * -o- 
 *
 * 
 */

/*   Selection du type de connection */ 
   #define MY_GATEWAY_SERIAL   // serial gateway

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

   #include <ACANBuffer16.h>           /* les buffers */ 
   #include <ACANBuffer.h>
   #include <ACAN2515Settings.h>       /* les reglages */
   #include <ACAN2515.h>               /* le controleur*/
   #include <CANMessage.h>             /* les messages */

  DHTNEW Capteur1 (6);
  DHTNEW Capteur2 (7);

  
  /*---- capteurs virtuel CAN ----  */
  float  T1;  float   H1;  /*capteur 1 */
  float  T2;  float   H2;  /*capteur 2 */
  float  T3;  float   H3;  /*capteur 3 */
  float  T4;  float   H4;  /*capteur 4 */
  
/* ----- MySensors ----*/
  #define CHILD_ID_HUM_1  1
  #define CHILD_ID_TEMP_1 2
   #define CHILD_ID_HUM_2 3
   #define CHILD_ID_TEMP_2 4

   #define CHILD_ID_HUM_3 5 /* test CAN*/
   #define CHILD_ID_TEMP_3 6


  /*  Module CAN MCP2515 */
   static const uint8_t MCP2515_CS  = 10;  /* pin SPI_CS */
   static const uint8_t MCP2515_INT = 2;   /* pin interruption */

    /* objet de type ACAN2515 est instancié pour gérer le MCP2515  */
   ACAN2515 CAN(MCP2515_CS, SPI, MCP2515_INT); /* pin CS,SPI ,pin INT */
   static const uint32_t FREQUENCE_DU_QUARTZ = 8ul * 1000ul * 1000ul; /*quartz du MCP2515*/
   static const uint32_t FREQUENCE_DU_BUS_CAN = 125ul * 1000ul;  /*fréquence du bus*/

   CANMessage message;     /* objets CAN pour les messages en réception */

 /* ---- classement des messages CAN ----*/
 void receive1 (const CANMessage & message)  { 
  const uint16_t capteurs = message.id & 0x1F; 
  
 switch (capteurs) {
  case 10:
    T1 = message.dataFloat[0];
    H1 = message.dataFloat[1];
    break;
  case 11:
    T2 = message.dataFloat[0];
    H2 = message.dataFloat[1];
    break;
  case 12:
    T3 = message.dataFloat[0];
    H3 = message.dataFloat[1];
    break;
  case 13:
    T4 = message.dataFloat[0];
    H4 = message.dataFloat[1];
    break;
    }
   }

// ----- défini masques et filtres pour les messages  ------
  const ACAN2515Mask masque = standard2515Mask( 0, 0, 0); 
  const ACAN2515AcceptanceFilter filtres[] =  {  
   { standard2515Filter( 0, 0, 0), receive1 }
    };

/* déclaration du conteneur pour l'envoi de message*/
/* identifiant du capteur et type de variable */
  MyMessage msgHum1(CHILD_ID_HUM_1, V_HUM);
  MyMessage msgTemp1(CHILD_ID_TEMP_1, V_TEMP);
  MyMessage msgHum2(CHILD_ID_HUM_2, V_HUM);
  MyMessage msgTemp2(CHILD_ID_TEMP_2, V_TEMP);

  MyMessage msgHum3(CHILD_ID_HUM_3, V_HUM);
  MyMessage msgTemp3(CHILD_ID_TEMP_3, V_TEMP);

/* liste des types de variables*/
/*https://www.mysensors.org/download/serial_api_20#variable-types */




/*reset du compteur des millisecondes*/
unsigned long previousMillis = 0;  
/*Fréquence d'utilisation du capteur (60000millisecondes=1mn) */
const long interval = 3000;

void setup()      /*------ Setup --------*/
{
// Serial.begin(115200);
  SPI.begin();           /* bus SPI module CAN */
 Capteur1.read();
 Capteur2.read();

 Serial.println("Configuration du MCP2515");
  ACAN2515Settings reglages(FREQUENCE_DU_QUARTZ, FREQUENCE_DU_BUS_CAN);

  reglages.mReceiveBufferSize = 4;      /* nbr d'emplacement buffer*/
  reglages.mTransmitBuffer0Size = 0;    /* file d'attente d'emission*/
  
  /* Demarrage et control d'erreur du CAN */ 
  const uint16_t codeErreur = CAN.begin(reglages,[] {CAN.isr(); }, masque, filtres, 1 );
     
  if (codeErreur == 0) {
    Serial.println("configuration ok"); }
    else {
    Serial.println("Probleme de connexion");
    while (1); 
    }
 
}

 void presentation()    /* -----void MySensors----*/
 { 
  /* Envoi inf de version d'esquisse à la passerelle */
 sendSketchInfo("TempHumidDHT22", "1.1");
  
/* Enregistrez tous les capteurs sur gw */
/*(ils seront créés en tant qu'appareils enfants)*/
  present(CHILD_ID_HUM_1, S_HUM);
  present(CHILD_ID_TEMP_1, S_TEMP);
  present(CHILD_ID_HUM_2, S_HUM);
  present(CHILD_ID_TEMP_2, S_TEMP);

  present(CHILD_ID_HUM_3, S_HUM);
  present(CHILD_ID_TEMP_3, S_TEMP);
 
 // metric = getControllerConfig().isMetric;
}



void loop()   /*----------- Loop ---------*/
{  

 unsigned long currentMillis = millis();
 /*calcul temps ecouler du capteur*/
     if (currentMillis - previousMillis >= interval)
       {
        previousMillis = currentMillis; 
            
  float temperature1 = Capteur1.temperature;  
  float humidity1 = Capteur1.humidity;
  float temperature2 = Capteur2.temperature;
  float humidity2 = Capteur2.humidity;

  float temperature3 = T1;
  float humidity3 = H1;

/* ------ control des  capteurs  ---------*/ 
    const int error = Capteur1.read(); 
       if (error != DHTLIB_OK)
       { 
       Serial.println(" Panne sur DHT22 ");
        }
     const int error2 = Capteur2.read(); 
       if (error2 != DHTLIB_OK)
       { 
       Serial.println(" Panne sur deuxieme DHT22 ");
        }    
                    
/* envoi des valeurs sur le serveur */     
    send(msgTemp1.set(temperature1, 1));
    send(msgHum1.set(humidity1, 1));
    send(msgTemp2.set(temperature2, 1));
    send(msgHum2.set(humidity2, 1));

     send(msgTemp3.set(temperature3, 1));
    send(msgHum3.set(humidity3, 1));
  
/* --------- Visu sur terminal Debug -------------*/
 /*      Serial.print("humidite 1 : ");
        Serial.print(humidity1);
        Serial.print(" %\t");
        Serial.print("Temperature 1 : ");
        Serial.print(temperature1);
        Serial.println(" C");
         Serial.print("humidite 2 : ");
         Serial.print(humidity2);
         Serial.print(" %\t");
         Serial.print("Temperature 2 : ");
         Serial.print(temperature2);
         Serial.println(" C");
   */  
   
 CAN.dispatchReceivedMessage();
/* 
  Serial.print(T1);
  Serial.print( " :A: ");
  Serial.println(H1);
  
  Serial.print(T2);
  Serial.print( " :B: ");
  Serial.println(H2);
  
  Serial.print(T3);
  Serial.print( " :C: ");
  Serial.println(H3);

  Serial.print(T4);
  Serial.print( " :D: ");
  Serial.println(H4);
  delay(2000); // pose de Delay et Serial.print pour test
  */ 
       }
}  

 

Re: Gateway USB et DHTnew

Publié : 10 juin 2020, 20:31
par maticz
... la partie DomoTicz

une recopie des Log

Code : Tout sélectionner

.......
2020-06-10 20:04:53.924 Status: MySensors: Worker started...
2020-06-10 20:04:54.924 Status: MySensors: Using serial port: /dev/ttyACM0
2020-06-10 20:04:56.651 Status: MySensors: Node: 0, Sketch Name: TempHumidDHT22
2020-06-10 20:04:56.651 Status: MySensors: Node: 0, Sketch Version: 1.1
2020-06-10 20:07:38.546 Status: EventSystem: reset all device statuses...
2020-06-10 20:08:49.061 Status: EventSystem: reset all device statuses...
2020-06-10 20:08:54.365 Status: EventSystem: reset all device statuses...
2020-06-10 20:11:04.345 Status: EventSystem: reset all device statuses...
2020-06-10 20:20:08.593 (mysensors DHT CAN) Temp + Humidity (TempHum)
2020-06-10 20:20:08.602 (mysensors DHT CAN) Temp + Humidity (TempHum)
2020-06-10 20:20:08.611 (mysensors DHT CAN) Temp + Humidity (TempHum CAN)
.......

et en pièce joint une recopie d’écran de Domoticz