Go Down

Topic: Capteur BME280 - amplification data possible ? (Read 1 time) previous topic - next topic

MicroQuettas

Bonjour,

Ce n'est pas votre IP, mais la clé  thingspeak que vous avez publiée dans le code. Maintenant, il vous faut la changer...
Bonne bidouille

MicroQuettas

68tjs

Ton IP il n'y a que toi qui la voie.
Nous on voit juste                 IP:Logged
Les Shadocks : L'ignorance ne s'apprend pas.

fitness04

Ok merci à vous.

J'ai essayé l'astuce de MicroQuettas, ça n'a pas marché.

Il faudrait que j'optimise la longueur du câble mais, je n'ai pas encore percé le plafond ni installé les capteurs sur le toit...

Sinon, j'attends les transmetteurs radio...

Fitness04 - Newby!

68tjs

#18
May 31, 2018, 08:12 pm Last Edit: May 31, 2018, 08:48 pm by 68tjs
Je reviens sur le SPI.
Par honnêteté je précise de suite que je n'ai pas encore fait l'essai, mais  je serai fort surpris que cela ne fonctionne pas comme cela avait déjà fonctionné avec un LM35 au bout de 50 mètre de câble. Le cas du LM35 est différent mais le principe de l'adaptation est le même.

Tu ne change pas de câble, tu changes juste les connections. Il faut utiliser une paire de fils torsadés par fonction.
Rappel
MoSi = Master Out  Slave In
Miso = Master In Slave Out

Paire N: 1 un fil constitue le MiSo, l'autre la masse --> reliée aux deux extrémités, c'est une ligne et non pas un blindage.
Paire N:2 un fil constitue le MoSi, l'autre la masse --> reliée aux deux extrémités, c'est une ligne et non pas un blindage.
Paire N:3 un fil constitue l'horloge, l'autre la masse --> reliée aux deux extrémités, c'est une ligne et non pas un blindage.
Paire N:4 un fil constitue le chip select, l'autre la masse --> reliée aux deux extrémités, cela ne mange pas de pain.

La paire N: 4 qui transporte un simple signal continu ne subira pas de traitement, par précaution tu laissera un petit délai entre son activation pour prendre la commande du BMP280 et le début des opérations SPI.

Un peu de documentation :
- Une paire torsadée constitue une ligne d'impédance constante tout comme un câble coaxial pour la télé.
- Une ligne d'impédance constante  possède une impédance caractéristique (Zc), elle doit être adaptée c'est à dire que le générateur doit avoir une impédance Zc ainsi que le récepteur.
- Une désadaptation de la ligne affecte les fronts du signal, tant qu'on est pas à plus de 100 MHz on peut considérer que pendant le plat du signal l'effet de ligne ne se manifeste pas.

Le schéma de principe :
Coté émission les circuits intégrés présentent une impédance de 0 à 30 ohms (pour le micro). En sortie ce sont des transistors MosFet mais des tout petits transistors et c'est la valeur de leur Rdson.
Théoriquement la résistance en série fait 100 ohms, je pense qu'une valeur comprise entre 60 et 80 ohms fera parfaitement l'affaire.
Coté réception les entrées des circuits numériques sont à très fortes impédances (plusieurs megohms) donc on place 100 ohms.
Rôle de la capa :
S'il n'y avait pas de capa l'amplitude du signal serait divisée par 2 ce qui n'est pas acceptable.
Vu ce qui a été écrit plus haut on peut mettre un condensateur  qui fera que pendant le front la ligne verra 100 ohms et sur le plat du signal la ligne le fil verra une impédance infinie.

Liaison SPI complète, le CS n'est pas mentionné puisqu'on n'y fait rien mais il le faut quand même.


Pour câbler les résistances et le condensateur il faut tenir compte du sens de transmission.

Limites de ce schéma :
Il ne fonctionne  pas avec l'I2C puisque la liaison SDA est bidirectionnelle.

En SPI il ne peut fonctionner que s'il n'y a qu'un maître sur la montage.
C'est de loin le cas le plus fréquent mais le cas de plusieurs maîtres est prévu dans la norme, un seul  pouvant être actif simultanément
Quand il n'y a qu'un seul module SPI il est tentant d'économiser une connexion en reliant directement la pin CS du module externe à la masse. La pin CS du module SPI du micro (D10 pour la UNO) est alors disponible mais attention si elle est configurée en entrée et qu'elle reçoit un niveau 0, elle fera passer instantanément le SPI du micro en mode Esclave (voir la datasheet).

Note importante : la fréquence du SPI est modifiable, par défaut il me semble qu'elle est fixée à la fréquence max Fréquence du quartz/2.
Donc revenir a des valeurs plus basses pour commencer me paraît prudent.
Si cela fonctionne rien n'empêchera de chercher la limite haute.

Nota : Schémas établis avec gschem de la suite gEDA.
Les Shadocks : L'ignorance ne s'apprend pas.

vincent84

Bonjour,

Voici une note d'application pour de l'I2C sur de longue distance :
https://www.nxp.com/docs/en/application-note/AN10658.pdf

