Soucis affichage et transmission -Arduino pro mini - NRF24l01 -

Je reviens sur le projet de station météo, objet de ce fil de discussion :

Le code fonctionnait bien avec un branchement filaire court mais les données du BME280, branché en I2C avec 10 m de câble, ne parvenaient plus à 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. Je n’ai pas encore ajouté ni l’anémomètre, ni la girouette, ni le Ds18b20.

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 ci dessous).

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):

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 :

#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);
  Serial.println("test1");
  //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 :

#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’affichage Serial coté émetteur :

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

L’affichage coté récepteur (OK) :

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

Merci pour votre aide.

Salut

Côté émetteur, essaie de déplacer ton code d'affichage série juste après la lecture des capteurs, juste avant la ligne delay(1000);
Juste pour voir si le code d'endormissement ne perturbe pas l'émission sur le port série.

Sinon, essaie de conserver uniquement le code de lecture des capteurs et l'affichage, en mettant le reste en commentaires.
Ajoute ensuite le code d'endormissement puis le code d'émission des données, en testant à chaque fois.

En tous cas, l'émission / réception a l'air de fonctionner. Bravo.
@+

Bonjour Hbachetti,

Désolé pour la réponse tardive, j’étais en vacances.

Bingo ! En déplaçant le code d'affichage juste après la lecture des capteurs, avant le delay de 1000, l'affichage se fait correctement.

Donc, à ton avis, d'où vient le problème ?

N'est ce pas la mise en buffer (float) des valeurs de mesure ?

Parce que la mise en veille arrive après l'affichage dans mon programme original.

Merci.

Fitness04

Je n'ai pas regardé le code de la bibliothèque, mais il y a de fortes chances pour que l'émission se fasse par une routine d'interruption. Et la mise en veille interrompt l'émission.
Idéalement il faut attendre la fin de l'émission physique des caractères sur la ligne avec un Flush.

@+