Sonde de température Wifi autonome a base d'ESP8266 et capteur BMP280 / BME280.

Nous allons construire une sonde wifi afin de suivre la température, l'humidité et la pression atmosphérique depuis notre serveur domotique. 



Au grès de mes ballades bucoliques sur les sites de composants électroniques, je me suis laissé tenté par la description d'un composant qui porte le joli petit nom de "Nouveau BMP280 Atmosphérique Pression Capteur Température Breakout Humidité R3N7". Je n'avais pas vraiment d'idée de comment il fonctionne mais j'avais compris que grosso modo c'est un capteur de température et de pression atmosphérique. J'avais déjà "joué" avec des capteurs de température dans mes précédents articles (ICI et LA). C'était des DHT11 et la différence avec le BMP280 est que ce dernier fait capteur de pression atmosphérique. Bien que n'ayant aucune idée de comment fonctionne ce machin et de ce à quoi allait me servir de suivre la pression atmosphérique, j'en ai commandé deux dans l'idée de réaliser une petite sonde wifi DIY.  Il va falloir défricher et creuser ... tout ce que j'aime... allons-y!









Premier contact


Si vous vous souvenez, a la fin de l'article dans lequel j'ai étudié la courbe de décharge d'un accu (ICI), j'ai réalisé un montage qui permettait à un ESP8266 de lire la température et l'humidité ambiante en utilisant un capteur DHT11. Je n'étais pas hyper satisfait de ce capteur car dans ses caractéristiques le niveau de précision de la température était donné à 2°C près. Je me suis donc demandé si on pouvait trouver mieux. C'est alors que je suis tombé sur le BMP280 (ou BME280).

Commande et réception

Disons le tout de suite (attention spoiler) le BMP280 est l'ancien modèle de cette série de capteurs. Désormais le composant le plus récent est le BME280 qui est identique mais qui en plus embarque un capteur d'humidité et quelques améliorations (comme la fréquence de mesure qui passe à 157Hz). L'inconvénient est qu'un BME280 sera plus cher qu'un BMP280 (on parle de 2 ou 3 euros, pas plus).

Définition: Le BMP/BME280 est un capteur d'environnement précis et bon marché. Créé par Bosh on le retrouve fabriqué par différents sous-traitants. En général il est vendu soudé sur un circuit imprimé qui permet à l'utilisateur d'accéder aux broches de contrôle et fourni quelques résistances de protection.

Savoir reconnaître le BMP du BME

Que ce soit par manque de connaissances, parce que les chaines logistiques ne savent pas faire la différence, parce que la carte du circuit imprimé est parfois la même pour les deux modèles ou tout simplement pour arnaquer l'acheteur, les vendeurs ne font pas souvent la distinction entre les BMP280 et les BME280. Nous allons voir ici comment essayer de ne pas nous faire avoir et ne pas se faire livrer le moins cher au prix du plus cher.

Le composant BMP/BME280 n'est pas tout le circuit imprimé mais juste le tout petit carré argenté:


 Sur ce dernier on peut apercevoir deux choses: 
  • Un petit trou qui va permettre de laisser rentrer l'air dans la coque protectrice. 
  • Quelques inscriptions, sur deux lignes constituées par:
    • 3 digits alphanumériques sur la première ligne
    • 2 digits alphanumériques sur la secondes. Le premier de ces deux digits est soit K, soit U. Si c'est un K alors le composant est un BMP280*. Si c'est un U alors c'est un BME280*.
*Cette caractéristique est décrite dans les datasheet des composants. Page 41 pour le BMP ICI. Et page 44 pour le BME ICI. Et pour ceux d'entre vous qui parlent Anglais j'ai trouvé pas mal de choses intéressantes sur CETTE page du blog de Gough Lui.
Voici en photo de près ce que cela donne:

Modules BMP280 (en haut) vs BME280 (en bas)

Sur l'image ci-dessus nous voyons en haut deux modules BMP280 avec leur nomenclature où l'on reconnait bien le K sur la deuxième ligne. Et en dessous on voit un module BME280 que l'on reconnait avec le U en début de la seconde ligne. 

Le composant étant minuscule, afin d'être exploitable nous l'achetons soudé sur un circuit imprimé. Et là aussi on va trouver dans le commerce différentes formes et couleurs pour ce dernier. De plus il sera difficile de savoir si nous avons un BME ou BMP en lisant les inscriptions sur la plaque car cette dernière est en générale prévue pour accueillir les deux composants. Ainsi la nomenclature sur celle-ci sera par exemple:

GY-BM ME/PM 280

Cette nomenclature signifie juste que nous pouvons avoir un BME ou un BMP.

Pour la couleur j'ai vu des plaques bleues et des violettes. Souvent les plus récentes sont les violettes.

C'est aussi sur le circuit imprimé que l'on saura quelle interface utilisateur est fournie. En général ce sera soit I2C*, soit SPI, soit les deux. Pour avoir les deux protocoles il faudra 6 "trous". Les plaques qui n'offrent que 4 "trous" seront uniquement I2C (je précise que ce que j'appelle "trou" correspond aux pins du circuit imprimés. Mais pour avoir des pins accessibles sous forme de broches il faudra jouer du fer à souder).

Il y a également des constructeurs tels qu'Adafruit qui fournissent des modules où tout est écrit dessus. Mais la qualité a souvent un prix et ces derniers sont (beaucoup) plus chers. Je vous donnerais quelques liens pour en trouver dans le paragraphe suivant.
*Nous allons développer cet aspect un peu plus loin dans cet article.

Pour ne pas vous tromper lors de votre achat voici mes conseils: 
  • Essayez de voir sur la photo le code U ou K inscrit sur le composant. 
  • Choisissez plutôt une plaque violette. 
  • Choisissez plutôt une plaque avec 6 trous qui sera la garantie d'un module compatible I2C et SPI.
  • Dans la description sur le site de vente, ne vous fiez pas seulement au titre (qui fait souvent apparaître Humidité/Température/Pression) mais regardez si dans la description de l'objet la lecture de l'humidité est vraiment détaillée. Si c'est le cas vous pouvez vous attendre à un BME même si vos chances de recevoir un BMP ne sont pas nulles.
  • Et pour finir il y a le prix. Les BME sont plus chers (au moins le double) que les BMP. Si vous trouvez une affaire à moins d'1€ c'est qu'il s'agit surement d'un BMP. 


Où le trouver  ?

Lors de ma commande je ne connaissais pas cette distinction. J'ai donc cherché "BMP280" car c'est ce qui était conseillé dans certaines forum et je suis tombé sur un article eBay dont le titre était "Nouveau BMP280: capteur temperature/pression/humidité". Ne sachant pas encore que le BMP280 ne faisait pas capteur d'humidité, je me suis dit que si c'est le nouveau alors c'est encore mieux et je me suis laissé convaincre. Au final, je me suis fait refourguer le modèle BMP qui n’intègre pas la mesure du niveau d'humidité. C'est un peu frustrant d'avoir la sensation de s'être fait avoir mais dans ce cas, si cela vous arrive aussi, dites vous que ce n'est pas si grave car avoir la pression atmosphérique et la température de manière précise ce n'est déjà pas si mal.

J'ai commandé sur eBay en suivant ce lien ICI. Si quand vous lirez ces lignes,  s'il n'y en a plus de disponible vous pouvez en trouver sur Amazon quasiment au même prix ICI. Et si vous êtes trop pressés pour attendre les 6 à 8 semaines de livraison depuis la chine et que vous pouvez mettre quelques euros en plus, achetez ceux qui bénéficient du service Amazone Prime pour une livraison sous un ou deux jours. J'ajoute également des liens vers le BME280 (sur eBay c'est ICI) qui est un peu plus cher mais permettra d'avoir le niveau d'humidité en plus:




Et si vous êtes riches, le meilleur moyen d'avoir un capteur de qualité avec la certitude de ne pas vous tromper, reportez vous vers les circuits de la marque Adafruit. Tout est clairement indiqué et lisible sur le PCB et pas d'arnaque possible. Pour le BMP280 voyez ICI et pour le BME un exemple ICI.

Déballage de ma commande

Quelques semaine après ma commande (6 environ) j'ai la joie ... que dis-je ... le bonheur! de trouver dans ma boite aux lettre ce petit sachet en plastique gris caractéristique des colis en provenance direct de Chine. Il contient mes deux BMP280 bien emballés sous cellophane. Comme je m'y attendais, les broches de contact sont fournies mais elles ne sont pas soudées. Ce sera à moi de le faire si je le souhaite.

   
BME280 recto     BME280 verso
Ce qui m'a surpris c'est la petite taille du composant. De la taille d'un ongle. Pour vous rendre compte j'ai placé la mine d'un crayon de papier à coté. Ensuite lorsque l'on essaie de lire l'inscription au verso, on voit le texte "GY-BM ME/PM 280". Cela signifie simplement que ce circuit imprimé est compatible pour les deux types de capteurs: les BME et les BMP. Et pour finir, avec une loupe, je suis allé regardé ce qu'il y a écrit sur le capteur. J'ai pu lire "2AV KU". Ce qui signifie (à mon grand regret) que j'ai bien un BMP280 et pas un BME280. Je vais devoir oublier l'hygrométrie.


Caractéristiques techniques

Quand on parle de caractéristiques techniques d'un circuit imprimé il faut toujours faire la différence entre les caractéristiques du composant électronique et des caractéristiques du circuit complet. Lorsque nous parlons de BMP280 en réalité nous désignons en même temps la toute petite puce métallique dont nous avons parlé plus tôt et aussi la plaque complète que nous avons acheté sur laquelle il est soudé avec d'autres composants. Pour prendre un exemple, si nous voulons parler de la caractéristique "taille" d'un BMP280, dans la datasheet, qui est la "bible" on va trouver 2,5mm de large. Alors que dans la fiche technique du BMP280 tel que je l'ai acheté, on trouve une largeur de 1,5cm. Je tenais à faire ce rappel pour ceux d'entre vous qui débutent dans le monde de l'électronique, comme moi il y a encore peu de temps et je sais que souvent ne pas faire cette distinction m'a fait perdre du temps et fait faire des erreurs dans mes montages. 

Les caractéristiques que j'indique ici sont celles qui correspondent au circuit GY-BMP280 que j'ai acheté et pas celles que l'on trouve dans le datasheet du BMP280:

  • Dimensions: 1,5 * 1,1 cm.
  • Tension d'alimentation: 1,8V à 5V DC
  • Interface utilisateur: I2C (jusqu'à 3,4 MHz) ou SPI (jusqu'à 10MHz).
  • Intervalle de mesure de la pression atmosphérique: 300 à 1100 hPa
  • Intervalle de mesure de la température: -40°C à +85°C
  • Précision sur la pression: 1 hPa (en plus ou en moins)
  • Précision sur la température: 1°C (en plus ou en moins)
  • Résolution sur la pression: 0,18 hPa
  • Résolution sur la température: 0,01°C
  • Consommation électrique: 2,7µA
Pour le BME280 il faut ajouter les caractéristiques d'humidité:
  • Intervalle de mesure de l'humidité: 0 à 100%
  • Précision sur l'humidité: 3%
  • Résolution humidité: 0,08%

Rôle et fonctions des broches:

Les broches disponibles et leurs fonctions va forcément dépendre du modèle que vous avez et du fabricant. Mais dans toute mes recherches on retrouve quasiment toujours les mêmes. Donc même si ce que j'expose ci-dessous est adapté à ma carte GY-BMP280, cela sera certainement quasiment la même chose pour d'autres modèles. 

Certaines cartes proposent 4 ou 6 broches. La différence est que sur les 6 broches, vous bénéficiez du choix de l'interface I2C ou SPI*. Les 4 broches ne permettent d'accéder aux données qu'avec un seul de ces deux protocoles (en général I2C).

*I2C et SPI sont des bus de communication qui permettent à des circuit imprimé d'échanger des données. Bien que cela serait intéressant de creuser un peu, pour ne pas rendre trop long et indigeste cet article, j'ai décidé de ne pas en parler. Nous allons donc considérer qu'il suffit de câbler correctement les composants et d'utiliser la bonne librairie logicielle pour que ces bus fonctionnent et que nous puissions récupérer les données.

Liste des broches: Seules les broches en gras sont nécessaires en I2C.

  • VCC: Relié au + de l'alimentation. Pour fonctionner la tension doit être dans l'intervalle [1,8V - 5V]. 
  • GND: La masse. Rien de plus à dire.
  • SDA: Serial DAta line. Broche de données. Si on utilise SPI cette broche correspondra à SDI.
  • SCL: Serial Clock Line . Dans le cas de SPI cette broche sera l'horloge SCK.
  • CSB: Cette broche permet de sélectionner SPI ou I2C en fonction de son état au démarrage:
    • CSB = 1 (sur VCC) => Mode I2C
    • CSB = 0 (sur GND) => Mode SPI. 
  • SD0: Permet de choisir l'adresse* du composant dans le mode I2C:
    • SD0 = 0 => Adresse 0x76
    • SD0 = 1 => Adresse 0x77
    • Par défaut cette broche est connectée à GND, donc adresse 0x76.

*Les adresses I2C permettent d'identifier un composant lors d'une communication sur le bus. En générale cette adresse est sur 7 bits et chaque composant dispose d'une adresse par défaut. Par exemple les BMP280 ont pour adresse 0x76 ou 0x77. Vous pouvez consulter une liste des adresses I2C ICI.








Câblage

Après cette longue première partie qui nous a permis de faire connaissance avec notre nouvel ami, le BMP280, nous allons maintenant voir comment le câbler avec notre ami de toujours, l'ESP8266. Nous allons réaliser ce montage en supposant que nos deux amis communiqueront en I2C. 




Quelques petites choses à savoir


Par défaut la librairie qui implémente la communication I2C utilise GPIO4 pour SDA et GPIO5 pour SCL. Ces valeurs peuvent être changées avec la librairie <Wire.h>. Heureusement car sur ESP01 nous n'avons pas accès à GPIO5. Nous verrons cela dans la partie programmation.

Pour sélectionner le mode de communication I2C, la broche CSB doit être raccordée à VCC.

La broche SDO ne doit pas être laissée flottante. Elle permet de définir l'adresse I2C du BMP280 (ou BME). Je l'ai connectée à VCC pour avoir l'adresse 0x77. 

La tableau ci-dessous décrit en fonction de l'ESP utilisé vers quelles broches raccorder les broches du BMP: 

Correspondance broches ESP et BMP/BME 280

Schémas

Câblage BMP280 avec NodeMCU ESP12e





Cablage BMP280 avec ESP-01




Je n'ai pas fait le test de consommation électrique mais je pense que ces montages peuvent être optimisés si on alimente le BMP280 depuis une broche de l'ESP qui sera positionnée à HIGH avant la prise de mesure. 
Dans le cas d'une alimentation à partir d'un accu, je conseille de placer un condensateur en parallèle du VCC et GND pour garantir la stabilité. 

Programmation

L'idée dans cet article est de réaliser le montage et le programme qui permette depuis un ESP8266 d'utiliser un capteur BMP280 (ou BME280) et d'envoyer les données à notre serveur Domoticz. Nous aurons ainsi réalisé une petite sonde de température autonome. Nous mesurerons également la tension d'alimentation et nous la communiquerons à Domoticz afin de pouvoir recharger les accu en cas de dépassement d'un seuil. Si vous n'avez pas votre serveur Domoticz d'installé reportez vous à mon article ICI


Installation des librairies

Pour écrire le programme qui va interroger le BMP280 afin de relever la température et la pression, nous allons avoir besoin d'installer les librairies suivantes dans l'environnement de programmation Arduino:

  • <Adafruit_BMP280.h> qui permet de piloter le BMP280
  • <Adafruit_Sensor.h> qui est nécessaire pour la librairie précédente.
Pour installer une librairie procéder de la manière suivante:


Dans l'IDE Arduino allez dans Croquis/Inclure une bibliothèque/Gérer les librairies :

Ouverture fenêtre d'ajout de librairie

Une fenêtre s'affiche:
  1. Recherchez le nom de la librairie souhaitée (ici j'ai saisi BMP280).
  2. Cliquez sur "Installer". 
Fenêtre de gestion des librairie

Il vous faudra réaliser l'opération pour les deux librairies.

Ecriture du code

Algorithme

L'algorithme que nous allons développer est le suivant: 
  • Déclaration constantes, librairies et variables globales.
  • Initialisation liaison série
  • Initialisation des broches I2C.
  • Initialisation du capteur BMP280
  • Lecture des données de température et pression
  • Initialisation du wifi
  • Envois des données de température et pression a domoticz.
  • Calcul de la tension d'alimentation.
  • Envois de la tension à domoticz
  • Mise en sommeil profond.

Analyse du code

Pour ne pas alourdir les articles, je donne le code complet du programme dans la page spécifiquement dédié à cela. Vous le trouverez ICI. Ci dessous je vous propose de ne détailler que quelques passages.


Déclaration constantes, librairies et variables globales:

Dans cette partie on déclare le mode ADC qui permettra d'utiliser la fonction getVcc() pour la tension interne (pour plus d'information (re)lisez mon article ICI).
On déclare aussi les libraires dont nous aurons besoin et les variable qui nous permettront d'utiliser le capteur ainsi que d'envoyer une requête au serveur Domoticz. 
J'ai essayé également de placer en tête de programme toutes les constantes que nous pourrons modifier pour agir sur le comportement du programme. 

/*====================================================================
  * Inclusion des librairies externes 
 * ==================================================================*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h> //Si BME280 mettre: #include <Adafruit_BME280.h>

/*====================================================================
 * Place le convertisseur ADC dans un mode de lecture de la tension interne.
 * Les broches analogiques doivent être libres et ne pourront être utilisées
 * ==================================================================*/
ADC_MODE(ADC_VCC);
//////////////////////////////variable relatives au composant BMx280
Adafruit_BMP280 bmp; //Si BME280 mettre: Adafruit_BME280 bme; 

////////////////////////////////////////////////////// Variables relatives à Domoticz
char *sDomoticzIp = DOMOTICZ_IP;
int iDomoticzPort = DOMOTICZ_PORT;
HTTPClient oDomoticzClient;


Initialisation liaison série:
Cette partie est active uniquement en mode DEBUG. 
Il n'y a aucune particularité sauf que si au bout de 10 secondes la liaison ne veut pas s'initialiser on réaliser un restart logiciel. 

  Serial.begin(SERIAL_BIT_RATE);
  delay( 100 );

  //Attente initialisation Serial
  while( !Serial ) { 
      delay( 100 );
      iCompteur++;
      if ( iCompteur >= 10 ) ESP.restart();  
      }

Initialisation des broches I2C
Pour modifier les broches SDA et SCL qui sont par défaut dans la librairie associées respectivement aux GPIO 4 et 5, on exécute la fonction suivante:
  ///////////////////////////////////Défini les broche SDA/SCL pour bus I2C
  Wire.begin( I2C_SDA_GPIO, I2C_SCL_GPIO );


Initialisation du capteur BMP280
Cette initialisation se réalise avec un begin. Si elle ne fonctionne pas on passe en sommeil et on attend le prochain reset.

  ///////////////////////////////////Initialisation et lecture du module BMP280
  if (!bmp.begin( BMP280_I2C_ADDRESS )){
#ifdef DEBUG     
    Serial.println( "Aucun capteur BMP280 valide: vérifiez le cablage!");
#endif    
    //On a pas réussi initialiser le capteur alors on passe en mode sommeil
    ESP.deepSleep( DELAY_INTER_CYCLES * 1000000, RF_DEFAULT );
  }

Lecture des données de température et pression

  float fTemp= bmp.readTemperature();
  float fPression = bmp.readPressure() / 100.00f;

Initialisation du wifi
  ////////////////////////////////////////////Connexion Wifi
  WiFi.begin( sSsid, sPassword );

Envois des données de température et pression a domoticz
La requete aura été construite juste avant. 
  //////////////////// Appel domoticz pour mettre a jour le capteur
  int iResCallDomo = iEnvoiDomoticz( osUrl );
#ifdef DEBUG  
  switch ( iResCallDomo ){
    case 0 :
      // L'appel de la fonction c'est bien passé
      Serial.println( "iEnvoiDomoticz OK" );
      break;
    default :
      // On a un code <> 0 donc il y a une erreur.
      // Les codes erreurs sont 1,2.
      Serial.println( "iEnvoiDomoticz NOK" );
      break;
  }
#endif

Calcul de la tension d'alimentation
Ce calcul est réalisé dans une fonction qui prend un nombre donné de mesure en tenant compte d'un intervalle entre chaque et en retourne la valeur médiane.

/*====================================================================
  * Fonction qui retourne une valeur médiane pour la tension
 * ==================================================================*/
 float fGetTension( ){
  int iConteur = 0;
  int tiMesures[ NB_VAL ];
  
  //////////// realise le nb de mesures demandees avec delais entre chaque
  for ( int iCompteur = 0; iCompteur < NB_VAL; iCompteur++ ){
    /* Lecture de la tension en ms */
    tiMesures[ iCompteur ] = ESP.getVcc();
    delay( MESURE_DELAIS );
  }

  /* Classe le tableau */
  for (int i = 0; i < NB_VAL; i++)
    for (int j = 0; j < NB_VAL; j++){
      if ( tiMesures[ i ] > tiMesures[ j ]){
        int iMem = tiMesures[ i ];
        tiMesures[ i ] = tiMesures[ j ];
        tiMesures[ j ] = iMem;
      }
    }

  /* recherche la médiane en prennant la valeur centrale du tableau*/
  int iMediane = tiMesures[ int( ( NB_VAL / 2.0 ) + 0.5 ) - 1 ];

  return (float( iMediane ) * COEF_GETVCC / 1000);
 }

Envois de la tension à domoticz
Idem que l'envoi des données du BMP280 avec une requete différente.

Mise en sommeil profond.

  ////////////////////////////////////////////Remise en sommeil   //Sortie du sommeil seulement si GPIO16 connecté à RST.   ESP.deepSleep( DELAY_INTER_CYCLES * 1000000, RF_DEFAULT );    

Ajout a domoticz



Maintenant que nous avons construit et programmé notre magnifique petite sonde de température et de pression autonome, il ne nous reste plus qu'à voir comment l'associer avec notre serveur Domoticz. Nous pourrons ainsi suivre et consulter les données depuis n'importe quel terminal et de n'importe quel endroit dans le monde. Si vous n'avez pas encore installé votre serveur domoticz sur un Raspberry PI alors je vous invite à le faire de toute urgence en vous aidant si nécessaire de l'article ICI.


Création d'un capteur virtuel 

Les ESP8266 ne font pas partie de la liste des matériels directement compatibles et reconnus par Domoticz. Sauf si vous utilisez un firmware de type "EspEasy" mais en ce qui nous concerne ce n'est pas le cas. Nous allons donc devoir créer des capteurs "virtuels" pour chacune des données que nous souhaitons suivre. Chacun de ces capteurs virtuels recevra ses données de la part de l'ESP via la requête JSON que nous avons programmé précédemment. Simplissime sur le principe! Voici, étape par étape, comment faire pour réaliser le suivi de la température et de la pression. Pour le suivi de la tension d'alimentation de la sonde ce sera le même principe.

Etape 1: déclarer un capteur virtuel. 

La première chose à faire va être de déclarer un capteur virtuel qui va représenter notre sonde. Il suffit d'aller dans le menu "matériel", de cliquer sur "créer un capteur virtuel" et ensuite dans la liste déroulante choisir le type recherché: ici prendra "Température et Baromètre".




Après avoir sélectionné le type, donnez un nom à votre capteur. Ici j'ai bêtement écrit "test".



Etape 2: Ajouter le nouveau dispositif 

Une fois ce dispositif virtuel créé il va falloir l'ajouter à deux niveaux. Le premier c'est au niveau de l'interface domoticz. Il va falloir l'ajouter aux dispositifs qui seront visibles dans les différents onglets du serveur. Mais aussi, il va falloir l'ajouter dans le programme de la sonde, en l'identifiant par rapport à son numéro d'index.

Ajout à l'interface:

Allez dans le menu "Dispositifs".


Recherchez le capteur virtuel tel qu'il a été nommé dans l'étape 1. Ici je recherche le capteur "test". 
Une fois trouvé, repérez son identifiant associé dans la colonne Idx. Ici il s'agit du numéro 17. Puis cliquez sur la petite flèche verte à droite qui vous permettra d'ajouter ce dispositif. Une fois ajouté la flèche deviendra bleue. Ce qui signifie que le dispositif est bien reconnu et ajouté dans la base des capteurs Domoticz. 


Si tout à bien fonctionné, ce dont je ne doute pas, vous devriez pouvoir visualiser votre capteur dans l'onglet Température. Et si comme moi vous avez déclaré le type de capteur virtuel comme étant un capteur de température et pression, alors vous devriez en plus, sans rien avoir d'autre à faire, voir le capteur de pression dans l'onglet "Metéo". 


Ajout à au logiciel:
Pour que le logiciel au niveau du microcontrôleur puisse communiquer des données à notre capteur virtuel, il va falloir donner, dans la requête JSON qui sera envoyée, l'identifiant de ce dernier. Cet identifiant est celui que je vous ai conseillé de noter lors de l'ajout précédent. Dans mon cas il s'agit du numéro 17. Vous pouvez consulter le code complet du programme ICI. Vous remarquerez que j'ai prévu dans la partie déclaration des constantes, deux définitions qui permettent d'indiquer l'identifiant du capteur. Ici DEVICE_IDX désigne le capteur virtuel. 


/*====================================================================
* Constantes à modifier
* ==================================================================*/

//idx du device virtuel domoticz qui représente le capteur BMP280
#define DEVICE_IDX 17

//idx du device virtuel domoticz qui représente le suivi de tension
#define DEVICE_TENSION 18


Pour accéder au capteur, vous pourrez constater que nous utilisons la fonction "iEnvoiDomoticz" qui consiste simplement à construire une requête JSON. 

Si cette notion d'API Json ne vous est pas familière et si vous souhaitez en savoir plus, je vous invite à lire l'excellente page du site Easydomoticz qui en parle: ICI

La requête que nous allons devoir envoyer à Domoticz pour mettre à jour les données du capteur virtuel est de la forme:

/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP;BAR;BAR_FOR;ALTITUDE

Avec les valeurs suivantes pour les paramètres:
  • IDX = Le numéro du capteur virtuel relevé précédement. 
  • TEMP = La témpérature 
  • BAR = La pression.
  • BAR_FOR = L'affichage du baromètre.  
  • ALTITUDE= L'altitude. Pas utilisé: peut être 0.

Et avec pour BAR_FOR:
  • 0 = No Info
  • 1 = Soleil
  • 2 = Couvert
  • 3 = Nuageux
  • 4 = Pluie







Conclusion



Une fois n'est pas coutume, puisque contrairement à mon habitude je n'ai presque pas parlé de moi dans cet article, je vais me permettre d'illustrer ce dernier chapitre avec une photo qui n'a rien à voir avec la notion de conclusion! C'est juste une photo que j'ai prise lors d'une de mes randonnées dans la campagne Normande et que j'aime bien. 





Axes d'améliorations


Nous venons de créer notre première sonde de température autonome à base de BMP280. Depuis une dizaine de jours elle fonctionne dans mon appartement et me permet de suivre la température de mon salon. On pourrait croire que tout est pour le mieux dans le meilleur des mondes, mais ce serait juste une illusion car à y regarder de plus près il y a encore pas mal de choses à améliorer. 
Déjà j'ai constaté que mon accu 18650 au bout de 10 jours commence à donner des signes de faiblesse. Cela provoque un comportement erratique de la sonde qui peut se bloquer. 
Ensuite malheureusement en ce qui me concerne je n'ai pas le relevé du niveau d'humidité avec mon BMP280. Et mesurer la température du salon c'est bien mais si je pouvais également avoir une mesure de la température extérieure ce serait mieux. 
N'ayant pas de thermomètre je suis obligé de faire confiance à la précision du BMP280 pour la température. Mais je pense que je pourrais améliorer le niveau de précision des données. 

Je suis donc décidé à écrire un autre article pour améliorer cette première sonde qui est une ébauche. Et parmi les améliorations que je vais mettre en oeuvre il y aura: 
  • Amélioration de l'autonomie: utilisation d'un ESP12e, optimisation du montage électronique, optimisation du logiciel. 
  • Ajout du niveau d'hygrométrie.
  • Augmentation de la précision en couplant au BMP280 un DHT11 (et éventuellement un autre capteur ... ce sera une surprise).
  • Ajout d'un capteur de température extérieur.
Cet article permettra également d'étudier quels sont les différents capteurs de température pas trop chers que nous pouvons trouver facilement pour nos montages. 

Problème possibles

Dans ce paragraphe vous trouverez quelques problèmes que j'ai rencontré et comment les résoudre.


Message d'erreur: "Could not find a valid BME280 sensor":

Consultez la page: http://davidstein.cz/2017/09/30/arduino-bme280-could-not-find-a-valid-bme280-sensor-solved/

Format de la requête JSON en fonction du type de matériel:

Voir ICI 

Liens utiles

Et pour finir voici quelques liens. 

Réalisation d'une sonde avec un BME280 et un ESP01. Attention il faudra souder un fil minuscul sur une pin minuscule de l'ESP8266. Pour ma part j'ai renoncé. C'est ICI.

Réalisation d'une sonde avec une Wemos D1 mini: ICI.







Soutenez la blogoculture ...

Le plus simplement du monde, si vous avez un achat à faire sur Amazon, accédez au site à partir de ce lien (que vous pouvez ajouter dans vos favoris)https://amzn.to/2nbe4sm



Retrouvez la Framboise au Potager sur Facebook dans le groupe "Culture Domotique".


Merci

Commentaires

  1. Salut tuto très intéressant et très bien fait, bravo !
    Perso, je suis partis dans le but d'émuler une sonde oregon en 433Mhz pour envoyer tout ca à domoticz, un arduino nano+emetteur 433+sonde bmp280 (dommage ne dispose pas de capteur d'humidité mais bcp moins chere) ca fonctionne nikel aussi depuis plusieurs semaines, le tout pour 5€ ...

    RépondreSupprimer
    Réponses
    1. Merci pour le compliment et bravo pour votre sonde maison pour 5€! Ça m'aurait plus d'en savoir un peu plus d'ailleurs, notamment sur votre gestion de l'alimentation si vous êtes sur accus. Egalement sur la portée du signal 433Mhz car les émetteurs lowcost sans antenne ont souvent une portée assez faible. Au plaisir de vous lire à nouveau.

      Supprimer
    2. Merci, la cible étant pour moi un transformateur usb (1 sonde dans le grenier et 1 dehors), je n'ai pas cherché du coté de l'optimisation de la gestion de l'arduino. l'émetteur 433 étant livré avec 10 cm de fils, la porté me convient (j'ai un recpteur rfxcom en usb sur le rpi). mais plutôt que mettre plusieurs bmp280 (1 barometre suffit en tout) je vais me pencher sur un capteur 1wire DS18B20 (que l'on trouve à 10€ les 5), j'en utilise déjà mais directement sur le rpi, ils sont très stable (ca tourne depuis 5 ans) et très précis (0.1°)

      Supprimer
    3. J'ai étudié le capteur DS18B20 ainsi que l'utilisation du protocole 1-wire dans mon dernier article (ici: https://framboiseaupotager.blogspot.com/2019/12/une-sonde-de-temperature-1-wire-ds18b20.html) et je confirme que cela fonctionne très bien et simplement. Par contre pour la précision je ne suis pas sur car au même endroit exactement, j'ai toujours 1° d'écart entre la température donnée par le BMP280. Je ne sais pas lequel des deux est le plus exact.
      Encore merci pour vos commentaire.

      Supprimer
  2. Bonjour, votre blog est vraiment très intéressant et bien présenté. Pour ma part, j'ai installé sur des ESP-01 des DS18b20 et des DHT22 et cela fonctionne parfaitement et très facile à mettre en place. Maintenant j'ai un ESP12-F sur lequel je voudrais associer plusieurs sondes dont une BME280 et peut-être une sonde lumière, DHT11...
    Cependant, je suis très déçu des fichiers flash existants pour le ESP12. Je pensais que ce serait du même genre que certaines distributions ESP01 avec un parfait serveur web. En fait, je n'ai quasiment rien trouver et déjà juste pour faire démarrer le wifi cela a été très compliqué.
    J'utilise des scripts lua que je ne maitrise pas du tout et peu d'exemples disponibles.

    RépondreSupprimer
  3. En date de 2023_10_19 Modification du script pour que IDE Arduino compile correctement.

    1/ char *sDomoticzIp = DOMOTICZ_IP;
    remplacé par:
    char *sDomoticzIp = strdup(DOMOTICZ_IP);

    2/ oDomoticzClient.begin( sDomoticzIp, iDomoticzPort, osDomoUrl );
    remplacé par :
    WiFiClient wifiClient;
    oDomoticzClient.begin(wifiClient, sDomoticzIp, iDomoticzPort, osDomoUrl);

    par contre pas de communication des valeurs sur Serveur Domoticz sur Raspberry, alors qu'avec EspEsasy les valeurs sont transmises.

    B0��....
    -> Wifi connected in 4 seconds
    Connection status: 3
    -> Wifi connection is established.
    -> Mode Wifi WIFI_STA
    Connected to : ssid_mon-reseau
    Adresse IP : 192.168.1.XXX
    /json.htm?type=command&param=udevice&idx=2&nvalue=0&svalue=23.04;984.14;0;0
    Domoticz response error

    Adresse IP ESP : 192.168.1.204
    iHttpCode : -1
    iEnvoiDomoticz NOK
    /json.htm?type=command&param=udevice&idx=18&nvalue=0&svalue=4.26
    Domoticz response error

    RépondreSupprimer

Enregistrer un commentaire