Driver I2C + câble torsadé

Vincent

MicroQuettas

Bonjour,

Cela ne coûtait rien d'essayer... Vous aviez bien mis SCL et GND sur une paire et SDA et VCC (ou GND si vous avez assez de fils) sur une autre ? C'est moins bon que les adaptations proposées par 68tjs, mais cela peut aider en I2C.
Chez moi, cela fonctionne en I2C sur environ 2,5m en paires torsadées téléphone à 100kBps. J'avais regardé comment baisser la vitesse au cas où cela ne marcherait pas. Au final, je n'en ai pas eu besoin.

Bonne bidouille,

MicroQuettas.

fitness04

Bonjour à vous tous qui m'apportez des solutions et qui passez du temps à répondre.

Pour 68tjs

Merci pour toutes ces explications, très techniques pour mon niveau mais qui m'apportent beaucoup d'éclaircissements sur la manière d'utiliser les paires torsadées en télécommunication.

Si je comprend bien, il faut que je fonctionne par paire torsadée pour chaque fonction avec, à chaque fois un fil à la masse.

Donc, pour récupérer les données du BME280 en SPI, il me faut  4 paires. Mon câble RJ45 ne va servir que pour ce capteur.

Il va m'en falloir un deuxième pour récupérer les données du capteur DS18b20, OneWire (3 fils) et du capteur anémomètre, girouette Davis (4 fils).

C'est faisable mais, au niveau logistique, ça me fait pas mal de changement.

Je vais récupérer un second câble RJ45 ou du câble téléphonique, des boîtes de dérivation plus grosses et refaire le câblage par paire.

Merci encore pour le temps passé à répondre...

Pour MicroQuettas :

Je ne suis pas sur d'avoir câblé en tenant compte des paires ! Maintenant, je sais que c'est important et qu'on ne peut pas considérer ces câbles véhiculant des données comme de simples câbles électriques. Je vais refaire mon câblage et tester.

Question : Ces deux lignes de code :

Wire.setClock(5000);
TWSR |= TWPs1;

il faut bien les mettre dans le setup ?

Merci à tous
Fitness04 - Newby!

MicroQuettas

Bonsoir,

Oui, il vous faut mettre ces 2 lignes dans le setup(), à la fin. Elles modifient l'initialisation de l'objet Wire qui a été faite par votre bme.init().

Par rapport à une récente discussion au sujet de capteurs I2C 3V3 avec un Arduino AVR 5V, vous utilisez bien un Mega sous 5V et une BME280 sous 3V3 (elle est donnée pour 3V6 max) ?

D'après cette discussion, à laquelle je vous invite à vous reporter, c'est une configuration qui ne fonctionne pas... J'envisageais cette configuration pour un projet à venir, mais les intervenants m'ont en dissuadé.

Bonne bidouille

MicroQuettas

fitness04

Bonjour à tous,

Je reviens sur ce projet de station météo qui fonctionnait bien à part que les données du BME280, branché en I2C avec 10 m de câble, ne parvenaient pas à l'Aduino Mega.

J'ai donc suivi les conseil de Hbachetti, passer par une liaison radio, et commandé des Arduino pro mini et des NRF24l01.

Pour commencer avec ces nouveaux composants, j'ai testé la liaison avec un BME280 et des exemples de sketch que j'ai adapté à mon besoin.

Ca fonctionne en test mais, sur le sketch émetteur, quand j'affiche sur le moniteur serie les données température, pression et humidité à transmettre au récepteur ça affiche des mots incomplets et parfois des "phrases" incomplètes ( voir exemple).

Je me demande si ce n'est pas un problème d'alimentation trop faible du module NRF24l01 malgré que j'ai intercalé un condensateur de 10 µF entre le +3.3 et le GND.

Pour tout vous dire, j'avais alimenté tout le montage avec un module d'alimentation régulé (voir lien ci dessous):

https://fr.aliexpress.com/item/Smart-Electronics-MB102-Breadboard-Power-Supply-Module-3-3V-5V-Solderless-Breadboard-Voltage-Regulator-for-arduino/32842883401.html?spm=a2g0s.9042311.0.0.27326c37hpl4D6

mais, le problème restait le même.

Malheureusement j'ai grillé ce module d'alim en faisant un court circuit lors d'une mesure de tension avec mon voltmètre. D'ailleurs, qu'utilisez vous comme pointes de touche pour éviter celà ?

Je mets le code émetteur et récepteur ci dessous pour voir s'il y a un Bug que je n'ai pas vu et me donner des pistes possibles, surtout pour la façon de brancher ces deux modules.

Emetteur :
Code: [Select]


#include <avr/sleep.h>
#include <avr/wdt.h>
#include <RF24.h>
#include <Wire.h>
#include "SparkFunBME280.h"

#define BME280_POWER 5 //alimentation du capteur BME280
BME280 capteur;
float   t = 0 ;
float   h = 0 ;
float   p = 0;

RF24 radio(9, 10); //création instance radio (pin ce,csn)

