Meerdere DS18B20 temperatuursensoren aansluiten op een ESP32

De DS18B20 temperatuursensor heeft een groot voordeel ten opzichte van veel andere sensoren: je kunt meerdere sensoren tegelijk aansluiten op één enkele datalijn. Dankzij het 1-Wire communicatieprotocol krijgt elke DS18B20 een uniek adres, waardoor een ESP32 of Arduino meerdere temperatuursensoren kan herkennen en afzonderlijk uitlezen.

Dit maakt de DS18B20 ideaal voor projecten waarbij je op verschillende plekken temperatuur wilt meten, zoals in een weerstation, technische ruimte, aquarium, vijver of bij meerdere ruimtes in huis. In dit artikel laat ik zien hoe je meerdere DS18B20 sensoren aansluit op een ESP32, hoe je de unieke adressen van de sensoren uitleest en hoe je de Arduino code aanpast om meerdere temperaturen tegelijk te meten.

Wil je eerst weten wat de DS18B20 sensor is en wat de specificaties zijn? Lees dan eerst de uitleg op de pagina DS18B20 temperatuursensor aansluiten op een ESP32.

Aansluitschema (ESP32)

Je hebt de DS18B20, een 4.7 kΩ weerstand en een paar Dupont-kabels nodig. Iedere DS18B20 sluit je aan op dezelfde poort.

DS18B20 verbonden met ESP32

Arduino basiscode

Installeer eerst de bibliotheken OneWire en DallasTemperature via de Library Manager.

DS18B20 adressen automatisch uitlezen

Voordat we met meerdere DS18B20 sensoren kunnen werken moeten we eerst de adressen achterhalen.
        
            #include <OneWire.h>
            #include <DallasTemperature.h>

            #define ONE_WIRE_BUS 4  // GPIO 4 op ESP32

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

            void setup() {
              Serial.begin(115200);
              sensors.begin();

              Serial.println("DS18B20 adres(sen) gevonden:");

              DeviceAddress tempDeviceAddress;
              int numberOfDevices = sensors.getDeviceCount();

              Serial.print("Aantal sensoren: ");
              Serial.println(numberOfDevices);

              for (int i = 0; i < numberOfDevices; i++) {
                if (sensors.getAddress(tempDeviceAddress, i)) {
                  Serial.print("Sensor ");
                  Serial.print(i);
                  Serial.print(" adres: ");
                  printAddress(tempDeviceAddress);
                  Serial.println();
                } else {
                  Serial.print("Sensor ");
                  Serial.print(i);
                  Serial.println(" adres niet gevonden.");
                }
              }
            }

            void loop() {
              // niets nodig hier
            }

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

        
    

In de Serial monitor kunnen we bijvoorbeeld de volgende adressen te zien krijgen:
        DS18B20 adres(sen) gevonden:
        Aantal sensoren: 2
        Sensor 0 adres: 28FF64A2C11603A9
        Sensor 1 adres: 28FF5C9BC1160412

Nu we de codes weten van de verschillende sensoren kunnen we deze gebruiken om ze uit te lezen.
    #include <OneWire.h>
        #include <OneWire.h>
        #include <DallasTemperature.h>

        #define ONE_WIRE_BUS 4  // GPIO waarop de DS18B20 zit

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

        // Adressen van de sensoren (uit je vorige scan)
        // Let op: hexadecimale waarden gescheiden door komma's
        DeviceAddress sensor1 = {0x28, 0xFF, 0x64, 0xA2, 0xC1, 0x16, 0x03, 0xA9};
        DeviceAddress sensor2 = {0x28, 0xFF, 0x5C, 0x9B, 0xC1, 0x16, 0x04, 0x12};

        void setup() {
          Serial.begin(115200);
          sensors.begin();
        }

        void loop() {
          sensors.requestTemperatures(); // Vraag alle sensoren om hun temperatuur

          float temp1 = sensors.getTempC(sensor1);
          float temp2 = sensors.getTempC(sensor2);

          Serial.print("Temperatuur sensor 1: ");
          Serial.print(temp1);
          Serial.println(" °C");

          Serial.print("Temperatuur sensor 2: ");
          Serial.print(temp2);
          Serial.println(" °C");

          delay(2000);
        }

          
    

Tips


☕ Steun deze website met een kop koffie

Op matteman.nl deel ik al mijn projecten, schema’s, uitleg en code gratis — zonder advertenties of sponsordeals. Alles wat je hier vindt, is met zorg gemaakt om hobbyisten, makers en automatiseringsliefhebbers op weg te helpen.
Heb je iets gehad aan de informatie op deze site? Dan kun je mij helpen door een eenmalige bijdrage te doen via Buy Me a Coffee. Daarmee steun je niet alleen mijn werk, maar ook de kosten voor hosting, onderdelen en het onderhouden van de 3D-printer (die het altijd begeeft op het verkeerde moment 😉).
Elke bijdrage — groot of klein — wordt enorm gewaardeerd. Dankjewel! 🙌
☕ Geef een kop koffie