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.