Meerdere DS18B20 temperatuursensoren aansluiten op een ESP32

De DS18B20 (Dallas sensor) is een digitale temperatuursensor die zeer populair is onder makers vanwege de eenvoudige 1-Wire communicatie, goede nauwkeurigheid en mogelijkheid om meerdere sensoren op één datalijn aan te sluiten. In dit artikel lees je hoe je deze sensor aansluit op een ESP32 en wat de basiscode is om ermee aan de slag te gaan in Arduino.
Er kunnen op een eenvoudige wijze meerdere DS18B20 sensoren aangesloten worden op één ESP32. Hierdoor kan je bijvoorbeeld de binne- en buitentemperatuur meten met één ESP32 of bijvoorbeeld de buitentemperatuur en de temperatuur van het zwembadwater.

Specificaties van de DS18B20

EigenschapWaarde
Temperatuurbereik-55 °C tot +125 °C
Nauwkeurigheid±0.5 °C (tussen -10 °C en +85 °C)
Voedingsspanning3.0 V tot 5.5 V
Protocol1-Wire
Resolutie9 tot 12 bits

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.

  • GND van de sensor → GND op de ESP32
  • VDD van de sensor → 3.3V op de ESP32
  • DQ (data) van de sensor → GPIO 4 van de ESP32 via een 4.7 kΩ pull-up naar 3.3V
DS18B20 verbonden met ESP32

Arduino basiscode

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

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

  • Gebruik altijd een 4.7 kΩ pull-up weerstand op de datalijn.
  • Gebruik altijd de 3.3 V voor de voeding en niet alleen de GND en DQ (data)
  • Elke sensor heeft een unieke ID — ideaal voor meerdere sensoren op één bus.

☕ 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