ISR (WDT_vect)
{
  wdt_disable(); //désactive le watchdog
}

void mywatchdogenable()
{
  MCUSR = 0;
  WDTCSR = _BV (WDCE) | _BV (WDE);
  WDTCSR = _BV (WDIE) | _BV (WDP3) | _BV (WDP0); //délai de 8 secondes
  wdt_reset();
  ADCSRA = 0; //désactive ADC
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  MCUCR = _BV (BODS) | _BV (BODSE);
  MCUCR = _BV (BODS);
  sleep_cpu();
  sleep_disable();
}

void setup()
{
  Serial.begin(115200);
  pinMode(BME280_POWER, OUTPUT);
  digitalWrite(BME280_POWER, HIGH); //alimente le capteur BME280
  delay(3000);
  //configuration du capteur
  capteur.settings.commInterface = I2C_MODE;
  capteur.settings.I2CAddress = 0x76;
  capteur.settings.runMode = 3;
  capteur.settings.tStandby = 0;
  capteur.settings.filter = 0;
  capteur.settings.tempOverSample = 1 ;
  capteur.settings.pressOverSample = 1;
  capteur.settings.humidOverSample = 1;

  Serial.println("Starting BME280... ");
  delay(10);  // attente de la mise en route du capteur. 2 ms minimum
  // chargement de la configuration du capteur
  capteur.begin();
  delay(10);  // attente de la mise en route du capteur. 2 ms minimum

  radio.begin();
  radio.setPALevel(RF24_PA_LOW); //puissance minimum
  radio.setChannel(0x20); //canal 32
  radio.setDataRate(RF24_1MBPS);
  radio.openWritingPipe(0xF0F0F0F0F0LL);
  radio.enableDynamicPayloads();
  radio.setAutoAck(1);
  radio.setRetries(15, 15);
}//fin setup

void loop ()
{
  digitalWrite(BME280_POWER, HIGH); //alimente le capteur BME280
  radio.powerUp(); //alimente le module nrf24l01+
  delay(3000); //attente 5 secondes avant d'effectuer une mesure du capteur BME280

  float txbuffer[3] = {0, 0, 0};

  t = (capteur.readTempC());
  t = (t - 1);
  h = (capteur.readFloatHumidity());
  p = (capteur.readFloatPressure()) / 100;
  delay(1000);


  txbuffer[0] = t;
  txbuffer[1] = h;
  txbuffer[2] = p;
  radio.write(&txbuffer, sizeof(txbuffer));
  delay(500);

  Serial.print("Temperature : ");
  Serial.print((t), 2);
  Serial.print(" °C");
  Serial.print("\tPression : ");
  Serial.print((p), 2);
  Serial.print(" HPa");
  Serial.print ("\tHumidite : ");
  Serial.print((h), 2);
  Serial.println(" %");

//  digitalWrite(BME280_POWER, LOW); //arrêt de l'alimentation du BME280
  radio.powerDown(); //arrêt de l'alimentation du module nrf24l01+
  for (int i = 0; i < 3; i++) //mise en veille pendant 64 secondes i < 8
    mywatchdogenable();
}


Récepteur :

Code: [Select]

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

#include <SPI.h>
#include <RF24.h>

RF24 radio(9, 10); //création instance radio (pin ce,csn)

void setup()
{
  radio.begin();
  radio.setPALevel(RF24_PA_LOW); //puissance minimum
  radio.setChannel(0x20); //canal 32
  radio.setDataRate(RF24_1MBPS);
  radio.openReadingPipe(1, 0xF0F0F0F0F0LL);
  radio.enableDynamicPayloads();
  radio.setAutoAck(1);
  radio.setRetries(15, 15);
  radio.powerUp();
  radio.startListening();
  Serial.begin(115200);
}

void loop ()
{
  if (radio.available())
  {
    float rxbuffer[3] = {0, 0, 0};
    bool done = false;
    while (!done)
    {
      radio.read( &rxbuffer, sizeof(rxbuffer) );
      float temperature = (float)rxbuffer[0];
      Serial.print("Temperature : ");
      Serial.print((temperature), 2);
      Serial.print(" degres");
      float humidite = (float)rxbuffer[1];
      Serial.print("\tHumidite : ");
      Serial.print((humidite), 2);
      Serial.print(" %");
      float pression = (float)rxbuffer[2];
      Serial.print("\tPression : ");
      Serial.print((pression), 2);
      Serial.println(" HPa");
      done = true;
    }
  }
}


L'afichage série sur l'émetteur(affiché tel quel !) :

Code: [Select]

Temperature : 25.11 °C Pression : 950.90
%Humidite : 49.90 %
Temperature : 25.11 °C Pression : 950.95  



Et l'affichage sur le récepteur qui lui est OK :
Code: [Select]

Temperature : 25.11 degres Humidite : 49.89 % Pression : 950.85 HPa
Temperature : 25.11 degres Humidite : 50.09 % Pression : 950.87 HPa



Merci à vous pour vos réponses à venir
Fitness04 - Newby!

Go Up