Bastuvakt
  1. Start
  2. Guider
  3. DS18B20 och 1-Wire
Bygg själv

DS18B20 och 1-Wire: så kopplar du en digital temperaturgivare

Tre ledare, ett motstånd och en datapinne. Så fungerar DS18B20, varför den passar i bastu och vatten, hur den kopplas till en 3,3 V-mikrokontroller och vad 85 °C och −127 °C betyder.

Kort svar

DS18B20 är en digital givare som mäter själv och skickar temperaturen som en siffra på en enda dataledare (1-Wire). Den har tre ledare, VDD, GND och DATA, och behöver ett 4,7 kΩ-motstånd mellan DATA och VDD. Den klarar −55 till +125 °C och är noggrann till ±0,5 °C mellan −10 och +85 °C. Ledarnas färger varierar mellan tillverkare, så kontrollera dem innan du kopplar.

Det här är givaren vi använder i Bastuvakt, både i bastun och i vattnet. Den finns färdig i en rostfri kapsel med kabel, kostar runt hundra kronor och är en av de mest använda temperaturgivarna i hobbyelektronik. Här är det som är bra att veta innan du kopplar in den, och de misstag vi har sett andra göra.

Varför en digital givare?

Det finns två huvudsorter av temperaturgivare:

  • Analoga, som NTC-termistorer och PT100. De ändrar resistans med temperaturen, och mikrokontrollern mäter en spänning. Kabeln, kontakterna och mätkretsen påverkar resultatet, och det blir mer kalibrering ju längre kabeln är.
  • Digitala, som DS18B20. Givaren mäter och omvandlar inne i kapseln och skickar en färdig siffra. Kabeln bär ettor och nollor, inte en spänning som kan glida.

För en bastu med några meter kabel och ett vatten med fyra meter är det digitala valet enklast att få rätt. Priset är att den är långsammare (upp till 750 ms per mätning med full upplösning) och att protokollet är känsligt för timing, vilket mjukvaran måste hantera.

Så fungerar 1-Wire

Bussen är en enda dataledare plus jord. Ledaren hålls hög av ett motstånd mot matningen, och både mikrokontrollern och givaren pratar genom att kortvarigt dra den låg. Varje DS18B20 har ett unikt 64-bitars id från fabriken, så flera givare kan dela samma buss.

Vi har ändå en givare per buss, på varsin pinne:

  • Pinnen avgör vilken givare som är vilken. Byter du en trasig givare behöver ingen läsa av ett nytt id och skriva in det någonstans.
  • Ett fel stannar på sin buss. En bastukabel som har tagit skada kan inte slå ut vattenmätningen.

Det kostar en pinne och ett motstånd till. Med många givare, till exempel tio i en tank, är en delad buss bättre.

Kopplingen

Ledare (våra givare) Funktion Till Walter
Röd VDD, matning Stift 26, 3V3 OUT
Vit GND, jord Stift 27, GND
Gul DATA Stift 15 (IO4) för vattnet, stift 18 (IO7) för bastun
4,7 kΩ-motstånd Pull-up Mellan DATA och 3V3 OUT, ett per buss

Färgerna varierar

På givarna vi köpt är vit jord, inte data. På många andra är svart jord och gul eller vit data. Läs produktsidan, och mät om du är osäker. En givare med matningen åt fel håll kan bli het och gå sönder: dra ur den direkt om den blir varm.

Några saker som är lätta att missa:

  • Dra upp till 3,3 V, inte 5 V. Mikrokontrollerns pinnar tål 3,3 V. Givaren fungerar på 3,0–5,5 V, så 3,3 V räcker.
  • Den inbyggda pull-upen räcker inte. Mikrokontrollerns interna motstånd är runt 45 kΩ, för svagt för flera meter kabel. Ett externt 4,7 kΩ behövs.
  • Använd tre ledare. DS18B20 kan drivas "parasitiskt" med bara data och jord, men databladet avråder från det över +100 °C, eftersom läckströmmarna blir för stora. I en bastu ska VDD alltså vara inkopplad.
  • Kabellängd. Med 2–4 m som här räcker 4,7 kΩ gott. Med tiotals meter kan ett lägre värde och partvinnad kabel behövas.

