datalogger météo

bonjour
je suis en train de réaliser un datalogger pour stocker des données météo sur carte sd,en suivant des tutoriels vidéo j'ai pû réussir a faire sa pour la température et l'humidité grace a un Arduino uno,un capteur d'humidité lm22 et une horloge et un lecteur de carte sd, maintenant je veux ajouter la pression atmosphérique avec un capteur bmp280,le souci est que les port A4 etA5 sont déjà pris par l'horloge, comment faire pour brancher bmp280 et je viens tout juste de débuter avec Arduino, c'est un projet éducatif, je suis prof de physique, mercii pour votre aide.

D'abord, il faut que tu demandes à l'admin de déplacer ton message (bouton report to administrator ou ce lien) car tu as posté dans la section des projets terminés, ce qui n'est pas le cas visiblement. Et ton message aura plus de visibilité dans le forum principal.

Ta RTC est branchée sur le port I2C, mais il est possible de mettre plusieurs périphériques sur ce même port. Voir ici ou par exemple.

Il faut vérifier si tes modules (RTC, BMP) ont déjà les résistances de pull-up, c'st souvent le cas. Sinon, il faut les ajouter au montage.

En pratique, tu peux faire ça sur une breadboard : tu tires deux fils depuis A4 et A5 de l'arduino sur deux emplacements de la breadboard et tu y branches les modules en parallèle.

Chaque module a normalement une adresse spécifique qui lui permet de communiquer directement avec l'Arduino. Tu dois en général déclarer les adresses dans le constructeur ou le begin associé au module. Ce n'est pas toujours nécessaire, la bibliothèque que tu utilises peut choisir des adresses a priori. Exemple :

  bool begin(uint8_t addr = BMP280_ADDRESS, uint8_t chipid = BMP280_CHIPID);

L'adresse est souvent 0x68 ou 0x67 pour une RTC et 0x77 pour le BMP280. Pour trouver les bonnes adresses, le mieux est d'utiliser un scanner I2C. Il y en a un ici : tu le charges et il affichera sur la console (baudrate 9600) les adresses des modules I2C connectés à ton arduino.

merci beaucoup,votre explication ma beaucoup éclairé , je vais m’y mettre et aussi déplacer le poste vers rubrique approprier.

bonsoir a tous,
j’ai fini le projet d’un datalogger météo, pour la pression, la température et l’humidité et il me reste un petit souci avec le capteur de pression BMP280 qui m’affiche toujours une pression inférieur a 101300 Pa qui est anormal vue que aujourd’hui il fait beau,je vous partage le code et l’affichage

/**************************************
 * Librairies
 */
#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
#include "DHT.h" 
#include "i2c.h"
#include "i2c_BMP280.h"


/**************************************
 * Affectation des broches
 */
#define CS_PIN 10
#define DHTPIN 8
#define DHTTYPE DHT22
/**************************************
 * Création des instances
 */
File monFichier;
DHT monDHT(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
BMP280 bmp280;

/**************************************
 * Initialisation
 */
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  monDHT.begin();
  bmp280.setEnabled(0);
  bmp280.triggerMeasurement();
  
  Serial.print("Initialisation de la carte SD en cours...");
  if (SD.begin())
  {
    Serial.println(" Terminee.");
  } else
  {
    Serial.println(" Echec.");
    return;
  }
  Serial.print("capteur de pression : ");
    if (bmp280.initialize()) Serial.println("pret");
    else
    {
      Serial.println("introuvable");
      while (1) {}
    }  
   monFichier = SD.open("donnees.csv", FILE_WRITE);
  if (monFichier) 
  {   
    monFichier.println("Date,Heure,Temperature,Humidite,Pression");
    Serial.println("");
    Serial.println("    Date    | Heure  | Temperature(C) | Humidite (%) | Pression  ");
    monFichier.close();    
  } 
}
/**************************************
 * Boucle Infinie
 */
void loop() {
  
  // on mesure la pression atmosphérique.
  Wire.beginTransmission(0x76);
  Wire.begin();   
    float pression;
    bmp280.getPressure(pression);
    Wire.endTransmission(); 
  
   // On mesure l'humidité et la température.
  float humidite = monDHT.readHumidity();
  float temperature = monDHT.readTemperature();

  // on demande la date et l'heure
   Wire.beginTransmission(0x68);
    Wire.begin();
  rtc.begin();
if (!rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
   DateTime now = rtc.now();
   String Date = String(now.day()) + "/" + String(now.month())+"/"+String(now.year());
   String heure = String(now.hour()) + ":" + String(now.minute());
    Wire.endTransmission(); 
  // On met en forme la donnée au formar csv, c'est-à dire chaque paramètre séparé par une virgule.
  String donnee = Date + "," + heure + "," + String(temperature) + "," + String(humidite) + "," + String(pression);

  // On enregistre la donnée 
  monFichier = SD.open("donnees.csv", FILE_WRITE); //Maximum 8 caractères avant le .csv
  if (monFichier) 
  {   
    monFichier.println(donnee);
    Serial.println(" " + Date +  "  | " + heure + "  |     " + String(temperature)+ "      |   " + String(humidite)+"      |  "+String(pression));
    monFichier.close();    
  } 
  else 
  {
    Serial.println("Impossible d'ouvrir le fichier");
  }  
  delay(60000);
  
}

As-tu essayé l'exemple i2c_BMP280.ino de la bibliothèque i2c_BMP280 ?

oui j'ai fait le teste, sa me donne toujours une pression inférieur a la normal :frowning:

et est-ce que le bpm280 seul (sans les autres capteurs i2c) donne la même chose ?

As-tu le moyen de comparer la pression indiquée par le capteur avec celle donnée par un autre baromètre ? Les mesures ne semblent pas aberrantes…

Sinon, le problème peut venir de la bibliothèque utilisée, tu peux essayer avec une autre. J’en ai trouvé une ici qui fonctionne en I2C. Il en existe peut-être d’autres…

merciii,j'ai essayé avec un autre BMP280 et sa donne le même résultat,vu que je suis limiter en codage j'ai des difficultés avec la modification des codes et leurs compréhension,déjà je n'est que une semaine d'arduino et j'ai su faire plein de truc :wink:

Ici j'ai essayé BMP180 et BME280 : les-capteurs-de-temperature-humidite

J'ai utilisé les librairies Adafruit.

Pour le BPM280 : GitHub - adafruit/Adafruit_BMP280_Library: Arduino Library for BMP280 sensors

Bonsoir a tous et merci pour votre aide,
enfin de compte c'est pas mon capteur qui déconne ni la bibliothèque mais plutôt ma tête lool, j'ai oublié que je suis a 208m d'altitude :p, donc la valeur est juste, après une petite correction je retombe sur la pression affiché par l'application météo.
bonne nouvelle aujourd’hui, j'ai reçu un pyranométre pour mesuré l’éclairement solaire globale en W/m²,sa fonctionne comme un thermocouple,il suffit que je convertit la tension reçu en éclairement grâce a une petite formule et le tour et jouer :wink:

Bonjour,
pour mesurer la tension délivré par mon pyranométre Kipp&Zonen CMP3 avec mon arduino j'ai acheté un capteur de tension ACS712, mais le pyranometre délivre des tensions de l’ordre du millivolts que je n'arrive pas a mesurer avec se capteur,comment puis je faire sil vous plait?sil ya des idées
mercii

J'ai été intrigué par votre pyranomètre:
http://repository.udistrital.edu.co/bitstream/11349/7210/1/GarzónGuzmánBrianYesid2017.pdf a utilisé un amplificateur de gain 100 (donné en annexe A2, page 91) , basé sur un LM741 (on trouve assez facilement des cartes présoudées avec des doubles lm741, les lm358). Ceci était une partie d'une station météo complète.
La comparaison avec une station météo fonctionnant bien donnait des résultats très encourageants quant au pyranomètre (et, pour l'anecdote, ils avaient aussi omis de reduire la pression au niveau de la mer).

Edité: je vois mal comment vous allez vous servir d'un capteur de courantACS712 ACS712 datasheet(1/12 Pages) ALLEGRO | Fully Integrated, Hall Effect-Based Linear Current Sensor with 2.1 kVRMS Voltage Isolation and a Low-Resistance Current Conductor (plutôt pour des courants forts: à moins de vouloir un isolement parfait, il sort en tension...
Edité encore une fois: la denière phrase est ambigûe, lire(l'ACS712 est plutôt pour des courants forts; à moins de vouloir un isolement parfait, le Kipp & zonen sort en tension) et rajouter "il suffit de l'amplifier" (avec le premier AOP du monde, âgé de 40 ans ou plus)

Un ACS712 est un capteur de courant alternatif à effet Hall utilisé pour mesurer des courants élevés : 20A, 30A. Absolument inadapté.

https://www.kippzonen.com/Product/11/CMP3-Pyranometer#.XZy2svfgqJ9

Bonjour

Vu ses caractéristiques , le CMP3 pourrait être pris en charge par un HX711 (détourné de son usage habituel)

On est loin des balances mais le HX711(https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf) avec son amplification (x32, x64 ou x128) suivie d'un convertisseur analogique numérique à 24 bits se prète au traitement des faibles tensions continues.
J'obtiens un résultat honorable avec des thermocouples type K (on est là aussi dans les mV)

Ci dessous une proposition de schéma avec le module à HX711 qu'on trouve facilement pour moins d' 1€
module HX711.png
A l'exception des deux résistances de 100k et du CMP3 le reste est le schéma du module.
(les deux résistance de 100K servent à polariser les entrées à AVDD/2, dans la plage admise pour le mode commun)

module HX711.png

Je suis allé voir sur le site lié par #13, et j'ai vu une boîte nommée AMPBOX https://www.kippzonen.com/Product/37/AMPBOX-Amplifier qui convertit les faibles tensions du radiometre en courant galvaniquement isolé (boucle de courant); A l'autre bout, on peut mettre une resistance de 500 Ohm qui convertira le courant en tension

When installation is in EMC-unfriendly environments, amplification can prevent interference problems.
The 4 to20 mA interface makes it easy to connect to most data collection equipment. An output of 2 to 10 Volt can be created with the use of a 500 Ω resistor and a suitable power supply.

As standard amplification is set to 2 mV input equals 1 mA output. On request the amplification can be adjusted to suit the sensitivity of a specific radiometer, for example with a pyranometer this results in 4 to 20 mA equals 0 to 1600 W/m².

On arrive dans une gamme de tension parfaitement gérable par un Arduino, avec quelques menus avantages supplémentaires:
a) on peut avoir des longueurs de fils assez grandes, ce qui est assez sympa pour un appareil destiné à être exposé au soleil (l'arduino restant protégé du soleil ... et des intempéries). C'est la beauté des boucles de courant...

b) il utilise une connectique à vis étanche, d'où un risque de vieillissement des connections moindre que des plaques toutes faites (HX711) ou à monter soi même (lm741 avec alim +-12v).

Par contre, je n'ai pas osé regarder le prix (à l'université de Bogota -liée en #12- , le pyranomètre représentait la plus grosse part du budget, je suppose qu'un boîtier d'adaptation de cette qualité n'est pas donné non plus)

Bonsoir a tous,
j’ai pris plaisir a lire toutes vos interventions et j’en est appris beaucoup, merci encore.
le capteur que j’ai utilisé est un capteur de tension,dsl je me suis tremper de référence :stuck_out_tongue:

je vais suivre l’idée pour l’amplificateur HX711 et vous informez de mon avancement sur le projet :wink:

Bonjour a tous,
après un contre temps de presque un mois, j'ai fini par faire le montage du pycnomètre avec le HX711 grâce a votre schéma.
j'ai utilisé cette libraire HX711 et j'ai pris l'exemple basic suivant :

#include "HX711.h"

// HX711 circuit wiring
//const int LOADCELL_DOUT_PIN = 2;
//const int LOADCELL_SCK_PIN = 3;

HX711 scale(3,2);

void setup() {
  Serial.begin(57600);
//  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}

void loop() {

  if (scale.is_ready()) {
    long reading = scale.read();
    Serial.print("HX711 reading: ");
    Serial.println(reading);
  } else {
    Serial.println("HX711 not found.");
  }

  delay(1000);
  
}

alors j'ai eu se résultat sur mon moniteur série

HX711 reading: -21406
HX711 reading: -23013
HX711 reading: -14608
HX711 reading: -23225
HX711 reading: -23026
HX711 reading: -23551
HX711 reading: -23772
HX711 reading: -23714
HX711 reading: -24615
HX711 reading: -24309
HX711 reading: -23553
HX711 reading: -23551
HX711 reading: -16900
HX711 reading: -23924
HX711 reading: -24977

ses valeurs sont affiché quand le pyranométre est dans l'obscurité et sa augmente quand il est éclairé
a quoi correspond ses valeur?? et comment je pourrais avoir des valeurs de tension pour après les convertir en éclairement grâce a une formule fournie le constructeur??
merciiii

Bonjour

la réponse se calcule en utilisant
-la notice du HX711 https://www.mouser.com/datasheet/2/813/hx711_english-1022875.pdf
-la documentation de la librairie HX711 utilisée GitHub - bogde/HX711: An Arduino library to interface the Avia Semiconductor HX711 24-Bit Analog-to-Digital Converter (ADC) for Weight Scales.

Tout dépend de la valeur de la tension d’excitation AVDD
SI AVDD vaut 5V, si l’amplification (‘gain’ selon la notice) vaut 128 , valeur par défaut alors la pleine échelle vaut
+/- 20mV. → Quand la tension d’entrée vaut +20mV la mesure vaut 7FFFFF ou 8 388 608

Si AVDD a une valeur différente de 5V , la pleine échelle est proportionnelle.
→ Mesurer AVDD (entre les bornes E+ et E-) pour calculer la pleine échelle effective.

Au besoin il est possible d’avoir une pleine échelle de :
40mV (entrée A , amplification 64) (avec AVDD=5V)
80mV (entrée B ) (avec AVDD=5V)

Bonjour, avec mon frère nous allons lancer une et même plusieurs fusées avec différents capteurs et donc est-ce que se serait possible d’avoir le code en entier @Azzedin et aussi si c’est possible d’utiliser le code avec les arduino uno et le base shield avec branchement filiaires sans soudures ? (check les liens ci-dessous et sinon il y a plein d’autres accessoires comme des capteurs, écrans, leds, capteurs, servomoteurs, potentiomètre etc…)

Peux tu m’envoyer le lien de ce que tu utilise pour la carte sd (Le lecteur) ?
Merci d’avance