Go Down

Topic: [RISOLTO]ds18b20 non misura le temperature sotto lo zero (Read 881 times) previous topic - next topic

alberto39

Feb 27, 2013, 12:28 pm Last Edit: Feb 27, 2013, 03:03 pm by alberto39 Reason: 1
Salve, ho comprato questo sensore digitale per capire come funzionano cosi ho preso il DS18B20 che  misura da -55 a 150 gradi, bene sono riuscito a collegarlo ho messo la R da 4k7? 1/4W  tutto funziona bene ma appena lo metto in un ambienta con la temperatura sotto lo zero non mi da più la temperatura.
Lo sketch  ho provato su google e piano piano lo sto capendo cosa c'è scritto.
ecco questo è lo sketch
Code: [Select]
#include <OneWire.h>


OneWire  ds(10);  // on pin 10

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)) {
   
   ds.reset_search();
   delay(250);
   return;
 }
 
 
 for( i = 0; i < 8; i++) {
   
 }

 if (OneWire::crc8(addr, 7) != addr[7]) {
     
     return;
 }
 

 // the first ROM byte indicates which chip
 switch (addr[0]) {
   case 0x10:
     
     type_s = 1;
     break;
   case 0x28:
     
     type_s = 0;
     break;
   case 0x22:
     
     type_s = 0;
     break;
   default:
     
     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

 for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();
 
 }
 

 // 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;
 
 Serial.print("  Temperature = ");
 Serial.print(celsius);
 Serial.print(" Celsius, \n");
 
}

e questo è quello che mi dice il monitor ser
Code: [Select]
Temperature = 0.63 Celsius,
 Temperature = 0.56 Celsius,
 Temperature = 0.50 Celsius,
 Temperature = 0.44 Celsius,
 Temperature = 0.31 Celsius,
 Temperature = 0.31 Celsius,
 Temperature = 0.25 Celsius,
 Temperature = 0.19 Celsius,
 Temperature = 0.12 Celsius,
 Temperature = 0.06 Celsius,
 Temperature = 0.06 Celsius,
 Temperature = 4095.94 Celsius,
 Temperature = 4095.87 Celsius,
 Temperature = 4095.87 Celsius,
 Temperature = 4095.75 Celsius,
 Temperature = 4095.75 Celsius,
 Temperature = 4095.62 Celsius,
 Temperature = 4095.56 Celsius,
 Temperature = 4095.56 Celsius,

ragazzi dove sbaglio??

niki77

Sicuramente sulla conversione.

c'è una bellissima libreria già fatta per fare questo mestiere ed è  QUI

Analizzandola mi sembra di capire che la conversione viene effettuata in maniera diversa.

Code: [Select]

        case TEMP_12_BIT:
          return (float)rawTemperature * 0.0625;
          break;
        case TEMP_11_BIT:
          return (float)(rawTemperature >> 1) * 0.125;
          break;
        case TEMP_10_BIT:
          return (float)(rawTemperature >> 2) * 0.25;
          break;
        case TEMP_9_BIT:
          return (float)(rawTemperature >> 3) * 0.5;
          break;


Tu dove hai rimediato quel codice?
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

alberto39

guarda in questo momento non lo trovo, la pagina che mi hai dato già la conoscevo e quando inserisco quel sketch mi dice che non riconosce la libreria che io ho già installato.Mettendo la cartella scaricata nella cartella arduino e libre...
che mi consigli di fare??

niki77

Hai scaricato la versione sbagliata.

Devi prendere la 3.7.2 , c'è scritto compatibile arduino 1.0

Controlla bene e vedrai che dopo vai con un filo di gasssss.
:smiley-mr-green:
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

alberto39


Hai scaricato la versione sbagliata.

Devi prendere la 3.7.2 , c'è scritto compatibile arduino 1.0

Controlla bene e vedrai che dopo vai con un filo di gasssss.
:smiley-mr-green:


grazie era questo il problema, io non avevo letto da nessuna parte che c'erano due tipi di libreria.

leo72

@alberto39:
Chiudi l'IDE, apri il file ~/.arduino/preferences.txt (se non vedi la cartella nascosta .arduino nella tua home, premi CTRL+H) e poi edita questa riga
Code: [Select]
editor.antialias=false

così:
Code: [Select]
editor.antialias=true
Riapri l'IDE ed avrai l'aliasing sui font dell'editor  ;)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy