Sonde DS18B20: problemi con pwm e -127.00° perenne

Ciao a tutti,

ho un problemino che mi perseguita e che non riesco proprio a risolvere: ho 3 sonde collegate al pin 13 di cui vorrei leggere le temperature; sul pin 3 ho settato un analogWrite(3, 100) e sul pin 9 un analogWrite(9, 130).

ecco praticamente su tre sonde ne legge soltanto una (la più vicina) e a volte mi restituisce anche su questa un -127.00° come sulle altre due.

il problema sparisce se i due pin PWM vengono portati o a 0 oppure a 255....

ma perché fa così?

il problema sussiste anche su altri pin... ho provato a collegarle al 4 ed al 5 ma la situazione non cambia.

preciso che non ho montato una resistenza per ogni sonda ma soltanto una a valle sul pin dati e sul +5v

i cavi delle sonde più lontane sono lunghi 2m mentre quello della più vicina un metro scarso

spero che qualcuno mi possa aiutare

luca56:
ecco praticamente su tre sonde ne legge soltanto una (la più vicina) e a volte mi restituisce anche su questa un -127.00° come sulle altre due.

Perché stai usando una variabile di tipo signed invece di una unsigned, valori maggiori di 127, per il tipo char, vengono interpretati come valori negativi, nel tuo caso parliamo di un valore pari a 254 che corrisponde a -127, usa una variabile di tipo "byte".

scusami, essendo un autodidatta su arduino mi ritrovo un po' spaesato... mi potresti spiegare in soldoni quello che dovrei fare?

grazie mille

Se non hai un Arduino UNO R3 é da evitare il pin 13 perché ha collegato una resistenza da 500 Ohm e un LED a massa. Se usi come interfaccia per i DS18B20 un altro piedino il problema persiste?
Ciao Uwe

si ho quella versione ed il problema persiste anche sui pin 4 e 5

luca56:
Ciao a tutti,

ho un problemino che mi perseguita e che non riesco proprio a risolvere: ho 3 sonde collegate al pin 13 di cui vorrei leggere le temperature; sul pin 3 ho settato un analogWrite(3, 100) e sul pin 9 un analogWrite(9, 130).

ecco praticamente su tre sonde ne legge soltanto una (la più vicina) e a volte mi restituisce anche su questa un -127.00° come sulle altre due.

il problema sparisce se i due pin PWM vengono portati o a 0 oppure a 255....

il problema sussiste anche su altri pin... ho provato a collegarle al 4 ed al 5 ma la situazione non cambia.

preciso che non ho montato una resistenza per ogni sonda ma soltanto una a valle sul pin dati e sul +5v

i cavi delle sonde più lontane sono lunghi 2m mentre quello della più vicina un metro scarso

Spezza il problema in due parti.

  1. Verifica solo di essere in grado di leggere le tre sonde DS18B20, ricordandoti che queste sonde utilizzano una comunicazione (ed un protocollo) OneWire, dove i dati scorrono su una singola linea. Alimenta il sensore fornendo sia la massa su GND che i 5V su Vdd evitando la modalità parassita di alimentazione che può dare problemi se hai cavi lunghi come dici tu. Sul pin DQ poni una resistenza da 4,7k (ne basta una per le tre sonde) che va verso Vdd (o 5V). Evita di usare il pin 13 come ha sottolineato Uwe.
  2. Lavora con il PWM secondo il tuo progetto.
    Da una sonda DS18B20 non devi mai leggere -127. Il range può essere +125 -55 °C e trovo assai strano che, usando OneWire, tu ottenga simili valori. Anzi, non sembra proprio una lettura pertinente.

Ciao
QP

hai provato ad utilizzare l'esempio che trovi nella libreria per i DS18B20?

ma le sonde di per sé funzionano... ma solo se la parte di programma che controlla il pwm segna 0 oppure 255

mi spiego meglio: i due canali pwm comandano 4 driver ciascuno in 0-10 pwm. Il mio programma è diviso in 3 parti: alba, mantenimento intensità massima e tramonto. La cosa strana è che nella prima fase di programma e nell'ultima i valori delle temperature vengono letti correttamente! nella parte centrale, invece, mi rendono un -127.00°.

E la parte centrale del programma, ossia quella che mantiene il segnale pwm a 130 per un certo periodo di tempo, l'ho strutturata in questo modo:

if (daybyminute >= ((ontime * 60) + blueramptime + whiteramptime))  
  {  
    if ( daybyminute < ((ontime * 60) + blueramptime + whiteramptime + photoperiod)) // if time is in range of photoperiod, turn lights on to maximum fade value 
    {        
      analogWrite(blue, 130); 
        srlcd.setCursor(13, 1); 
        srlcd.print(10); 
        srlcd.print(" "); 
      analogWrite(white, 100);  
        srlcd.setCursor(2, 1); 
        srlcd.print(10); 
        srlcd.print(" ");  
       
    }  
  }

Non riesco a spiegarmi come mai le sonde funzionano durante le altre due fasi e qui invece no... è la più semplice di tutto il programma!!

Penso di poter escludere, a questo punto, che il problema riguardi resistenze, collegamenti elettrici o altro che non sia il programma stesso...

e vorrei anche sottolineare che durante la prima parte del programma, che sostanzialmente prevede un aumento lineare del segnale pwm da 0 a 130, le temperature le leggo... anche quando arriva a 130... dopodiché quando passa alla seconda parte (quella di mantenimento a 130) mi compare quel maledetto -127.00°... nella terza fase, poi, quando da 130 ritorna progressivamente a 0, riprendono a funzionare..

Perché stai usando una variabile di tipo signed invece di una unsigned, valori maggiori di 127, per il tipo char, vengono interpretati come valori negativi, nel tuo caso parliamo di un valore pari a 254 che corrisponde a -127, usa una variabile di tipo "byte".

mi potete spiegare questo? cosa significa?

Ciao Luca56,
poiché ho il tuo stesso problema posso sapere se sei riuscito a risolvere? E scusate se riapro il thread dopo tanto tempo.

Grazie

Controlla il datasheet del DS18B20 e verifica i collegamenti. Occhio a non invertire Vcc e GND.
Scarica le ultime versioni della libreria DALLAS e ONEWIRE.

--> http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
--> http://download.milesburton.com/Arduino/MaximTemperature/DallasTemperature_372Beta.zip
--> http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip

Rimuovi tutta l'elettronica lasciando solo il sensore collegato all'Arduino e crea uno sketch semplice che legga la temperatura e la stampa su seriale.