DS18B20 sketch e modifiche

Ciao a tutti, devo collegare un DS18B20 ad un arduino nano e vorrei usare questo sketch:

#include <OneWire.h> 
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);

void setup(void) 
{ 
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 sensors.begin(); 
} 
void loop(void) 
{ 
 Serial.print(" Requesting temperatures..."); 
 sensors.requestTemperatures();
 Serial.println("DONE"); 

 Serial.print("Temperature is: "); 
 Serial.print(sensors.getTempCByIndex(0));
   delay(1000); 
}

In questo sketch preso da qui tra il pin dati del sensore e quello dell'alimentazione 5v c'è una resistenza da 4,7Kohm. Su molti altri siti però ho visto che usano una resistenza da 10Khom. Quale devo mettere?

Per quanto riguarda lo sketch restituisce valori con due cifre decimali. Come faccio ad approssimare ad una cifra decimale?

Grazie :slight_smile:

Se lo scopo è solo visualizzare il dato con una cifra decimale allora puoi usare la funzione dtostrf
Se fai una ricerca su google troverai un sacco d'esempi anche con arduino

Il valore corretto della resistenza è 4,7K così come riportato nel datasheet del componente

Salve, non mi facevo sentire da molto su questo post. Ho trovato questo sito che spiega la funzione dtostrf.

static float f_val = 123.6794;
static char outstr[15];

void setup() {
  dtostrf(f_val,7, 3, outstr);

  Serial.begin(9600);
  Serial.println(outstr);
}

void loop(){
}

-Perchè crea un array di 15 caratteri alla seconda riga?
-Si puo sostituire alla quinta riga outstr (char) con una variabile float?

Grazie

Ernesto

Hai trovato un sito con un esempio del cavolo e li ti sei fermato...
Perché 15 caratteri? Perché è un esempio del cavolo :slight_smile: se guardi qui la funzione viene spiegata (nel senso del significato dei parametri) quindi il buffer di char che (come indicato nel link) chi richiama la funzione deve provcedere ad istanziare può essere lungo quando il secondo parametro più uno (per contenere il carattere terminatore). Poi puoi anche definirlo di 100 caratteri è solo uno spreco della preziosissima memoria del micro
La seconda domanda è sconcertante perché utilizzeresti un funzione di conversione per trasferire una valore da una variabile float ad un altra float? Per quello basta usare l'assegnamento

float var1 = 1.004f;
float var2 = var1;

Ciao, grz per la risposta, non ho capito la tua ultima risposta, quella sulla conversione.

fabpolli:
La seconda domanda è sconcertante perché utilizzeresti un funzione di conversione per trasferire una valore da una variabile float ad un altra float? Per quello basta usare l'assegnamento

float var1 = 1.004f;

float var2 = var1;

Io voglio sostituire in questo codice alla riga 2 "char" con "float" così da poter poi confrontare quella variabile float con un'altra variabile float. Ora non so, ma mi pare non si possa confrontare un char con un float. Per confrontare intendo eseguire operazioni matematiche con le variabili.

static float f_val = 123.6794;
static char outstr[15];

void setup() {
  dtostrf(f_val,7, 3, outstr);

  Serial.begin(9600);
  Serial.println(outstr);
}

void loop(){
}

Il codice alla fine dovrebbe essere così:

float temperatura;
float temp;

Void setup () {
.....
}

void loop () {
dtostrf(temperatura,4,1,temp);
}

EDIT: Ho appena verificato il codice e funziona solo se sostituisco alla seconda riga "float temp;" con "char temp;". Non capisco perchè non posso mettere float. Ci sto lavorando. Si accettano consigli.

Ernesto

Giuro che ci sto provando ma tentare di seguirti nei ragionamenti è al limite dell'umana comprensione, sei partito da voler approssimare ad un decimale, adesso vuoi confrontare due float? Spieghi in realtà cosa vuoi fare e a cosa ti serve approssimare ad un decimale? Credo che altrimenti non ne usciamo...
E comunque come ho già provato a spiegarti la dtostrf serve a convertire un float in un array di char, è normale che poi tu non possa confrontare questo con un altro float, e poi quale altro float? Spero che tutta questa tiritera non sia nata dal bisogno di far partire un relé oltre una certa temperatura perché sarebbe più che comico per almeno due motivi, il primo è che di sketch di termostati ne trovi millemila sia sul forum che su internet, il secondo è che un'if maggiore o uguale, minore o uguale è di una banalità assoluta e spero non sia questo il caso
Comunque fossi in te partirei dal chiarirmi cosa sono i tipi di dato (char, float, byte, int, ecc.) perché credo tu stia navigando a vista nel buio più totale.

Devo solo stampare i valori di temperatura su un display 20x4 I2C con una cifra decimale.

E allora, il codice che hai postato

dtostrf(f_val,7, 3, outstr);
  Serial.begin(9600);
  Serial.println(outstr);

cosa ti stampava sulla seriale? Suppongo 123.679
Quindi puoi fare una prova, se cambi il terzo parametro da 3 a 2 cosa ti stampa?

Ma ricordo male o la funzione print quando usata con un float ha il secondo parametro opzionale del numero di decimali?

Standardoil:
Ma ricordo male o la funzione print quando usata con un float ha il secondo parametro opzionale del numero di decimali?

Su seriale si, su lcd credo non esista

A parte che da dicembre a oggi provava a josa... Ma nel caso basta "coprire" con uno spazio la seconda cifra. Dopo aver stampato sposto il cursore, stampo un carattere e nascondo la seconda cifra
Da natale a Pasqua fermi per uno spazio....

Certo che esiste, la print() funziona allo stesso modo ovunque, visto com'è implementata (esiste una classe Print da cui tutti ereditano). Per cui basta:

lcd.print(temp, 1);

SukkoPera:
Certo che esiste, la print() funziona allo stesso modo ovunque, visto com'è implementata (esiste una classe Print da cui tutti ereditano). Per cui basta:

lcd.print(temp, 1);

buono a sapersi in generale, peccato che adesso usandola non si dipaneranno i dubbi sui tipi :wink: ;D

fabpolli:
buono a sapersi in generale, peccato che adesso usandola non si dipaneranno i dubbi sui tipi :wink: ;D

seriamente: credi che NON usandola i dubbi si sarebbero dipanati?
Prima legge di Nelson (che sono io) sull'imparare:
Imparare è come caricare i condensatori, parte veloce, poi esponenzialmente rallenta
Tradotto in italiano: se il condensatore non si è caricato da Natale a Pasqua, è inutile aspettare l'Avvento

Standardoil:
A parte che da dicembre a oggi provava a josa... Ma nel caso basta "coprire" con uno spazio la seconda cifra. Dopo aver stampato sposto il cursore, stampo un carattere e nascondo la seconda cifra
Da natale a Pasqua fermi per uno spazio....

In realtà sono stato fermo perchè non ho avuto proprio il tempo di lavorarci. L'ho iniziato a natale e lo sto proseguendo solo in questi giorni.

beh, cosa ti dovrei rispondere?
che con il poco tempo che avevi sei riuscito a seguire delle informazioni sbagliate invece che quelle giuste?
adesso di tempo ne hai di meno, non di più
la vita è semplice bastano due sigle:
R(ead)T(he)F(uking)M(anual) -> leggiti il fottuto manuale
K(eep)I(t)S(imple)S(tupid) -> falla semplice (e basta ultima parola non la traduco)
segui queste due vie e vedrai che va meglio

Che poi non vorrei essere frainteso, se hai bisogno di aiuto io ci sono,
Solo descrivi bene problema è fatti un giro sul reference