Hela kopplingen, med stift och plintar, finns i monteringsguiden och i 3D-modellen, där du kan vrida kortet och se varje ledare.

Felvärden: 85 °C och −127 °C

Det du ser Vad det betyder
Exakt 85,0 °C Givarens startvärde: den har fått ström men inte hunnit mäta. Kan också vara en riktig bastutemperatur.
−127 °C Ingen givare svarade. Det är en felkod i vanliga Arduino-bibliotek, inte en temperatur.
CRC-fel Datan blev störd på vägen. Läs om.
Värden som hoppar Glapp, ett saknat pull-up-motstånd eller störningar på lång kabel.

Det knepiga är 85 °C, eftersom en bastu faktiskt kan vara 85 °C. Vår firmware läser om givaren när den ser exakt 85,0 och jämför med förra giltiga värdet. Ligger det nära är 85 en riktig temperatur, annars är det ett startvärde. En bruten VDD-ledare ger startvärdet varje gång, så en givare som fastnar på exakt 85 °C rapporteras som ett fel i stället för som en varm bastu.

Kopior och kontroll

Många billiga givare innehåller kopior av kretsen i stället för original. De flesta fungerar, men noggrannheten och beteendet kan skilja sig. Kontrollera därför varje givare innan den monteras:

  • Isvatten. Krossad is med lite vatten, omrört, ska visa nära 0 °C. Det är den enklaste kalibreringen som finns.
  • Frysen. Visar den rimliga minusgrader, och kommer den tillbaka efteråt?
  • Bastugivaren i ugnen. Några timmar på 110 °C visar om kabeln och krympslangen tål värmen. Våra givare anger inte kabelns temperaturklass.

I Zephyr

Vår firmware är skriven i Zephyr, där varje buss och givare beskrivs i devicetree:

w1-water {
    compatible = "zephyr,w1-gpio";
    gpios = <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN | GPIO_PULL_UP)>;

    water_probe: water-probe {
        compatible = "maxim,ds18b20";
        family-code = <0x28>;
        resolution = <12>;
    };
};

Med en enda givare på bussen läser drivrutinen själv dess id, så samma programvara fungerar på alla noder. Använder du Arduino gör biblioteken OneWire och DallasTemperature samma sak.

Vanliga frågor

Hur kopplar man DS18B20?

Tre ledare: VDD till 3,3 eller 5 V, GND till jord och DATA till en valfri pinne. Ett 4,7 kΩ-motstånd mellan DATA och VDD. Färgerna varierar mellan tillverkare, så läs produktsidan.

Vilket motstånd behöver DS18B20?

Ett pull-up-motstånd på 4,7 kΩ mellan DATA och matningen. Den inbyggda pull-upen i en mikrokontroller är för svag för en kabel på flera meter.

Varför visar DS18B20 85 °C?

85 °C är givarens startvärde, det den visar innan den har hunnit mäta efter att ha fått ström. Ett glapp i matningen kan ge det varje gång. Läs om givaren och jämför med förra värdet.

Varför visar DS18B20 −127 °C?

Det är en felkod i Arduino-biblioteket DallasTemperature som betyder att ingen givare svarade. Kontrollera kopplingen, motståndet och att givaren får ström.

Tål DS18B20 bastuvärme?

Kretsen är specificerad upp till +125 °C. Kabeln är ofta det svaga ledet, så välj en givare med silikon- eller teflonkabel och placera den lågt på väggen, där det är svalare än vid taket. Använd inte parasitisk matning över 100 °C.

Källor

  1. Analog Devices (Maxim): DS18B20 datablad
  2. Zephyr: 1-Wire och DS18B20
  3. DPTechnics: Walter, datablad och pinout

Vill er förening vara med?

Pilot våren 2027. Anmälan är gratis och inte bindande. Vill ni hellre bygga själv ligger hela ritningen öppen.