Comparatif DS18B20 vs DHT22 vs LM35

Tous ce qui concerne les dossiers traités sur le site se trouve ici.
Post Reply
User avatar
darkpassenger
Fidele
Fidele
Posts: 103
Joined: 05 Jul 2015, 12:35

Comparatif DS18B20 vs DHT22 vs LM35

Post by darkpassenger » 10 Oct 2015, 21:38

Salut,

J'ai réalisé un test sur 3 sondes de températures.... le resultat est curieux :) :

- la LM35 a des températures qui "sautent" beaucoup. Parasites ?, ajouter une pullup ?

- La DHT22 est la plus constante, la plus fiable je pense.

- la DS18B20 est encore "neuve" pour moi. 1 tour de loop sur 2, j'ai une erreur CRC. Je ne comprends pas encore, je vais explorer la datasheet.
Elle monte vite lorsque je l'a touche, mais garde la chaleur trop longtemps.


Le code (long) :

Code: Select all

#include <dht.h>
#include <OneWire.h>
#include <Servo.h>

#define COLD_PIN_LED 13
#define WARM_PIN_LED 12
int openVanne = false;

// DHT22 ////////////////////////////////////////
dht DHT;
#define DHT22_PIN 2
float DS19B20_temperature = 0.0;

// LM35 /////////////////////////////////////////
#define SENSOR_PIN_LM35  A0
#define hysteresis 0.5               // Valeur d'hystérésis (0.5 degré Celsius)
float temperature = 0;
int chk = 0;

// DS18B20 //////////////////////////////////////
#define DS19B20_PIN 5
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28
OneWire  ds(DS19B20_PIN);  // on pin DS19B20_PIN (a 4.7K resistor is necessary)

#define DS19B20_TEMP_MIN 0
#define DS19B20_TEMP_MAX 26

// ServoMotor ///////////////////////////////////
Servo myServo;
#define SERVO_PWM_PIN 9
int ANGLE_CLOSE = 165;
int ANGLE_OPEN = 0;

// GLOBALS /////////////////////////////////////
#define SERIAL_PORT 9600

void setup() {
  Serial.begin(SERIAL_PORT); // open a serial connection to your computer 
  
  Serial.println("ENTER THE SETUP");
  // Les led
  pinMode(COLD_PIN_LED, OUTPUT);
  pinMode(WARM_PIN_LED, OUTPUT);
  
  myServo.attach(SERVO_PWM_PIN);  // attaches the servo on pin 9 to the servo object
  myServo.write(90);              // init à 90 degrés
  
  digitalWrite(COLD_PIN_LED, LOW);  
  digitalWrite(WARM_PIN_LED, LOW);
 
}

void loop() {  
  
  // LM35 /////////////////////////////////////////////
  // read the value on AnalogIn pin 0
  // and store it in a variable   
  temperature = getTemperatureLM35(analogRead(SENSOR_PIN_LM35));
  Serial.print("(LM35)  =>\t Degrees C: ");
  Serial.println(temperature);
  // end LM35 /////////////////////////////////////////
  
  // DS18B20 //////////////////////////////////////////
  DS19B20_temperature = getTemperatureDS18b20();
  Serial.print("(DS19B20) =>\t temperature: ");
  Serial.println(DS19B20_temperature);
  // end DS18B20 //////////////////////////////////////
  
  // DHT22 ////////////////////////////////////////////  
  if (getStatusDHT22(DHT.read22(DHT22_PIN)) == DHTLIB_OK) {    
    Serial.print("(DHT22) =>\t temperature: ");
    Serial.print(DHT.temperature);     
    Serial.print("\t Hygrometrie: ");
    Serial.print(DHT.humidity);Serial.println(" %");
    Serial.println("----------------------------------------------------");
  }
  // end DHT22 ////////////////////////////////////////
  
  // Eau chaude < à temp_max, je ferme la vanne
  if (DS19B20_temperature >= DS19B20_TEMP_MAX) {
    
    if (openVanne) {
      Serial.println(">>> Fermeture de la vanne");
      
      myServo.write(ANGLE_CLOSE);
      digitalWrite(COLD_PIN_LED, LOW);  
      digitalWrite(WARM_PIN_LED, HIGH);  
      
      openVanne = false;
    }
  }  
  
  // Eau froide < à temp_min, je ferme la vanne
  if (DS19B20_temperature < (DS19B20_TEMP_MAX - hysteresis) and DS19B20_temperature >= (DS19B20_TEMP_MIN + hysteresis) ) {
    
    if (!openVanne) {
      Serial.println("<<< Ouverture de la vanne");
      
      myServo.write(ANGLE_OPEN);
      digitalWrite(COLD_PIN_LED, HIGH);  
      digitalWrite(WARM_PIN_LED, LOW);  
      openVanne= true;
    }
  
  }  
  // wait for the servo to get there
  delay(500);
  
}

/* --------------- DHT22 ----------------------------------------- */
int getStatusDHT22(int check) { 
  
  switch (check)  {
    case DHTLIB_OK:
        return DHTLIB_OK;
        break;
        
    case DHTLIB_ERROR_CHECKSUM:
        Serial.println("(DHT22) : Checksum error,\t");
        break;
        
    case DHTLIB_ERROR_TIMEOUT:
        Serial.println("(DHT22) : Time out error,\t");
        break;
        
    case DHTLIB_ERROR_CONNECT:
        Serial.println("(DHT22) : Connect error,\t");
        break;
        
    case DHTLIB_ERROR_ACK_L:
        Serial.println("(DHT22) : Ack Low error,\t");
        break;
    case DHTLIB_ERROR_ACK_H:
        Serial.println("(DHT22) : Ack High error,\t");
        break;
        
    default:
        Serial.println("(DHT22) : Unknown error,\t");
        break;
  }
}
/* --------------- LM 35 ----------------------------------------- */
float getTemperatureLM35(float sensorVal) {
  const int cycles = 20;
  float temperatureLM35 = 0.0;
  float resultTemp = 0.0;
  
  for (int i =0 ; i < cycles ; i++) {
    // A ce moment, l’entrée analogique vaut 0 s’il y a 0V, 1023 pour 5V, 511 pour 2.5V...
    temperatureLM35 = getTemperature(sensorVal);        
    resultTemp += temperatureLM35;
    delay(10);
  }
  resultTemp /= cycles;
  
  return resultTemp;
}

float getVoltage(int pin) {
  return (pin / 1024.0) * 5.0;
}

float getTemperature(int sensor) {

  // convert the ADC reading to voltage
  float voltage = getVoltage(sensor);

  // convert the voltage to temperature in degrees C
  // the sensor changes 10 mV per degree
  // the datasheet says there's a 500 mV offset
  // ((volatge - 500mV) times 100)

  return (voltage - .5) * 100;
}
/* --------------- DS 18B20 ----------------------------------- */
 float getTemperatureDS18b20(){
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  float temp =0.0;
  
  //find a device
  if (!ds.search(addr)) {
    Serial.println("getTemperatureDS18b20 : <!> Device not found <!>");
    ds.reset_search();
    return false;
  }
  
  if (OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println("getTemperatureDS18b20 : <!> CRC is not valid! <!>");
    return false;
  }
  
  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
    return false;
  }
  
  ds.reset();
  ds.select(addr);
  // Start conversion
  ds.write(0x44, 1);
  // Wait some time...
  delay(850);
  present = ds.reset();
  ds.select(addr);
  // Issue Read scratchpad command
  ds.write(0xBE);
  
  // Receive 9 bytes
  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  // Calculate temperature value
   temp = ( (data[1] << 8) + data[0] )*0.0625;
   
   return temp;
 }
les log :

Code: Select all

ENTER THE SETUP
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
<<< Ouverture de la vanne
(LM35)    =>	 Degrees C  : 34.47
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.40	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 21.78
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 35.45
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 24.71
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 35.45
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 21.25
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 32.52
(DS19B20) =>	 temperature: 22.62
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 24.37
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 25.69
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 33.50
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 26.75
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
>>> Fermeture de la vanne
(LM35)    =>	 Degrees C  : 32.03
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 27.50
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 62.00 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.36
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 27.56
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 27.64
(DS19B20) =>	 temperature: 27.44
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.36
(DS19B20) =>	 temperature: 27.31
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 27.19
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 36.43
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 27.06
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.36
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 26.94
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 36.91
(DS19B20) =>	 temperature: 26.81
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.36
(DS19B20) =>	 temperature: 26.75
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 26.62
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 36.43
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 26.50
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.36
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 26.44
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 36.43
(DS19B20) =>	 temperature: 26.31
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.36
(DS19B20) =>	 temperature: 26.25
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.82
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 26.12
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 35.94
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 26.06
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 25.94
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 36.43
(DS19B20) =>	 temperature: 25.87
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 17.87
(DS19B20) =>	 temperature: 25.81
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.82
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 25.75
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 35.45
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
(DS19B20) =>	 temperature: 25.62
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.90 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
(DS19B20) =>	 temperature: 25.56
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 35.94
(DS19B20) =>	 temperature: 25.50
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.34
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.36
(DS19B20) =>	 temperature: 25.44
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
<<< Ouverture de la vanne
(LM35)    =>	 Degrees C  : 31.05
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 19.82
(DS19B20) =>	 temperature: 25.37
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------
(LM35)    =>	 Degrees C  : 18.85
getTemperatureDS18b20 : <!> Device not found <!>
(DS19B20) =>	 temperature: 0.00
(DHT22)   =>	 temperature: 20.50	 Hygrometrie: 61.80 %
----------------------------------------------------

Votre avis ?

Fabrice

User avatar
maxpeigne
Site Admin
Posts: 163
Joined: 17 Feb 2015, 18:16
Contact:

Re: Comparatif DS18B20 vs DHT22 vs LM35

Post by maxpeigne » 11 Oct 2015, 07:17

Génial :idea:
darkpassenger wrote:- la LM35 a des températures qui "sautent" beaucoup. Parasites ?, ajouter une pullup ?
C'est l’inconvénient des sondes analogiques les parasites, mais si tu étais sur une breadboard cela n'arrange pas les choses.
darkpassenger wrote:la DS18B20 est encore "neuve" pour moi. 1 tour de loop sur 2, j'ai une erreur CRC. Je ne comprends pas encore, je vais explorer la datasheet.
J'ai trouvé le problème.
Ça se passe lors du:

Code: Select all

  //find a device
  if (!ds.search(addr)) {
    Serial.println("getTemperatureDS18b20 : <!> Device not found <!>");
    ds.reset_search();
    return false;
  }
Tel qu'il est programmé:
-A chaque cycle, regarde si tu vois un capteur "nouveau" (jamais scruté).
*Si tu en trouve un, charge son adresse dans addr.
*Sinon, écrit "device not found", réinitialise ta recherche pour le cycle suivant et saute tout le programme.
Donc le 1er cycle tu trouvais un nouveau (et unique) capteur, tu chargais son adresse et lisais la température.
2e cycle: Le programme voit qu'il n'y a pas de nouveau capteur, donc il arrete sa recher et saute a la fin.
3e cycle: La fonction search étant réinitialisée (comme au tout début), elle reconssidère donc ton capteur comme "nouveau", et charge son adresse pour lire la température.
4e cycle: Tous les capteurs ont été scruté, on réinitialise et sautons à la fin du programme...
ETC

Donc la solution est encore plus simple, comme il n'y a qu'un capteur, tu ne fais qu'un ds.search(addr);
J'ai aussi du redéclarer la variable DS19B20_temperature. Elle avait disparue.

Image

Voila le code modifié (j'ai supprimé la partie du DHT22 car je n'ai pas réussi à installé la bibliothèque :oops: )

Code: Select all

#include <OneWire.h>
#include <Servo.h>

#define COLD_PIN_LED 13
#define WARM_PIN_LED 12
int openVanne = false;

// LM35 /////////////////////////////////////////
#define SENSOR_PIN_LM35  A0
#define hysteresis 0.5               // Valeur d'hystérésis (0.5 degré Celsius)
float temperature = 0;
int chk = 0;

// DS18B20 //////////////////////////////////////
#define DS19B20_PIN 5
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28
OneWire  ds(DS19B20_PIN);  // on pin DS19B20_PIN (a 4.7K resistor is necessary)

#define DS19B20_TEMP_MIN 0
#define DS19B20_TEMP_MAX 26

float DS19B20_temperature;

// ServoMotor ///////////////////////////////////
Servo myServo;
#define SERVO_PWM_PIN 9
int ANGLE_CLOSE = 165;
int ANGLE_OPEN = 0;

// GLOBALS /////////////////////////////////////
#define SERIAL_PORT 9600

void setup() {
  Serial.begin(SERIAL_PORT); // open a serial connection to your computer 
  
  Serial.println("ENTER THE SETUP");
  // Les led
  pinMode(COLD_PIN_LED, OUTPUT);
  pinMode(WARM_PIN_LED, OUTPUT);
  
  myServo.attach(SERVO_PWM_PIN);  // attaches the servo on pin 9 to the servo object
  myServo.write(90);              // init à 90 degrés
  
  digitalWrite(COLD_PIN_LED, LOW);  
  digitalWrite(WARM_PIN_LED, LOW);
 
}

