Sensore DS18B20

Salve, ho un sensore ds18b20 in formato T90 dal quale vorrei leggere la temperatura. Il sensore è inserito nel contesto di un progetto più grande che non sto a spiegare, il problema è che nonostante il corretto collegamento, utilizzando anche una resistenza di pull up da 4.7k tra alimentazione del sensore e pin data, il sensore mi restituisce sempre un valore di temperatura pari a -127.00. Sto utilizzando un arduino nano esp32. I collegamenti sono semplici: ho 3.3V collegati al sensore (i 5V li utilizzo per alimentare il display LCD sul quale leggo la temperatura), ho poi ground del sensore collegato al ground del nano e il piedino del segnale collegato al pin 7. Ho letto che il sensore restituisce 127.00 quando non comunica, ho allora sostituito con un altro sensore questa volta DHT11 e ho lo stesso tipo di problema ma il valore restituito questa volta è 2147483647 (che siano in entrambi i casi il fondo scala del tipo float e del tipo int con il quale mi definisco la variabile da stampare?). La cosa aggiuntiva che posso evidenziare è il fatto che questo sensore DHT11 con un arduino 2 in mio possesso funziona normalmente con lo stesso identico script che sto usando sul mio arduino nano esp32.

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.
Grazie.

A quanto detto da UKHeliBob aggiungo ...

... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (... e, per evitare future possibili discussioni/incomprensioni, prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

Mi scuso per la negligenza, ho provveduto a leggere il regolamento e a presentarmi nell'apposito post.

Ciao,
ma usi delle librerie ? c'e' la OneWire e Dallas da installare.
"ESP32 DS18B20 Temperature Sensor with Arduino IDE (Single, Multiple, Web Server) | Random Nerd Tutorials"

Ciao, si uso tutte le librerie necessarie. Io non penso sia un problema dello script dal momento che su arduino 2 riesco a visualizzare correttamente la temperatura ma su arduino nano no.

Siamo sempre alle solite...

Il programma non c'è, ma lui non può essere perchè....

Lo schema non c'è, ma lui non può essere perchè...

Il sensore non è

Cosa può essere?

Un errore, che noi non possiamo vedere, perchè non ci hai messo nulla da vedere
E del quale tu non ti sei accorto...

Non sei il primo in queste condizioni, non sarai nemmeno l'ultimo

Come possiamo uscirne?

Non saprei, accetto suggerimenti

#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <Onewire.h>
#include "DHT.h"
#define DHTPIN 7
// 8 è il pin di Arduino a cui collego il sensore di temperatura
//#define ONE_WIRE_BUS 0x7 // Pin Arduino a cui colleghiamo il pin DQ del sensore

#define DHTTYPE DHT11
// dht11 è il tipo di sensore che uso
DHT dht(DHTPIN, DHTTYPE);
//OneWire oneWire(ONE_WIRE_BUS); // Imposta la connessione OneWire
//DallasTemperature sensore(&oneWire); // Dichiarazione dell'oggetto sensore
LiquidCrystal_I2C lcd(0x27, 20, 4);  //definisce la dimensione della matrice del display (indirizzo,colonne,righe)

int pulsanteMarciaAvanti=4;   //pulsante per spostare in su il motore durante il manuale
int pulsanteMarciaIndietro=2;  // pulsante per spostare in giu il motore durante il manuale
int fineCorsaB=12;             //fine corsa basso
int fineCorsaA=13;             //fine corsa alto
int in1=6;                     //in1 è l'ingresso dell'integrato L6203 al quale si invia il segnale per abilitare il ponte ad H----> salita motore
int in2=1;                     //in2 è l'ingresso dell'integrato L6203 al quale si invia il segnale per abilitare il ponte ad H---->discesa motore

int val_B=0;                   
int val_A=0;                   
int val_FCA=0;                 //variabile di appoggio per leggere il valore del fine corsa alto
int val_FCB=0;                 //variabile di appoggio per leggere il valore del fine corsa basso
int manuale=0;
int automatic=0;
int decisione=0;
int inizio_auto=0;
int val_B_premuto=0;

String testo = String(""); 

void setup() {

pinMode(pulsanteMarciaAvanti, INPUT_PULLUP);
pinMode(pulsanteMarciaIndietro, INPUT_PULLUP);
pinMode(fineCorsaB, INPUT_PULLUP);
pinMode(fineCorsaA, INPUT_PULLUP);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);

lcd.begin();    //inizializza lo schermo lcd

 //settaggio manuale o automatico
lcd.setCursor(0,0);
lcd.print("Automatico:Push Red");
lcd.setCursor(0,2);
lcd.print("Manuale:Push Black");

digitalWrite(2,LOW);
digitalWrite(4,LOW);

manuale=digitalRead(pulsanteMarciaIndietro); //premo bottone nero per manuale
automatic=digitalRead(pulsanteMarciaAvanti); //premo bottone rosso per automatico
//manuale o automatico


delay(5000);                                 //aspetto 5 secondi per far premere il pulsante e scegliere così la modalità di utilizzo

if (manuale == LOW)  {
  decisione=2;                              //decisione=2 ho scelto il manuale

}
  else if (automatic == LOW)  {
    decisione=1;                              //decisione=1 ho scelto automatico

  }
  else { decisione=3;                          //non ho scelto ne manuale ne automatico---> non definito
  }                        

lcd.clear();


lcd.setCursor(0,0);
lcd.print("Temperatura");
lcd.setCursor(0,1);
//lcd.print("Umidita'");
//lcd.setCursor(0,3);
lcd.print("MODE:");

dht.begin();       //inizializza il sensore dht11



}

