Station Météo à base d'Arduino avec code complet

Salut à tous,

je viens de finir un nouveau projet que je viens partager.
C'est la première fois que je fais communiquer autant de composants entre eux, et également que je finis le montage jusqu'à le souder définitivement et le mettre dans une boîte fonctionnelle. Alors je vous livre tous les détails pour le reproduire vous même, code inclus !

Ca se passe ici : http://thepolyscope.com/fr/station-meteo-a-base-darduino/

N'hésitez pas à me faire des retours !

Code source, vue montage sous Fritzing, et je viens de rajouter un classeur Excel avec quelques Macros pour tracer importer les données et tracer automatiquement les graphiques correspondants !

Très impressionnant. Les étapes et les procédures sont très bien détaillé. Je vais imprimer ce projet et le faire lors de mes temps mort. Merci.

Merci pour ce retour !

Merci pour ce lien et ce projet :wink:

SALUT

Merci pour le projet
Bonjour Monsieur
Je m’appelle ahmed de l'Algérie j’ai entrain de mesurer la température avec capteur humidité DHT22 avec une carte arduino uno j’ai un programme que fonctionne bien le problème je veux stocker les données dans un fichier text ou bien fichier Excel je n’ai pas eu de le faire car je suis débutant dans ce domaine si possible que je vous envoie le programme et vous mettez les instructions qui sont manquées pour stocker les données dans le PC
Merci

#include <stdio.h>
#include <util/delay_basic.h>

const int sensorReadTimeoutMillis = 1000;
const int serialBaudRate = 9600;
const int sensorReadIntervalMs = 5000;
int millisSinceLastRead = 0;
int sensorPin = 2;

volatile long lastTransitionMicros = 0;

volatile int signalLineChanges;

int timings[88];

char errorMsgBuf[256];

boolean errorFlag = false;

boolean readSensor(int * temperature_decidegrees_c, int * rel_humidity_decipercent) {
initState();

attachInterrupt(sensorPin - 2, sensorLineChange, CHANGE);

if (!requestSensorRead()) {
flagError();
} else {

const long startMillis = millis();
do {
delay(100);
} while ( signalLineChanges < 86 && ( (millis() - startMillis) < sensorReadTimeoutMillis));
detachInterrupt(sensorPin - 2);
if (signalLineChanges != 86) {
sprintf(errorMsgBuf, "*** MISSED INTERRUPTS ***: Expected 86 line changes, saw %i", signalLineChanges);
flagError();
} else {

analyseTimings(temperature_decidegrees_c, rel_humidity_decipercent);
}
}
return !errorFlag;
}

void sensorLineChange() {
const long pulseMicros = micros() - lastTransitionMicros;
lastTransitionMicros = micros();
timings[signalLineChanges] = pulseMicros;
signalLineChanges++;
}

void initState() {
detachInterrupt(sensorPin - 2);
for (int i = 0; i < 86; i++) { timings = 0; }

  • errorFlag = false;*
  • lastTransitionMicros = micros();*
  • signalLineChanges = 0;*
    }
    void debugPrintTimings() {
  • for (int i = 0; i < 86; i++) {*
  • if (i%10==0) { Serial.print("\n\t"); }*
  • char buf[24];*
    _ sprintf(buf, i%2==0 ? "H[%02i]: %-3i " : "L[%02i]: %-3i ", i, timings*);_
    _
    Serial.print(buf);_
    _
    } // XXX DEBUG*_
    * Serial.print("\n");*
    }
    void analyseTimings(int * temperature_decidegrees_c, int * rel_humidity_decipercent) {

* int timingsIdx = 5;*
* int humid16 = readnbits(&timingsIdx, 16);*
* if (errorFlag) {*
* Serial.println("Failed to capture humidity data");*
* return;*
* }*
* int temp16 = readnbits(&timingsIdx, 16);*
* if (errorFlag) {*
* Serial.println("Failed to capture temperature data");*
* return;*
* }*
* int checksum8 = readnbits(&timingsIdx, 8);*
* if (errorFlag) {*
* Serial.println("Failed to capture checksum");*
* return;*
* }*

* byte cs = (byte)(humid16>>8) + (byte)(humid16&0xFF) + (byte)(temp16>>8) + (byte)(temp16&0xFF);*
* if (cs != checksum8) {*
* sprintf(errorMsgBuf, "Checksum mismatch, bad sensor read");*
* flagError();*
* }*
* if ( temp16 & (1<<15) ) {*
* temp16 = -(temp16 & (~(1<<15)));*
* }*
* if (!errorFlag) {*
temperature_decidegrees_c = temp16;
rel_humidity_decipercent = humid16;
_
}
_
}
int readnbits(int * timingsIdx, int nbits) {
_ const int * t = timings + timingsIdx;
const int * tStop = t + nbits
2;
* int result = 0;*
* char buf[12];*
* while (t != tStop) {*
checkPreBitLowPulse( (t++), (timingsIdx)++ );
result = shiftNextBit( result, (t++), (timingsIdx)++ );_
_
}
_
_
return result;
_
}
int shiftNextBit(int oldValue, int pulseMicros, int timingIndex) {

* if (pulseMicros > 10 && pulseMicros < 40) {*
* return (oldValue<<1) | 0;*
* } else if (pulseMicros > 60 && pulseMicros < 85) {*
* return (oldValue<<1) | 1;*
* } else {*
* sprintf(errorMsgBuf, "Bad bit pulse length: %i us at timing idx %i", pulseMicros, timingIndex);*
* flagError();*
* return 0xFFFFFFFF;*
* }*
}
void checkPreBitLowPulse(int pulseMicros, int timingIndex) {
* if (pulseMicros <= 35 || pulseMicros >= 75) {*
* sprintf(errorMsgBuf, "Low pulse before bit transmit (%i us) outside 45-70us tolerance at timing idx %i", pulseMicros, timingIndex);*
* flagError();*
* }*
}
boolean requestSensorRead() {
* if (digitalRead(sensorPin) != HIGH) {*
* sprintf(errorMsgBuf, "Line not HIGH at entry to requestSensorRead()");*
* flagError();*
* return false;*
* }*

* digitalWrite(sensorPin, LOW);*
* pinMode(sensorPin, OUTPUT);*
* delayMicroseconds(7000);*

* digitalWrite(sensorPin, HIGH);*
* delayMicroseconds(30);*

* pinMode(sensorPin, INPUT);*

* int pulseLength = pulseIn(sensorPin, LOW, 200);*
* if (pulseLength == 0) {*
* sprintf(errorMsgBuf, "Sensor read failed: Sensor never pulled line LOW after initial request");*
* flagError();*
* return false;*
* }*

* delayMicroseconds(5);*
* pulseLength = pulseIn(sensorPin, HIGH, 200);*
* if (pulseLength == 0) {*
* sprintf(errorMsgBuf, "Sensor read failed: Sensor didn't go back HIGH after LOW response to read request");*
* flagError();*
* return false;*
* }*
* return true;*
}
void flagError() {
* pinMode(sensorPin, INPUT);*
* digitalWrite(sensorPin, HIGH);*

* errorFlag = true;*
* Serial.println(errorMsgBuf);*
}
void setup() {

* pinMode(sensorPin, INPUT);*

* digitalWrite(sensorPin, HIGH);*
* delay(5000);*

* Serial.begin(serialBaudRate);*
* Serial.println("Sensor initialized, Ready for first reading");*
}
void loop() {
* Serial.println("Reading sensor...");*
* int temperature;*
* int humidity;*
* boolean success = readSensor(&temperature, &humidity);*
* if (success) {*
* char buf[128];*
* sprintf(buf, "Reading: %i.%i degrees C at %i.%i relative humidity", temperature/10, abs(temperature%10), humidity/10, humidity%10);*
* Serial.println(buf);*
* }*
* delay(sensorReadIntervalMs);*
}

Bonjour,

dsl, je n'avais pas vu ta réponse.
Aujourd'hui, la température et l'humidité semblent s'afficher via les commandes

sprintf(buf, "Reading: %i.%i degrees C at %i.%i relative humidity", temperature/10, abs(temperature%10), humidity/10, humidity%10);
Serial.println(buf);

de ta méthode loop.

Pour avoir l'information dans un fichier sur le PC, par d'autre choix que d'utiliser la fenêtre série de l'IDE Arduino et de copier coller les informations qui défilent.

Dans mon cas, j'ai plutôt rajouté une carte SD sur mon montage qui permet de stocker les données pour un éventuel transfert ultérieur sur le PC.

Bon courage pour ton montage !

Bonjour,

Dommage que le lien ne fonctionne plus j'aurais aimer voir ce super projet car j'avais depuis longtemps envie de faire une station météo.

Bonjour Loic un Karma pour vous, merci pour le partage du projet, le lien n'est plus fonctionnelle, si vous pouviez arrangé cela afin de faire profiter les amateurs comme moi, Bravo en tout cas pour ce professionnalisme, cordialement.

ce post date de 2014, depuis de l'eau a coulé sous les ponts sans doute :slight_smile:

si vous faites une petite recherche sur internet vous trouverez des dizaines de projets en ligne (mais si
Loic_B est toujours là - il peut attacher son projet à son post directement sur le forum ou l'héberger sur GitHub et autre espaces gratuits)

Bonjour,

Merci pour ce partage mais votre lien n'est plus fonctionnel.

Cordialement

casperski:
Bonjour,

Merci pour ce partage mais votre lien n'est plus fonctionnel.

Cordialement

ce post date de 2014 !!!