Go Down

Topic: [RISOLTO]ds18b20 non misura le temperature sotto lo zero (Read 824 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