void loop() {

//sensore.requestTemperatures(); // richiesta lettura temperatura
//float celsius = sensore.getTempCByIndex(0);

int t = dht.readTemperature();
int h = dht.readHumidity();

val_B=digitalRead(pulsanteMarciaIndietro); //lettura del bottone per andare giu
val_A=digitalRead(pulsanteMarciaAvanti); //lettura del bottone per andare sù
val_FCB=digitalRead(fineCorsaB); //lettura del fine corsa basso
val_FCA=digitalRead(fineCorsaA); //lettura del fine corsa alto



if (decisione==2){ //manuale

//marcia in giù
  if (val_B == LOW &&  val_FCB==LOW && val_A == HIGH ) {  //se il pulsante è premuto cioè il suo valore logico è 1 e se il fine corsa basso è abilitato e il pulsante di salita è aperto
    digitalWrite(in2, HIGH); //abilita il ponte ad H per discesa motore
  }
  else {
    digitalWrite(in2, LOW); // disabilita il ponte ad H
  }
//marcia in sù
  if (val_A == LOW && val_FCA==LOW && val_B == HIGH ) {  //se il pulsante è premuto cioè il suo valore logico è 1
    digitalWrite(in1, HIGH); //abilita il ponte ad H
  }
  else {
  digitalWrite(in1, LOW); // disabilita il ponte ad H
  }
}
if(decisione==1) { //automatico
  if (val_A==LOW){     //se ho premuto il pulsante rosso
    inizio_auto=1;
  }
    switch (inizio_auto) {
      case 0: 
        val_B_premuto=0;
        if (val_A==LOW){
          inizio_auto=1;
        }
      break;  

      case 1: digitalWrite(in1,HIGH);
        if(val_B==LOW){
          val_B_premuto=1;

        }  
          if(val_FCA==0){
            digitalWrite(in1,LOW);
            delay(2000);
            inizio_auto=2;
          }
        
      break;

      case 2: digitalWrite(in2,HIGH);
        if(val_FCB==0){
          digitalWrite(in2,LOW);
          delay(2000);
          if(val_B_premuto){

            inizio_auto=0;
          }
          else{inizio_auto=1;}
        }
      break;


       
    }

   
}
switch (decisione) {
  case 1: testo="Auto" ;
  break;
  case 2: testo="Manual" ;
  break;
  case 3: testo="NonDef" ;
  break;
}
// posiziono il cursore alla colonna 12 e riga 0

lcd.setCursor(14, 0);
lcd.print(t);
//lcd.setCursor(14, 1);
//lcd.print(h);
lcd.setCursor(14, 3);
lcd.print(testo);
}

Bel codice ci sono le parti commentate relative all’altro sensore. Io di norma vorrei utilizzare il ds180, ma appunto ho provato anche il dht11.
Per i collegamenti:

E il problema che visualizzo è questo:

Al posto del numero dovrei visualizzare la temperatura, se uso il ds180 visualizzo invece 127.00.

Gli esempi della libreria funzionano?

Il sensore è del tipo che ha già la pullup integrata?

Non so se la ha già integrata, su arduino 2 funziona senza la resistenza da 4,7k quindi probabilmente si. Io l’ho integrata dopo nel circuito dal momento che ho cominciato ad utilizzare il nano pensando che fosse quello il problema ma nulla è cambiato.
Il sensore non l’ho provato con gli esempi, più tardi ci provo ma come ho scritto prima i sensori su arduino 2 con identico script e identiche connessioni funzionano, sul nano no.
Il nano lo ho acquistato settimana scorsa sul sito ufficiale di arduino quindi immagino funzioni.

Puoi provare la Adafruit DHT library: GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11, DHT22, etc Temperature & Humidity Sensors

Lo script? C'è dell'altro, oltre ad Arduino?...

#define DHTPIN 7 // 8 è il pin di Arduino a cui collego il sensore di temperatura 
//#define ONE_WIRE_BUS 0x7 // Pin Arduino a cui colleghiamo il pin DQ del sensore

Il sensore è collegato sul 7 o sull'8?...

Sullo script sono presenti più parti dove gestisco diversi pin di arduino ma attualmente non ho collegato nulla, stavo provando solo la sonda di temperatura che però ha il problema esposto. È collegato al pin 7, il commento al quale ti riferisci è presente dal momento che il programma l’ho scritto inizialmente per utilizzarlo su arduino 2 che ha il piedino 8, dovendo però interfacciarmi con il nano che ha fino al piedino 7 ho cambiato la definizione da 8 a 7.

Stai parlando però degli ingressi analogici, e A7 del nano non può funzionare, perchè è appunto un pin solo analogico, a te serve un pin digitale, prova su un altro pin e vedrai funziona.

Edit: tra l'altro se nel software indichi quel pin con il numero 7 quello che hai attivato è appunto il pin 7, quello analogico si chiama A7.

Ciao, Ale.

Appena sono a casa provo a cambiare il pin, intanto ti ringrazio molto.

Appena tornato e subito provato.... problema risolto!! Mi sono scervellato nel capire quale fosse questa differenza tra arduino due e il nano che non facesse funzionare il sensore, la risposta era più semplice del previsto. Grazie tante per il prezioso aiuto!

Quindi, riassumendo:
Era sbagliato il programma E dubbio lo schema

Prossima volta posta tutto da subito