void loop() {  
  
  // LM35 /////////////////////////////////////////////
  // read the value on AnalogIn pin 0
  // and store it in a variable   
  temperature = getTemperatureLM35(analogRead(SENSOR_PIN_LM35));
  Serial.print("(LM35)  =>\t Degrees C: ");
  Serial.println(temperature);
  // end LM35 /////////////////////////////////////////
  
  // DS18B20 //////////////////////////////////////////
  DS19B20_temperature = getTemperatureDS18b20();
  Serial.print("(DS19B20) =>\t temperature: ");
  Serial.println(DS19B20_temperature);
  // end DS18B20 //////////////////////////////////////
  
  // Eau chaude < à temp_max, je ferme la vanne
  if (DS19B20_temperature >= DS19B20_TEMP_MAX) {
    
    if (openVanne) {
      Serial.println(">>> Fermeture de la vanne");
      
      myServo.write(ANGLE_CLOSE);
      digitalWrite(COLD_PIN_LED, LOW);  
      digitalWrite(WARM_PIN_LED, HIGH);  
      
      openVanne = false;
    }
  }  
  
  // Eau froide < à temp_min, je ferme la vanne
  if (DS19B20_temperature < (DS19B20_TEMP_MAX - hysteresis) and DS19B20_temperature >= (DS19B20_TEMP_MIN + hysteresis) ) {
    
    if (!openVanne) {
      Serial.println("<<< Ouverture de la vanne");
      
      myServo.write(ANGLE_OPEN);
      digitalWrite(COLD_PIN_LED, HIGH);  
      digitalWrite(WARM_PIN_LED, LOW);  
      openVanne= true;
    }
  
  }  
  Serial.println("-------------------------------------------");
  // wait for the servo to get there
  delay(500);
  
}

/* --------------- LM 35 ----------------------------------------- */
float getTemperatureLM35(float sensorVal) {
  const int cycles = 20;
  float temperatureLM35 = 0.0;
  float resultTemp = 0.0;
  
  for (int i =0 ; i < cycles ; i++) {
    // A ce moment, l’entrée analogique vaut 0 s’il y a 0V, 1023 pour 5V, 511 pour 2.5V...
    temperatureLM35 = getTemperature(sensorVal);        
    resultTemp += temperatureLM35;
    delay(10);
  }
  resultTemp /= cycles;
  
  return resultTemp;
}

float getVoltage(int pin) {
  return (pin / 1024.0) * 5.0;
}

float getTemperature(int sensor) {

  // convert the ADC reading to voltage
  float voltage = getVoltage(sensor);

  // convert the voltage to temperature in degrees C
  // the sensor changes 10 mV per degree
  // the datasheet says there's a 500 mV offset
  // ((volatge - 500mV) times 100)

  return (voltage - .5) * 100;
}
/* --------------- DS 18B20 ----------------------------------- */
 float getTemperatureDS18b20(){
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  float temp =0.0;
  
  //Il n'y a qu'un seul capteur, donc on charge l'adresse.
  ds.search(addr);
  
  if (OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println("getTemperatureDS18b20 : <!> CRC is not valid! <!>");
    return false;
  }
  
  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
    return false;
  }
  
  ds.reset();
  ds.select(addr);
  // Start conversion
  ds.write(0x44, 1);
  // Wait some time...
  delay(850);
  present = ds.reset();
  ds.select(addr);
  // Issue Read scratchpad command
  ds.write(0xBE);
  
  // Receive 9 bytes
  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  // Calculate temperature value
   temp = ( (data[1] << 8) + data[0] )*0.0625;
   
   return temp;
 }
darkpassenger wrote:Elle monte vite lorsque je l'a touche, mais garde la chaleur trop longtemps.
Je pense que c'est du au fait que la sonde soit en mode "étanche", le cylindre + la graisse thermique augmente l'inertie thermique de l'ensemble. Ce n'est pas plus mal car ça la rend moins sensible au courant d'air de porte ouverte et autre.

Quoi qu'il en soit on peut en tirer une première conclusion (à chaud, après il faut voir dans le temps).


La LM35 ne parait plus être d'actualité. Breadboard ou pas, tes 3 sondes sont câblées sur le même support et c'est la seule à être parasité. Bienvenu dans l'air du numérique!

La DHT22 parait précise et surtout offre l'hygrométrie. Par contre je ne pense pas qu'elle soit 1-wire. Donc cela veut dire 1 borne arduino par capteur.

La DS18B20 parait aussi fiable que la DHT22, même si son format étanche lui confère un peu plus d'inertie thermique. Elle n'offre pas l'hygrométrie, mais le 1-wire fait que l'on peut brancher plusieurs sondes sur UNE SEULE borne de l'arduino.

Ça serait pas mal de faire de cet essai un dossier sur le site ;)

User avatar
Neo32
Posts: 41
Joined: 02 Aug 2015, 21:48
Location: Charleroi (Belgique)

Re: Comparatif DS18B20 vs DHT22 vs LM35

Post by Neo32 » 11 Oct 2015, 11:43

La DHT22 parait précise et surtout offre l'hygrométrie. Par contre je ne pense pas qu'elle soit 1-wire. Donc cela veut dire 1 borne arduino par capteur.
La DTH22 est bien 1-wire, j'en utilise 2 dans mon installation.

Image


Si vous voulez des échantillons gratuits de chez Maxim/Dallas, voici un petit article qui explique comment faire, cela avait fonctionner pour moi il y a 2 ans, ca ne coute rien d'essayer :D

http://www.touteladomotique.com/forum/v ... f=31&t=786
Je pense que c'est dû au fait que la sonde soit en mode "étanche", le cylindre + la graisse thermique augmente l'inertie thermique de l'ensemble. Ce n'est pas plus mal car ça la rend moins sensible au courant d'air de porte ouverte et autre.
C'est bien ca, mes sondes intérieure non-étanche sont beaucoup plus réactive ce qui est normale, j'avais pu améliorer l'inertie thermique en utilisant du tube d'aluminium au lieu de l'acier, mais cela n'est pas très important dans mon installation sauf pour la température de la chaudière qui doit être assez réactive, j'ai une ancienne chaudière au fioul et j'utilise la différence de température entre le départ et le retour pour régler la température de l'eau des radiateur
Last edited by Neo32 on 11 Oct 2015, 15:55, edited 1 time in total.
HoMIDoM- Le système complet et gratuit de domotique pour la maison

User avatar
maxpeigne
Site Admin
Posts: 163
Joined: 17 Feb 2015, 18:16
Contact:

Re: Comparatif DS18B20 vs DHT22 vs LM35

Post by maxpeigne » 11 Oct 2015, 14:45

Neo32 wrote:La DTH22 est bien 1-wire, j'en utilise 2 dans mon installation.
:o Pourquoi on en utilise pas tous???

Température + hygrométrie sur une seule borne ET en one-wire, c'est magique!

User avatar
darkpassenger
Fidele
Fidele
Posts: 103
Joined: 05 Jul 2015, 12:35

Re: Comparatif DS18B20 vs DHT22 vs LM35

Post by darkpassenger » 11 Oct 2015, 15:27

Je savais même pas : je vais regarder çà :)

User avatar
Neo32
Posts: 41
Joined: 02 Aug 2015, 21:48
Location: Charleroi (Belgique)

Re: Comparatif DS18B20 vs DHT22 vs LM35

Post by Neo32 » 11 Oct 2015, 15:36

Mes sondes sont cachées derrière les enjoliveurs d'interrupteur et une DHT22 est beaucoup trop grosse, je les ai utilisé dans la SDB et l’extérieur pour vérifier le taux d'humidité, il ne faut pas oublier d'utiliser des boites étanches ou de bien boucher les trous des câbles pour éviter les courants d'air, ce qui fausserait les relevés de température


Image
HoMIDoM- Le système complet et gratuit de domotique pour la maison

User avatar
maxpeigne
Site Admin
Posts: 163
Joined: 17 Feb 2015, 18:16
Contact:

Re: Comparatif DS18B20 vs DHT22 vs LM35

Post by maxpeigne » 23 Oct 2015, 07:06

Neo32 wrote:Si vous voulez des échantillons gratuits de chez Maxim/Dallas, voici un petit article qui explique comment faire, cela avait fonctionner pour moi il y a 2 ans, ca ne coute rien d'essayer :D

http://www.touteladomotique.com/forum/v ... f=31&t=786
Je viens d'essayer et ça fonctionne toujours :)

Par contre il y a tellement de choix que je ne sais même pas quoi prendre...

User avatar
darkpassenger
Fidele
Fidele
Posts: 103
Joined: 05 Jul 2015, 12:35

Re: Comparatif DS18B20 vs DHT22 vs LM35

Post by darkpassenger » 31 Oct 2015, 11:08

Ha, j'ai pas essayé :).

Je vais tester.

Post Reply