Pages: [1] 2   Go Down
Author Topic: [resolu] capteur ds18b20  (Read 2772 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,
j'ai pour projet de mettre un arduino sur mon aquarium marin afin de prendre quelques mesures et commander une carte relais.
Je réussis à lire l'heure a l'aide d'un ds1307 mais je bloque sur l'utilisation de mon capteur ds18b20
J'utilise ce programme:

Code:
#include <OneWire.h>        // pour le ds18b20
#include <LiquidCrystal.h>  // pour l'afficheur LCD

LiquidCrystal lcd(30, 31, 32, 36, 37, 38,39);

OneWire  ds(8 );  // l'entrée 8 de l'Arduino recevra
                 // les messages du ds18b20

byte i;
byte present = 0;
byte data[12];
byte addr[8];
  
int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

void setup(void) {
  
  // initialisation de l'afficheur:
  lcd.begin(16, 2);  
  lcd.clear();      
  lcd.setCursor(0,0);  
  
  
  // initialisation du ds18b20:
    if ( !ds.search(addr)) {
      lcd.clear();
      lcd.print("Erreur addr");
      delay(1000);
      ds.reset_search();
      return;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      lcd.clear();
      lcd.print("Ereur CRC");
      delay(1000);
      return;
  }
}

void getTemp() {
  int bar;
  
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);

  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8 ) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  
  if (SignBit) {
    TReading = -TReading;
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
  Whole = Tc_100 / 100;          // separate off the whole and fractional portions
  Fract = Tc_100 % 100;
  if (Fract > 49) {
    if (SignBit) {
      --Whole;
    } else {
      ++Whole;
    }
  }

  if (SignBit) {
    bar = -1;
  } else {
    bar = 1;
  }

}

void printTemp(void) {
  lcd.clear();
  lcd.setCursor(0,0);
 // lcd.print("Temperature: ");
 //  
  
  if (SignBit) {  
     lcd.print("-");
  }
  lcd.print(Whole);
  lcd.print(" C");
  
  lcd.setCursor(0,1);
  
  if (SignBit) {
    lcd.print(273 - Whole);
    }
  else{
    lcd.print(273 + Whole);
    }
 
   lcd.print(" K");
}

void loop(void) {
  getTemp();
  printTemp();
  delay(1000);
}

J'ai une erreur qui s'affiche brièvement au démarrage "erreur addr" puis la température reste figée sur 0°C, 273 K
Pourriez vous me filer un petit coup de main??
MErci
« Last Edit: December 19, 2012, 04:36:04 pm by polotche » Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3176
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ça peut t'aider : http://skyduino.wordpress.com/2012/04/26/arduino-capteur-de-temperature-ds18b20/
Logged


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

Alors lorsque je teste ce programme et que je me rend dans le serial monitor, rien ne se passe  smiley-red
Logged

perpignan, france
Offline Offline
Sr. Member
****
Karma: 0
Posts: 280
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

essaye la lib jointe et ses exemples smiley-wink

edit : avec le fichier, c'est mieux smiley-razz

* DallasTemperatureControl.zip (25.99 KB - downloaded 16 times.)
Logged

-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'instal

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mauvais cablage ?

Comment es-tu cablé ?
Revérifie le brochage
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

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

essaye la lib jointe et ses exemples smiley-wink

edit : avec le fichier, c'est mieux smiley-razz

je dois un peu beubeu mais comment on ouvre un fichier.pde?

Mauvais cablage ?

Comment es-tu cablé ?
Revérifie le brochage

j'ai mis le fil rouge sur 5v le noir sur gnd et le data sur le pin 8 analog in. J'ai aussi mis une résistance de 4.7kohm entre le plus et le data.
Qu'appelles tu le brochage?

Logged

perpignan, france
Offline Offline
Sr. Member
****
Karma: 0
Posts: 280
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

on le renomme en .ino, .pde c'était l'estension avec arduino O22, c'est .ino depuis la 1.0
Logged

-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'instal

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un DS18B20 c'est çà :



Y'a pas de fil rouge, noir ou autre couleur

Le brochage c'est çà :



Vérifie que tu ne t'es pas trompé entre GND et 5V par exemple (ouf, trop tard il est mort) ou autre bétise de cablage.

Ton DS18B20 ne répond pas donc problème ...
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

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

J'ai acheté mon ds18b20 déjà cablé dans est protégé dans un tube en inox comme cà:


bon, lorsque je teste le programme en exemple que bricofoy m'a filé, la température affichée est de 0
Dallas Temperature IC Control Library Demo
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: 0.00

