Pages: [1]   Go Down
Author Topic: Station Météo à base d'Arduino avec code complet  (Read 928 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !



* IMG_2425_small.jpg (74.44 KB, 782x521 - viewed 106 times.)
« Last Edit: May 20, 2014, 07:20:14 pm by Loic_B » Logged

Wonderful and easy Arduino tutos here : ThePolyscope.com
And also science new and various tech topics !

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !


* WeatherStationExcel.PNG (216.47 KB, 918x503 - viewed 99 times.)
Logged

Wonderful and easy Arduino tutos here : ThePolyscope.com
And also science new and various tech topics !

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour ce retour !
Logged

Wonderful and easy Arduino tutos here : ThePolyscope.com
And also science new and various tech topics !

South France
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour ce lien et ce projet smiley-wink
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SALUT
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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, smiley-cool;
  if (errorFlag) {
    Serial.println("Failed to capture checksum");
    return;
  }
 
  byte cs = (byte)(humid16>>smiley-cool + (byte)(humid16&0xFF) + (byte)(temp16>>smiley-cool + (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);
}
Logged

Pages: [1]   Go Up
Jump to: