Dallas ds18b20 con Raspberry Pi Pico (rp2040): gate P-MOSFET pull-up e allarmi


In questo articolo esploreremo funzionalità aggiuntive che possono essere aggiunte al precedente articolo sul collegamento dei sensori DS18B20 a un Raspberry Pi Pico utilizzando il protocollo OneWire.

In particolare, tratteremo l’uso di un gate P-MOSFET come resistenza pull-up per il bus OneWire, il che può migliorare l’affidabilità della comunicazione tra il sensore e il microcontrollore. Inoltre, discuteremo come implementare allarmi di temperatura che possono essere attivati quando la temperatura supera una certa soglia.

Raspberry Pi Pico (rp2040) AND DS18B20: strong pull-up P-MOSFET gate and alarm
Raspberry Pi Pico (rp2040) E DS18B20: gate P-MOSFET strong pull-up e allarme

In generale, l’obiettivo di questo articolo è quello di ampliare il progetto precedente e fornire tecniche più avanzate per l’uso dei sensori DS18B20 con un Raspberry Pi Pico.

L’articolo tratterà i componenti hardware e software necessari, nonché fornirà istruzioni passo-passo ed esempi di codice per implementare queste funzionalità. Alla fine dell’articolo, i lettori avranno una comprensione più approfondita di come ottimizzare le prestazioni dei sensori DS18B20 e incorporare funzionalità aggiuntive nei loro progetti.

Caratteristiche

  • Interfaccia 1-Wire® Unica che Richiede Solo un Pin per la Comunicazione
  • Riduzione del Numero di Componenti con Sensore di Temperatura Integrato e EEPROM
    • Misura Temperature da -55°C a +125°C (-67°F a +257°F)
    • Precisione di ±0.5°C da -10°C a +85°C
    • Risoluzione Programmabile da 9 Bit a 12 Bit
    • Non Richiede Componenti Esterni
  • Modalità di Alimentazione Parassita Richiede Solo 2 Pin per il Funzionamento (DQ e GND)
  • Semplifica le Applicazioni di Rilevamento della Temperatura Distribuite con Capacità Multidrop
    • Ogni Dispositivo ha un Codice Serial Unico a 64 Bit Memorizzato nella ROM On-Board
  • Impostazioni di Allarme Non Volatile (NV) Definibili dall’Utente con Comando di Ricerca degli Allarmi che Identifica i Dispositivi con Temperature Fuori dai Limiti Programmati
  • Disponibile in Package SO a 8 Pin (150 mils), µSOP a 8 Pin e TO-92 a 3 Pin

Datasheet

No online PDF viewer installed. Download!

Pinout

Il sensore ha più varianti, ma il cablaggio rimane lo stesso.

GND: collegare a GND.
DATA: bus dati One-Wire.
VCC: alimentazione (3,3 – 5 V), ma in modalità parassita, puoi collegare a GND.

Qui il sensore AliExpress

Problemi in modalità parassita

Il protocollo di comunicazione 1-Wire non solo facilita la comunicazione, ma fornisce anche l’alimentazione operativa per gli schiavi. Gli schiavi prelevano energia dal bus quando la tensione sul bus è maggiore della tensione sul loro condensatore di accumulo di energia interno.

Tuttavia, nelle reti con troppi schiavi, la corrente fornita dal master potrebbe non essere sufficiente a mantenere la tensione operativa negli schiavi, causando guasti intermittenti dipendenti dai dati.

Lo scenario peggiore per l’alimentazione parassita è una lunga sequenza di bit zero emessi dal master, poiché il bus trascorre la maggior parte del tempo nello stato basso e c’è poca opportunità di ricaricare gli schiavi.

Man mano che la tensione in ciascuno schiavo diminuisce, la capacità dello schiavo di pilotare il bus diminuisce, portando infine a uno stato di reset in cui lo schiavo smette di rispondere.

Quando lo schiavo riceve nuovamente una tensione operativa sufficiente, emetterà un impulso di presenza, che può corrompere altre attività del bus.

Una possibile soluzione è mostrata nell’immagine sopra, il bus 1-Wire deve essere commutato sul pull-up forte entro 10µs (max) dopo le conversioni di temperatura, e il bus deve essere mantenuto alto dal pull-up per la durata della conversione o del trasferimento dati. Nessun’altra attività può aver luogo sul bus 1-Wire mentre il pull-up è abilitato.

Il DS18B20 può anche essere alimentato dal metodo convenzionale di collegamento di un alimentatore esterno al pin VDD, come mostrato. Il vantaggio di questo metodo è che il pull-up MOSFET non è richiesto e il bus 1-Wire è libero di trasportare altro traffico durante il tempo di conversione della temperatura.

Cablaggio

La libreria One-Wire è uno standard per tutti i microcontrollori, quindi il dispositivo può essere utilizzato con molti microcontrollori. Abbiamo già mostrato il collegamento del singolo sensore, e ora collegheremo e gestiremo più sensori.

Se devi collegare solo un sensore, fai riferimento all’articolo precedente, “Dallas ds18b20 con Raspberry Pi Pico (rp2040): introduzione e modalità parassita”.

Raspberry Pi Pico

Ecco il pinout delle schede prototipo Raspberry Pi Pico.

Oppure la variante WeAct:

Qui alcune schede prototipo rp2040 Official Pi Pico - Official Pi Pico W - Waveshare rp2040-zero - WeAct Studio rp2040

Modalità normale

In modalità normale, utilizzeremo una linea di alimentazione a 3,3v, quindi il collegamento sarà così.

Il collegamento è molto semplice.

esp32ds18b20
GNDGND
3.3vVCC
D22 pulled-upDATA
Schema

Ecco lo schema semplice.

Modalità parassita

In modalità parassita, devi collegare anche GND alla linea VCC del sensore, e ottiene l’alimentazione dalla linea dati.

esp32ds18b20
GNDGND
GNDVCC
D22 pulled-upDATA

Successivamente, analizzeremo questa modalità in dettaglio, ma non hai bisogno di ulteriori informazioni ora.

Schema

Ecco lo schema.

Gate P-MOSFET strong pull-up

L’uso di un P-MOSFET consente il strong pull-up. Ecco un esempio di cablaggio semplice.

rp2040ds18b20
GNDGND
GNDVCC
D22 pulled-upDATA
rp2040P-MOSFETds18b20
D21Gate
VCCSource
DrainDATA

Per un circuito 1-wire con strong pull-up, il MOSFET deve essere collegato come segue:

  1. Il drain del MOSFET deve essere collegato alla linea dati 1-wire del dispositivo, ovvero la connessione del ds18b20.
  2. Il source del MOSFET deve essere collegato a una tensione di alimentazione positiva.
  3. Il gate del MOSFET deve essere collegato a un pin del microcontrollore configurato come uscita.
  4. Il pin del microcontrollore che controlla il gate del MOSFET deve essere impostato su HIGH per attivare il strong pull-up e su LOW per disattivarlo.

È importante notare che il strong pull-up dovrebbe essere attivato solo quando il microcontrollore deve leggere i dati dal ds18b20. Quando i dati non vengono letti, il strong pull-up dovrebbe essere disattivato per evitare il surriscaldamento del ds18b20.

Libreria

Ora, mentre scrivo questo articolo, c’è un bug nella libreria più famosa OneWire, quindi inserisco il link a questa libreria, quindi non usarla.

Usa OneWireNg non la libreria OneWire standard

Non usarla fino a quando il bug non sarà risolto.

Prima di tutto, devi ricordare che questo sensore utilizza il protocollo One-Wire, quindi devi aggiungere la libreria OneWire.

Usa questa per ora

Dopo di ciò, devi installare una libreria che implementi il protocollo e le funzionalità del sensore.

Ho scelto la più utilizzata, la DallasTemperature (in passato Dallas, ora Maxim).

Dispositivi supportati

Come descritto nel repository, questa libreria supporta i seguenti dispositivi:

  • DS18B20
  • DS18S20 (alcuni problemi su questo dispositivo)
  • DS1822
  • DS1820
  • MAX31820
  • MAX31850

Avrai bisogno di una resistenza pull-up di circa 4.7KOhm tra la linea dati 1-Wire e il tuo VCC. Se stai usando il DS18B20, puoi usare la modalità parassita e collegare a GND il VCC come descritto.

Risoluzione dei problemi

In caso di problemi di conversione della temperatura (il risultato è -85), potrebbe essere necessario un setup di strong pull-up. Vedi la sezione Alimentazione del DS18B20 nel datasheet del DS18B20 (pagina 7) e usa DallasTemperature(OneWire*, uint8_t) costruttore.

Alimentazione del DS18B20 (normale/parassita)

Il DS18B20 può essere alimentato da un’alimentazione esterna sul pin VDD, oppure può funzionare in modalità “parasite power”, che consente al DS18B20 di funzionare senza un’alimentazione esterna locale (colleghi il VDD al GND). Il DS18B20 “ruba” energia dal bus 1-Wire tramite il pin DQ quando il bus è alto. La carica rubata alimenta il DS18B20 mentre il bus è alto, e parte della carica viene immagazzinata nel condensatore di alimentazione parassita (CPP) per fornire energia quando il bus è basso.

Ma quando il DS18B20 esegue conversioni di temperatura o copia dati dalla memoria scratchpad all’EEPROM, la corrente operativa può essere di fino a 1.5mA. Questa corrente può causare una caduta di tensione inaccettabile sulla debole resistenza pullup 1-Wire e richiede più corrente di quella che il CPP può fornire.

Strong pull-up per la modalità parassita

Per garantire che il DS18B20 abbia una fornitura di corrente sufficiente, è necessario fornire un strong pullup sul bus 1-Wire ogni volta che si verificano conversioni di temperatura o si copiano dati dalla scratchpad all’EEPROM.
Questo può essere realizzato utilizzando un MOSFET per tirare il bus direttamente al rail.

Il bus 1-Wire deve essere commutato sul strong pullup entro 10µs (max) dopo le conversioni di temperatura, e il bus deve essere mantenuto alto dal pullup per la durata della conversione o del trasferimento dati. Nessun’altra attività può aver luogo sul bus 1-Wire mentre il pullup è abilitato.

Il DS18B20 può anche essere alimentato dal metodo convenzionale di collegamento di un’alimentazione esterna al pin VDD, come mostrato. Il vantaggio di questo metodo è che il pull-up MOSFET non è richiesto e il bus 1-Wire è libero di trasportare altro traffico durante il tempo di conversione della temperatura.

L’uso dell’alimentazione parassita non è raccomandato per temperature superiori a +100°C poiché il DS18B20 potrebbe non essere in grado di sostenere le comunicazioni a causa delle maggiori correnti di dispersione che possono esistere a queste temperature.

Codice

Ecco alcuni esempi per comprendere meglio.

Utilizzo della libreria per gestire un strong pull-up

Ecco un esempio di codice per Raspberry Pi Pico che utilizza lo strong pull-up per leggere in serie un elenco di ds18b20:

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino, while external pullup P-MOSFET gate into port 3
#define ONE_WIRE_BUS    D22
#define ONE_WIRE_PULLUP D21

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire, ONE_WIRE_PULLUP);

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
 for(int i=0;i<sensors.getDeviceCount();i++) {
   Serial.println("Temperature for Device "+String(i)+" is: " + String(sensors.getTempCByIndex(i)));
 } 
}

Puoi vedere nel codice evidenziato come passare il pin per gestire il MOSFET, e questo può essere molto utile quando hai un filo molto lungo.

Utilizzo dell’allarme

Una caratteristica interessante è la gestione degli allarmi. Questa funzione è abbastanza semplice; puoi impostare un valore massimo e uno minimo, e quando succede, una funzione restituisce true o viene chiamato un callback.

Gestione di un allarme su un singolo ds18b20

Lo sketch inizializza il sensore e imposta due soglie di temperatura di allarme, una per un allarme di alta temperatura e una per un allarme di bassa temperatura. Lo sketch richiede continuamente letture della temperatura dal sensore e verifica le condizioni di allarme. Se viene rilevata una condizione di allarme, lo sketch restituisce un messaggio di avviso contenente l’indirizzo del dispositivo e la lettura della temperatura.

/**
 * From the original example of the library.
 *
 * Here a manual management of alarm without an handler.
 *
 * by Renzo Mischianti <www.mischianti.org>
 *
 * https://mischianti.org
 */

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port D22
#define ONE_WIRE_BUS D22

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress insideThermometer;

void setup(void)
{
  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // search for devices on the bus and assign based on an index.
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();

  Serial.print("Device 0 Alarms: ");
  printAlarms(insideThermometer);
  Serial.println();

  Serial.println("Setting alarm temps...");

  // alarm when temp is higher than 22C
  sensors.setHighAlarmTemp(insideThermometer, 22);

  // alarm when temp is lower than 20C
  sensors.setLowAlarmTemp(insideThermometer, 20);

  Serial.print("New Device 0 Alarms: ");
  printAlarms(insideThermometer);
  Serial.println();

}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
}

void printAlarms(uint8_t deviceAddress[])
{
  char temp;
  temp = sensors.getHighAlarmTemp(deviceAddress);
  Serial.print("High Alarm: ");
  Serial.print(temp, DEC);
  Serial.print("C/");
  Serial.print(DallasTemperature::toFahrenheit(temp));
  Serial.print("F | Low Alarm: ");
  temp = sensors.getLowAlarmTemp(deviceAddress);
  Serial.print(temp, DEC);
  Serial.print("C/");
  Serial.print(DallasTemperature::toFahrenheit(temp));
  Serial.print("F");
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
  Serial.print("Device Address: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}

void checkAlarm(DeviceAddress deviceAddress)
{
  if (sensors.hasAlarm(deviceAddress))
  {
    Serial.print("ALARM: ");
    printData(deviceAddress);
  }
}

void loop(void)
{
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.print("DONE --> ");
  printData(insideThermometer);

  // Method 1:
  // check each address individually for an alarm condition
  checkAlarm(insideThermometer);
/*
  // Alternate method:
  // Search the bus and iterate through addresses of devices with alarms

  // space for the alarm device's address
  DeviceAddress alarmAddr;

  Serial.println("Searching for alarms...");

  // resetAlarmSearch() must be called before calling alarmSearch()
  sensors.resetAlarmSearch();

  // alarmSearch() returns 0 when there are no devices with alarms
  while (sensors.alarmSearch(alarmAddr))
  {
    Serial.print("ALARM: ");
    printData(alarmAddr);
  }
*/

  delay(2000);
}


Ecco il risultato.

Dallas Temperature IC Control Library Demo
Found 5 devices.
Device 0 Address: 28FF640E6C63D015
Device 0 Alarms: High Alarm: 22C/71.60F | Low Alarm: 21C/69.80F
Setting alarm temps...
New Device 0 Alarms: High Alarm: 22C/71.60F | Low Alarm: 20C/68.00F
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.12 Temp F: 70.03
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.12 Temp F: 70.03
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.19 Temp F: 70.14
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.12 Temp F: 70.03
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.12 Temp F: 70.03
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.19 Temp F: 70.14
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.12 Temp F: 70.03
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.19 Temp F: 70.14
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.19 Temp F: 70.14
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 22.37 Temp F: 72.28
ALARM: Device Address: 28FF640E6C63D015 Temp C: 22.37 Temp F: 72.28
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 22.62 Temp F: 72.72
ALARM: Device Address: 28FF640E6C63D015 Temp C: 22.62 Temp F: 72.72
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 22.37 Temp F: 72.28
ALARM: Device Address: 28FF640E6C63D015 Temp C: 22.37 Temp F: 72.28
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 22.19 Temp F: 71.94
ALARM: Device Address: 28FF640E6C63D015 Temp C: 22.19 Temp F: 71.94
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.87 Temp F: 71.37
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.75 Temp F: 71.15
Requesting temperatures...DONE --> Device Address: 28FF640E6C63D015 Temp C: 21.62 Temp F: 70.92

Gestione singolo gestore di allarmi per tutti i sensori

Ecco un esempio con 2 sensori e le stesse impostazioni di allarme. Quando l’allarme è stato sollevato, il gestore è stato chiamato per ogni sensore.

/**
 * Here 2 ds18b20 with the same alarm settings, and an handler for the alarm.
 *
 * When the Alarm is raised, the handler is called for every sensor in alarm state.
 *
 * by Renzo Mischianti <www.mischianti.org>
 *
 * https://mischianti.org
 *
 */

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port D22
#define ONE_WIRE_BUS D22

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress thermometer1, thermometer2;

// function that will be called when an alarm condition exists during DallasTemperatures::processAlarms();
void newAlarmHandler(const uint8_t* deviceAddress)
{
  Serial.println("Alarm Handler Start");
  printAlarmInfo(deviceAddress);
  printTemp(deviceAddress);
  Serial.println();
  Serial.println("Alarm Handler Finish");
}

void printCurrentTemp(DeviceAddress deviceAddress)
{
  printAddress(deviceAddress);
  printTemp(deviceAddress);
}

void printAddress(const DeviceAddress deviceAddress)
{
  Serial.print("Address: ");
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
  Serial.print(" ");
}

void printTemp(const DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC != DEVICE_DISCONNECTED_C)
  {
    Serial.print("Current Temp C: ");
    Serial.print(tempC);
  }
  else Serial.print("DEVICE DISCONNECTED");
  Serial.print(" ");
}

void printAlarmInfo(const DeviceAddress deviceAddress)
{
  char temp;
  printAddress(deviceAddress);
  temp = sensors.getHighAlarmTemp(deviceAddress);
  Serial.print("High Alarm: ");
  Serial.print(temp, DEC);
  Serial.print("C");
  Serial.print(" Low Alarm: ");
  temp = sensors.getLowAlarmTemp(deviceAddress);
  Serial.print(temp, DEC);
  Serial.print("C");
  Serial.print(" ");
}

void setup(void)
{
  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // search for devices on the bus and assign based on an index
  if (!sensors.getAddress(thermometer1, 0)) Serial.println("Unable to find address for Device 0");
  // search for devices on the bus and assign based on an index
  if (!sensors.getAddress(thermometer2, 1)) Serial.println("Unable to find address for Device 1");

  Serial.print("Device thermometer1 ");
  printAlarmInfo(thermometer1);
  Serial.println();

  // set alarm ranges
  Serial.println("Setting alarm temps...");
  sensors.setHighAlarmTemp(thermometer1, 22);
  sensors.setLowAlarmTemp(thermometer1, 20);

  Serial.print("New thermometer1 ");
  printAlarmInfo(thermometer1);
  Serial.println();

  Serial.print("Device thermometer2 ");
  printAlarmInfo(thermometer2);
  Serial.println();

  // set alarm ranges
  Serial.println("Setting alarm temps...");
  sensors.setHighAlarmTemp(thermometer2, 22);
  sensors.setLowAlarmTemp(thermometer2, 20);

  Serial.print("New thermometer2 ");
  printAlarmInfo(thermometer2);
  Serial.println();

  // attach alarm handler
  sensors.setAlarmHandler(&newAlarmHandler);

}

void loop(void)
{
  // ask the devices to measure the temperature
  sensors.requestTemperatures();

  // if an alarm condition exists as a result of the most recent
  // requestTemperatures() request, it exists until the next time
  // requestTemperatures() is called AND there isn't an alarm condition
  // on the device
  if (sensors.hasAlarm())
  {
    Serial.println("Oh noes!  There is at least one alarm on the bus.");
  }

  // call alarm handler function defined by sensors.setAlarmHandler
  // for each device reporting an alarm
  sensors.processAlarms();

  if (!sensors.hasAlarm())
  {
    // just print out the current temperature
	    printCurrentTemp(thermometer1);
	    Serial.print(" - ");
	    printCurrentTemp(thermometer2);
	    Serial.println();
  }

  delay(1000);
}

Per impostare il gestore, esiste una funzione specifica:

  // attach alarm handler
  sensors.setAlarmHandler(&newAlarmHandler);

Questo gestore è per tutti i sensori, e viene processato con questa funzione:

  // call alarm handler function defined by sensors.setAlarmHandler
  // for each device reporting an alarm
  sensors.processAlarms();

In questo caso, i 2 sensori non sono sollevati allo stesso tempo, prima solo il termometro con l’indirizzo 28FF640E6C6F7A89, poi tutti insieme.

Dallas Temperature IC Control Library Demo
Found 5 devices.
Device thermometer1 Address: 28FF640E6C63D015 High Alarm: 22C Low Alarm: 20C 
Setting alarm temps...
New thermometer1 Address: 28FF640E6C63D015 High Alarm: 22C Low Alarm: 20C 
Device thermometer2 Address: 28FF640E6C6F7A89 High Alarm: 22C Low Alarm: 20C 
Setting alarm temps...
New thermometer2 Address: 28FF640E6C6F7A89 High Alarm: 22C Low Alarm: 20C 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 20.75  - Address: 28FF640E6C6F7A89 Current Temp C: 20.69 
Address: 28FF640E6C63D015 Current Temp C: 21.06  - Address: 28FF640E6C6F7A89 Current Temp C: 21.50 
Oh noes!  There is at least one alarm on the bus.
Alarm Handler Start
Address: 28FF640E6C6F7A89 High Alarm: 22C Low Alarm: 20C Current Temp C: 22.62 
Alarm Handler Finish
Oh noes!  There is at least one alarm on the bus.
Alarm Handler Start
Address: 28FF640E6C63D015 High Alarm: 22C Low Alarm: 20C Current Temp C: 22.56 
Alarm Handler Finish
Alarm Handler Start
Address: 28FF640E6C6F7A89 High Alarm: 22C Low Alarm: 20C Current Temp C: 23.44 
Alarm Handler Finish
Oh noes!  There is at least one alarm on the bus.
Alarm Handler Start
Address: 28FF640E6C63D015 High Alarm: 22C Low Alarm: 20C Current Temp C: 23.12 
Alarm Handler Finish
Alarm Handler Start
Address: 28FF640E6C6F7A89 High Alarm: 22C Low Alarm: 20C Current Temp C: 23.62 
Alarm Handler Finish
Oh noes!  There is at least one alarm on the bus.
Alarm Handler Start
Address: 28FF640E6C63D015 High Alarm: 22C Low Alarm: 20C Current Temp C: 22.94 
Alarm Handler Finish
Alarm Handler Start
Address: 28FF640E6C6F7A89 High Alarm: 22C Low Alarm: 20C Current Temp C: 23.31 
Alarm Handler Finish
Oh noes!  There is at least one alarm on the bus.
Alarm Handler Start
Address: 28FF640E6C63D015 High Alarm: 22C Low Alarm: 20C Current Temp C: 22.75 
Alarm Handler Finish
Alarm Handler Start
Address: 28FF640E6C6F7A89 High Alarm: 22C Low Alarm: 20C Current Temp C: 23.06 
Alarm Handler Finish
Oh noes!  There is at least one alarm on the bus.
Alarm Handler Start
Address: 28FF640E6C63D015 High Alarm: 22C Low Alarm: 20C Current Temp C: 22.56 
Alarm Handler Finish
Alarm Handler Start
Address: 28FF640E6C6F7A89 High Alarm: 22C Low Alarm: 20C Current Temp C: 22.81 
Alarm Handler Finish

Grazie

  1. Schede Raspberry Pi Pico e rp2040: pinout, specifiche e configurazione IDE Arduino
  2. Schede Raspberry Pi Pico e rp2040: filesystem LittleFS integrato
  3. Scheda Raspberry Pi Pico e rp2040: ethernet w5500 e requests HTTP e HTTPS (SSL)
  4. Schede Raspberry Pi Pico e rp2040: WiFiNINA con coprocessore WiFi ESP32
  5. Schede Raspberry Pi Pico e rp2040: come utilizzare una scheda SD
  6. Dallas ds18b20