Je pense a un problème de capteur, mais j'en ai essayé deux différents, les deux seraient mort?? bizarre quand même  smiley-roll
Logged

perpignan, france
Offline Offline
Sr. Member
****
Karma: 0
Posts: 280
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pourtant cette lib fonctionne, j'ai fait un datalogger qui enregistre les temp sur carte SD avec. j'avais 3 18B20 raccordés dessus, ça fonctionne, dont deux en tube inox comme les tiens.

mais par contre je n'ai pas essayé de recompiler le truc avec la 1.0, peut-être que ça ne fonctionne que avec 0.22 ?
Logged

-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'instal

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Donc erreur de doc ou de câblage dans le tube par le fabricant ?
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

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

pourtant cette lib fonctionne, j'ai fait un datalogger qui enregistre les temp sur carte SD avec. j'avais 3 18B20 raccordés dessus, ça fonctionne, dont deux en tube inox comme les tiens.

mais par contre je n'ai pas essayé de recompiler le truc avec la 1.0, peut-être que ça ne fonctionne que avec 0.22 ?

Que ce soit avec la 1.0 ou la 0.22, j'ai le même problème, température a 0

Bon j'ai recommandé des nouveaux capteurs, nus ce coup ci que je cablerais moi même.

barbudor, je penche aussi pour un problème de fabrication, je ne vois pas d'autres explications
JE serais fixé d'ici une semaine, le temps de recevoir les autres capteurs. smiley
Logged

perpignan, france
Offline Offline
Sr. Member
****
Karma: 0
Posts: 280
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'avais trouvé un "scanner de bus 1Wire" qui listait tout ce qui répondait sur le bus, il te faudrait essayer un programme dans ce genre. Je crois d'ailleurs que dans les exemples de la lib que j'ai posté il y a un truc dans ce genre.
Après, pour ce que j'en ai vu, ls DS18b20 sont assez résistants, tu peux inverser data et +5 pour tester sans trop de risque de les cramer. Si ça se trouve data est sur le rouge... j'ai cherché les miens hier pour vérifier, et je ne les ai pas retrouvés :/
Logged

-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'instal

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

j'avais trouvé un "scanner de bus 1Wire" qui listait tout ce qui répondait sur le bus, il te faudrait essayer un programme dans ce genre. Je crois d'ailleurs que dans les exemples de la lib que j'ai posté il y a un truc dans ce genre.
Après, pour ce que j'en ai vu, ls DS18b20 sont assez résistants, tu peux inverser data et +5 pour tester sans trop de risque de les cramer. Si ça se trouve data est sur le rouge... j'ai cherché les miens hier pour vérifier, et je ne les ai pas retrouvés :/

Ok,je teste cela ce soir et vous tiens au courant smiley-wink
Logged

Offline Offline
Faraday Member
**
Karma: 19
Posts: 4178
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'avais trouvé un "scanner de bus 1Wire" qui listait tout ce qui répondait sur le bus, il te faudrait essayer un programme dans ce genre. Je crois d'ailleurs que dans les exemples de la lib que j'ai posté il y a un truc dans ce genre.
Après, pour ce que j'en ai vu, ls DS18b20 sont assez résistants, tu peux inverser data et +5 pour tester sans trop de risque de les cramer. Si ça se trouve data est sur le rouge... j'ai cherché les miens hier pour vérifier, et je ne les ai pas retrouvés :/

Ok,je teste cela ce soir et vous tiens au courant smiley-wink

Bonjour
Il serait étonnant que tes 2 sondes soient HS
Je penche plutôt pour un "pb" de cablage
si j'en crois la photo

le cable sort sur 4 conducteurs : tresse,noir,rouge,jaune
tu a cablé comment ? tresse et noir sont reliés en interne ?
les ds18b20 n'ont besoin que de 2 fils (au moins pour test)
fait un test en parasitic power avec le code dessous, je viens de tester en IDE 1.02 , 18b20 en TO92, 1920 en ibutton
tu relie tresse,noir,rouge sur GND arduino (je sais ça surprend mais c'est prevu pour  smiley-mr-green ( voir datasheet ds18b20)
et jaune sur 8 arduino (j'ai testé sur 2,8,10)
bien verifier la 4.7K entre +5V et 8 arduino


Code:
#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(8);  // on pin 8
void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}
« Last Edit: December 13, 2012, 06:15:07 am by Artouste » Logged

Pages: [1] 2   Go Up
Jump to: