Arduino en de DS18B20 Temperatuur Sensor
De DS18B20 komt in verschillende vormen, dus je kunt precies dat model kiezen wat het meest geschikte is voor jouw toepassing. Er zijn 3 basis varianten, de 8-Pin SO (150 mils), 8-Pin µSOP, en een 3-Pin TO-92. Als je even op eBay of Amazon kijkt, dan zie je dat onze Chinese vrienden een TO-92 versie aanbieden in een waterdichte variant zodat je zonder moeite de sensor in een aquarium, de vijver, buitenshuis, of zelfs in de vriezer kunt hangen, zonder je zorgen te hoeven maken over kortsluiting (alle varianten gebruiken slecht 3 draadje: Zwart (aarde), Rood (Spanning) en wit of geel (Data)).

Verschillende varianten van de DS18B20 sensor

De waterdichte versie van de DS18B20
De DS18B20 is een aardig stukje techniek dat behoorlijk wat in huis heeft. Het kan op twee manieren gevoed worden (normaal en parasiet), werkt op 3.0V tot 5.5V, meet temperaturen tussen de -55°C en +125°C (-67°F en +257°F) met een tolerantie van ±0.5°C (tussen de -10°C en +85°C). Het doet dan ook nog eens de conversie van temperatuur naar een tot 12 bits nummer in 750ms of minder.
Wat ook een mooie optie is, is dat je tot 127 van dit soort sensors kunt combineren en aansluiten op slechts 1 data pin van een Arduino. Geen idee wie 127 sensors nodig heeft, maar op z’n minst 2 is leuk voor b.v. het bijhouden van de temperatuur in het vriesvak en het koelvak van jouw koelkast …
Wat hebben we nodig voor een Arduino en een DS18B20?
Software
- Uiteraard hebben we de Arduino IDE software nodig
- We hebben ook de OneWire library voor de Arduino en DS18B20 nodig (bespaart een hoop werk)
- Onze eigen sketch natuurlijk …
De Arduino IDE kun je op de Arduino website (sterk aan te raden) vinden, of hier op Tweaking4All (maar deze versie kan verouderd zijn).
De OneWire Library vinden we op de OneWire Project Page (altijd aan te raden om de meest actuele versie hier te downloaden) of download v2.2 van Tweaking4All.
Download - Arduino Linux 32 bit
Bestandsnaam: |
arduino-ide-linux32.tar.xz |
Platform: |
Linux |
Versie: |
1.8.8 |
Omvang: |
124.1 MB |
Datum: |
2018-01-02 |
Download Nu
Stuur me Koffie
|
Download - Arduino Linux 64 bit
Bestandsnaam: |
arduino-ide-linux64.tar.xz |
Platform: |
Linux |
Versie: |
1.8.8 |
Omvang: |
121.7 MB |
Datum: |
2018-01-02 |
Download Nu
Stuur me Koffie
|
Download - Arduino MacOS X
Bestandsnaam: |
arduino-ide-macosx.zip |
Platform: |
Apple macOS |
Versie: |
1.8.8 |
Omvang: |
189.7 MB |
Datum: |
2018-01-02 |
Download Nu
Stuur me Koffie
|
Download - Arduino Windows
Bestandsnaam: |
arduino-ide-windows.exe |
Platform: |
Microsoft Windows |
Versie: |
1.8.8 |
Omvang: |
110.7 MB |
Datum: |
2018-01-02 |
Download Nu
Stuur me Koffie
|
Harware
De USB kabel is alleen maar nodig gedurende de experimenteer fase voor het programmeren en tijdelijk voeden van de Arduino. In een eindopstelling gebruiken we natuurlijk een aparte voeding.
Aansluiten van de Arduino en de DS18B20
Dit is nu het mooie van de 1-wire oplossingen. Het kan eigenlijk niet eenvoudiger.
De GND of Aarde pin van de DS18B20 gaat naar een GND pin op de Arduino.
De Vdd pin van de DS18B20 gaat naar de +5V op de Arduino.
De Data pin van de DS18B20 gaat naar een (digitale) pin naar keuze op de Arduino, ik gebruik in dit artikel Pin 2.
We moeten alleen nog een weerstand van 4.7 KΩ toevoegen als zogenaamde “pull-up” weerstand. Ik heb en aantal waarden gezien op andere websites maar deze waarde lijkt het meest gebruikt en is ook het dichtste bij de voorgestelde 5 KΩ die de fabrikant suggereert.
In onderstaande illustratie zien we de gewone manier om een DS18B20 op een Arduino aan te sluiten.
Controleer in de Sketch (later) regels 10 en 65 zodat de juist voedingsmethode en data pin gebruikt worden!

DS18B20 op een Arduino aansluiten (standaard voedingsmethode)
Hieronder een foto van mijn test opstelling … kan eigenlijk niet eenvoudiger.

Mijn test opstelling voor de temperatuur sensor
Parasiet Voeding vs Gewone voeding
Naast de gewone methode om voeding aan de DS18B20 te leveren, is er ook een zogenaamde “Parasiet” methode waarbij we de +5V NIET aanluiten op de Vdd pin van de DS18B20. In plaats daarvan sluiten we pin 1 en 3 van de DS18B20 sensor kort (GND aan Vdd) – we hebben nu slechts 2 draadjes nodig i.p.v. de gebruikelijke 3.
Nadeel van de parasiet methode is dat de draadjes niet te lang mogen worden en als je meerder sensoren gebruikt kan dat ook nog eens problemen leveren. Het is natuurlijk net wat je wilt gebruiken, maar voor mij persoonlijk zou deze methode alleen maar zinvol zijn als het juist wel met lange draden en meerdere sensoren zou werken. Maar dat zal wel aan mij liggen. 
De Parasiet kan geplaagd worden door van alles en nog wat, en ik kan deze methode niet aanraden voor een stabiele opstelling.
Arduino Sketch voor het meten van Temperaturen
Installatie van de OneWire Library
Als je bovenstaande ZIP hebt gedownloadn, of je hebt het van de OneWire Project Pagina, dan zou je zonder veel moeite de Library kunnen installeren met de Library Import optie in de Arduino IDE software. Kies uit het menu “Sketch” “Import Library” “Add Library” en selecteer het ZIP bestand.
Asl dit NIET werkt en je krijgt foutmeldingen :
In dit geval heeft de Arduino IDE moeite met een geschikte directory in het ZIP bestand te vinden. Het eenvoudigste los je dit op door het ZIP bestand uit te pakken. Zorg ervoor dan alles nu in een directory staat die naam “OneWire” heeft (je vindt hierin een directory “examples” en een zooi andere bestanden) welke je vervolgens in de libraries directory van de Arduino IDE kopieert.
Om de “examples” in het menu van de Arduino IDE menu te vinden, moet je de Arduino IDE herstaren.
Laden van de Sketch
De volgende Sketch zit bij de OneWire library, en komt dus met het gedownloade ZIP bestand mee. Als je de OneWire Library hebt geinstalleerd dan zul je dit voorbeeld in het “examples” menu vinden.
Ga naar “File” “Examples” “OneWire” en kies het “DS18x20_Temperature” voorbeeld wat er ongeveer zo uit zou moeten zien als hieronder weergegeven.
De code in dat voorbeeld, gebruikt de OneWire Library handig om door alle mogelijke aangesloten DS28B20 temperatuur sensors te gaan (aan het einde van dit artikel laat ik je zien hoe je meerder sensoren kunt aansluiten), leest van iedere sensor vervolgens de data en stuur de gegeven vervolgens naar het debug venster (menu: “Tools” “Serial Monitor“).
De output in het debug venster ziet er dan ongeveer zo uit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ROM = 28 88 84 82 5 0 0 6A
Chip = DS18B20
Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1
Temperature = 21.37 Celsius, 70.47 Fahrenheit
No more addresses.
ROM = 28 88 84 82 5 0 0 6A
Chip = DS18B20
Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1
Temperature = 21.37 Celsius, 70.47 Fahrenheit
No more addresses.
ROM = 28 88 84 82 5 0 0 6A
Chip = DS18B20
Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1
Temperature = 21.37 Celsius, 70.47 Fahrenheit
No more addresses. |
Gewone voeding of Parasiet voeding?
De DS18B20 kan op twee manier gevoed worden: De gewone methode, of de parasiet methode.
De gewone methode heeft 3 draadje nodig, en de Parasite mode gebruikt er maar 2.
Voor correcte temperatuur meting moet je de juiste methode opgeven in de Arduino sketch:
Voor Parasite methode moet regel 65 er zo uit zien: ds.write(0x44, 1);
Voor de Gewone methode moet regel 65 er als volgt uit zien: ds.write(0x44);
Wijs de juiste Data Pin toe!
In regel 10, waar je “OneWire ds(2);” ziet staan, wijzen we de gebruikte data pin toe.
Ik gebruik zelf pin 2, maar de standaard waarde in het OneWire voorbeeld gebruikt pin 10.
(Ik wil pin 10 voor iets anders gebruiken)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| #include <OneWire.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire ds(2); // on pin 2 (a 4.7K resistor is necessary)
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
Serial.print("ROM =");
for( i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44); // start conversion, use ds.write(0x44,1) with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print(" Data = ");
Serial.print(present, HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
Serial.print(fahrenheit);
Serial.println(" Fahrenheit");
} |
Hoe sluiten we meerdere Sensors aan
De DS18B20 Digitale Temperatuur sensor staat het toe om meerder sensors parallel aan te sluiten en de de OneWire library heeft alles wat we nodig hebben om al deze sensors uit te lezen. Hieronder laat ik je de twee manieren zien hoe je dat kunt doen – afhankelijk van de gekozen voeding methode.
Als je veel sensoren combineert (meer dan 10) dan kan het beter werken als je weerstand door een lagere weerstandswaarde vervangt, b.v. 1.6 KΩ of zelfs minder.
Het kan voorkomen, als je veel sensoren gebruikt (meer dan 10) dat je tegen data problemen aanloopt. Voordat doel kun je experimenteren met een extra weerstand van 100 … 120 Ω tussen de data pin van de sensor en de Arduino, voor elke sensor !
Als je meerdere sensoren gebruikt (2 in dit voorbeeld) dan kan de output van de bovenstaande sketch er als volgt uit zien:
1 2 3 4 5 6 7 8 9 10
| ROM = 28 88 84 82 5 0 0 6A
Chip = DS18B20
Data = 1 51 1 4B 46 7F FF F 10 FE CRC=FE
Temperature = 21.06 Celsius, 69.91 Fahrenheit
ROM = 28 DA CA 27 5 0 0 49
Chip = DS18B20
Data = 1 4E 1 4B 46 7F FF 2 10 D9 CRC=D9
Temperature = 20.87 Celsius, 69.57 Fahrenheit
No more addresses. |
Sensore selectie
Als we meerdere sensoren gebruiken, hoe weten we dan welke sensor welke data geeft?
Serie nummer of te wel: uniek Identificatie Nummer
Omdat de sensor geheel digitaal is, kunnen we een sensor identificeren aan de hand van een identificatie nummer, maar ja, dan moeten we natuurlijk wel eerst weten wat het identificatie nummer is …
Als je naar de debug output kijkt van de bovenstaande sketch dan zie je dat dit daar al weergegeven wordt als een 64-bits uniek nummer (de “ROM” waarde), in het voorbeeld: 28 88 84 82 5 0 0 6A of 28 DA CA 27 5 0 0 49 (in bovenstaande output).
Nogmaals: Als je meer dan 10 sensoren koppelt, dan wordt er gesuggereerd een weerstand van 100 … 120 Ω tussen de data pin van de DS18B20 en de data pin van de Arduino te plaatsen (bij iedere sensor) om stabiliteit te verbeteren. Helaas kan ik dit niet bevestigen omdat ik maar 2 sensors heb.
Normale Voeding
Als je de normale voeding gebruikt, dan is de onderstaande schakeling wat je nodig hebt om meerdere sensoren aan te sluiten.

Meerdere DS18B20 sensoren in een normale voeding opstelling
Parasiet Voeding
In deze methode sluiten we in principe pin 1 en 3 van de sensor kort en trekt de sensor stroom via de data pin.

Meerdere DS18B20 sensoren in een parasiet voeding opstelling
Meer Informatie
Hieronder een kleine lijst met meer informatie, voor het geval je dieper in de materie wilt duiken.
Reacties
Er zijn 77 reacties welke je hieronder kunt lezen.
Je kunt jouw eigen opmerkingen plaatsen m.b.v. dit formulier, of een reactie op een bestaande opmerking plaatsen door op de "Beantwoorden" knop te klikken.
super bedankt mede dankzij deze uitleg aan de praat gekregen!!
eddie
Hi Eddie!
Dank je wel voor het compliment, mooi om te horen dat het behulpzaam voor je was!
hans
bedankt voor de uitleg, zonder deze info zou het me nooit gelukt zijn om het te laten werken.
met m’n zelfgemaakte programma kreeg ik temperaturen als -127°C te zien op seriële monitor wat niet mogelijk is
waarschijnlijk omdat ik nog maar net begonnen ben met het (spelen) met arduino ;D
denzel
Hoi Denzel!
Dank je wel voor de positieve feedback, ik hoop dat alles nu werkt naar wens …
hans
Dank voor de presentatie.
Met deze hulp heb ik nu een werkende thermometer.
Toon
Dank je wel Toon voor de positieve feedback – dat wordt zeer gewaardeerd!
hans
ik krijg de ene na de andere foutmelding…
wat is r verkeerd
rem0
Ehm,… misschien handig als je ook opgeeft wat de foutmeldingen zijn, en waar je ze krijgt.
In de Arduino IDE? In de debug output? Tijdens het compileren?
hans
Bedankt voor deze duidelijk uitleg. Hierdoor kan ik snel weer verder naar de volgende barierre :)
Ronald
Dank je wel Ronald voor de leuke reactie!
Laat vooral weten wat de volgende barrière … misschien een leuk onderwerp voor een volgend artikel
…
hans
Hallo.
Geweldige uitleg! Ik was al een tijd aan het zoeken op het internet naar zo een temp project maar wel met een duidelijke uitleg. Ik ben namelijk nog leek. In verschillende talen ook gezocht Engels en Duits en goede beschrijvingen gevonden in het Russisch. Maar uiteindelijk deze, gewoon in het Nederlands de mooiste uitleg!
Ik heb nog een vraag; kun je het project ook uitvoeren met DHT22 of 11 componenten? Of werken die totaal anders. En/of kun je de componenten ook mengen bv buiten en in de kelder DHT11 / 22 en de rest DS18B20.
Een heel andere vraag, weet jij een plek waar ik een duidelijk schema kan vinden voor de HS110?
Groeten en compliment voor je uitleg hier!!!!!
Alfred
Hallo Alfred,
hartelijk dank voor het mooie compliment!
Als eerste ben ik niet zo bekend met de DHT22 en DHT11, maar voor zover ik kan zien heeft het de mogelijkheid om naast temperatuur ook nog eens luchtvochtigheid te meten. Uit dit Arduino artikel maak ik op de de DS18B20 nauwkeuriger zou zijn dan de DHT11/22. Uit dit artikel kan ik afleiden dat de manier van aansluiten voor een DHT22/11 duidelijk anders werkt dan voor een DS18B20, je zult een pin nodig hebben voor iedere sensor en van te voren dus moeten rekening houden, in jouw code, dat iedere sensor een eigen specifiek stukje code nodig heeft. Dit in tegen stelling tot de DS18B20 (die blijkbaar in de DHT33/44 te vinden is), waar je maar 1 stukje code is – de DS18B20 is dus “intelligenter” – het gebruikt maar 1 gemeenschappelijke pin, ipv een pin per sensor.
Conclusie: Je kunt ze combineren, maar je zult voor de DHT22/11 wel specifieke code moeten toevoegen. Zelf vindt ik het handiger om alleen de DS18B20 te gebruiken, maar als je luchtvochtigheid wilt meten … tja, dan moet je aan de slag met de DHTxx modellen.
Ik vond op Github nog wat code die gebruik maakt van beiden – hopelijk helpt dat een beetje met inzicht krijgen hoe het e.e.a. werkt.
Wat de HS110 sensors betreft moest ik inderdaad ook even zoeken. Ik vond 2 bronnen voor de spec sheets, maar of je er wat aan hebt weet ik niet (Mouser, Datasheet.hk).
Ik vond een aantal artikelen mbt het gebruik van de HS110, maar ze lijken me wat minder eenvoudig in gebruik dan de DHT22/11. Zie o.a. Google Site Sensor voorbeelden, dit Arduino Forum Onderwerp. Voorzichtig gezegd lijkt me het gebruik van een HS110 (het eerder genoemde forum artikel laat ook de aansluitingen zien geloof ik) wat minder praktisch …
Sommige schema’s (voorbeeld 1, voorbeeld 2) praten over het toevoegen van een 555 IC, wat de schakeling niet eenvoudiger maakt, en andere schema’s (voorbeeld) geven een recht-toe-recht-aan opstelling maar vergeten dan duidelijk aan te geven welke library/code nodig is.
Na wat zoeken vond ik voor dat laatste eenvoudigere voorbeeld de benodigde library – Loguino 2.0. Misschien heb je daar wat aan. Helaas ben ik aan het reizen en heb dus geen toegang tot mijn Arduino spullen … ik heb daarnaast ook geen HS110 …
Hopelijk helpt je dit een beetje op weg – ik snap helemaal dat men soms door de bomen het bos even niet kan zien.
hans
Hoi Mooi beschreven maar ik snap 1 ding niet…. Hoe lees je de temperatuur af op de pc?
Heb je daar een apart prgramma voor nodig of doe je dat met arduino ide.
Ik hoor graag
Groet
Leo
leo
Hallo Leo!
Dank je wel voor het compliment!
Het lezen van de temperatuur in dit artikeltje gaat er vanuit dat je het in de Arduino IDE debug afleest – leuk voor een experiment maar natuurlijk voor dagelijks gebruik niet handig.
Het idee is om dit als start project te gebruiken voor b.v. het aansturen van
– een LED display (zoals dit 7 segment LED model),
– een LCD schermpje (zie ook “SainSmart 1.8″ TFT Arduino Kleuren LCD Display“) ,
– een aantal gewone LEDs (welke elke een temperatuur range aangeven per LED, b.v. rood voor hoger dan 50 graden),
– een ouderwetse analoge meter (b.v. deze),
.. of … b.v. uitlezen via een webbrowser (zie Arduino Ethernet – Data met PHP naar een server sturen (Push) en Data van de Arduino ophalen (Pull)). Voor de webbrowser optie heb je alleen wel een ethernet of wifi module nodig.
In alle gevallen heb je wat extra componenten nodig natuurlijk, waarbij gewone LEDs of een 7-segment display misschien de goedkoopste oplossingen zijn. Ik zag op eBay al een paar goedkope 7-segment display: link 1 (groot) en link 2 (mini) welke elk zo’n 3 Euro zijn.
Helaas heb ik nog geen tijd gehad om een artikeltje in elkaar te zetten voor deze 7-segment displays (ik reis nogal wat de laatste maanden en heb m’n spullen niet bij me).
hans
Ok Helder , dank je wel!
Leo
Hoi, geweldig artikel! Binnenkort ga ik 4 temperatuursensoren op een buffervat koppelen aan een Arduino. Deze wil ik schakelen met een multicolor LEDstrip (APA102) van ongeveer 2 meter. Deze moet de temperaturen in een gelaagd buffervat (heet water bovenin, koud water onderin) weergeven. Rode leds (bovenin) voor warm en blauwe leds (onderin) voor koud. Als dit buffervat opgewarmd wordt, dan worden dus meer leds roodgekleurd.
Waar zou ik hulp kunnen vinden voor de code die ik moet gaan gebruiken? Het is een beetje complexer als een linair verloop (4 temperatuur sensoren in plaats van 2).
Roelof
Hi Roelof!
Leuk idee! Ook al moet ik toegeven dat ik eerst even de term “buffervat” moest opzoeken, en me de werking nog niet 100% duidelijk is. Ik begrijp dat een buffervat een gesloten vat is welke tijdelijk warmte opslaat in water voor later gebruik – maar daar houdt het even bij op.
Hoe wil je de sensoren plaatsen? En ik weet niet precies wat je bedoelt met koud onderin en warm bovenin. Twee gescheiden gebieden in het vat? En die wil je apart meten?
hans
Inderdaad, het buffervat bevat 1000 liter water, en is 2 meter hoog bij 80 cm doorsnede. Hieruit haal ik mijn warmte voor de radiatoren, de douche en de kranen. Daarnaast wordt er warmte toegevoegd door de zonnepanelen, de houtkachel of de cv-ketel. Op het buffervat bevinden zich 4 sensoren die hun info geven aan de controller (volgens mij ook een soort Arduino). Die stuurt op zijn beurt de pompen aan voor de radiatoren, de ventilatoren etc.
Het buffervat is gelaagd, dwz dat warm water bovenop het koude ligt. Zo heb ik altijd een kolom van ca. 30cm water van minimaal 60 graden helemaal bovenin. Daaronder zakt de temperatuur snel naar 40 graden tot 20 graden helemaal onderin. Als er veel zon is, dan wordt het vat misschien wel 80 graden in zijn geheel. Ik kan de waarden van de 4 sensoren aflezen, maar ik wil graag een duidelijke afspiegeling van de temperatuur in het vat. Vandaar deze ledstrip van 2 meter (288 leds haha). Als alles blauw is dan zie ik dat ik mijn houtkachel moet opstoken tot alles weer rood is.
Ik ga de 4 sensoren naast de bestaande sensoren plaatsen: 1 helemaal bovenaan, 1 helemaal onderaan en twee daar tussenin (niet op gelijke afstanden). De temperatuursverdeling in het vat is niet linair voor zover ik weet.
Roelof
Hi Roelof,
interresant project!
Lijkt me het mooiste om op de LED strip de verhoudingen te zien. Dus b.v. onderin blauw, oplopend to rood (mocht het water onderin koud zijn en bovenin heet zijn). Een verloop tussen de 4 punten zou dan het mooiste zijn, en ik vermoed dat je dit in gedachten hebt. De berekening zal vast niet echt lineair zijn, maar wat de berekening wel precies zou moeten zijn is een goede vraag. Ik zou lineaire interpolatie gaan gebruiken voor de berekening – dit kan echter met 4 punten wat lastig worden als het zaakje zich niet lineair gedraagt.
Het gebruik van zogenaamde curve fitting, voor non-lineaire berekeningen, wordt wat berekening betreft weer lastig, zeker voor een Arduino.
Als we een “basis” formule hebben, op basis van 4 gemeten temperature, dan kunnen we die formule gebruiken om tussen liggende temperature te schatten en aan de hand van die berekende waarde de blauw/rood intensiteit opgeven.
Helaas moet deze “formule” berekend worden en van wat ik zo 1-2-3 online lees, is dat misschien een beetje te veel werk voor de Arduino.
Ik zou dus lineaire interpolatie proberen. Steeds de waarden tussen 2 punten bepalen hiermee zodat je een redelijk net kleur verloop hebt.
Oh en nu vindt ik net Arduino-Splines – misschien dat het helpt (beetje lees werk om het te begrijpen).
hans
Hoi Roelof,
Is het jou gelukt om het klaar te krijgen met de led strip? Leek mij ook leuk om te maken voor mijn buffervaten.
Mvg,
David Oldewarris
David
Beste,
wil je toch meegeven dat dit zoals meermaals is aangehaald een geweldig artikel is.
(Nadeel van codes van het net kopiëren is dat deze altijd vol fouten staat, het is lijk dat iedereen te gierig is om zijn code door te geven, dit noemen ze dan open source…….)
(Dit maakt het artikel dan ook zo goed is dat info eerlijk is en vollledig, doe zo verder zou ik zeggen;-) )
Ik heb mijn code wel anders op gemaakt maar de begin info hiervan genomen.:-)
Ik probeer nu al een maand de temperatuur uit te lezen op een platform genaamd thingspeak( er bestaat ook een ander platform, xively maar daar werken ze helaas met een wachtlijst) maar dit wil maar niet lukken.
Heb al veel research op het net gedaan, codes gekopieerd aangepast gedebugd maar geen enkel wil mij connecteren op de server.
Compileren en uploaden geen probleem, connectie maken met mijn eigen wifi thuis geen probleem connectie met server PROBLEEM.
Heeft u daar al ervaring mee? Is het makkelijker voor u dat ik u de codes eens stuur ?
Hardware:
ds18b20
arduino uno
arduino wifi
Groetjes
Miguël
Miguël
Hi Miguël!
Dank je wel voor het mooie compliment – en ik ga zeker zo door …
Ik wil zeker wel even kijken of ik je op weg kan helpen!
De eerste vraag is natuurlijk: Werken hun demo’s (hier) voor jou?
Met name lijkt me deze van belang: link.
Ik neem even voorzicht aan dat je dat al geprobeerd hebt.
ThingsPeak is ook voor mij nieuw, dus je hoeft nog geen code’s te posten, eerst even door de basis gaan …
hans
Beste Hans,
Sorry voor mijn late reactie.
Mits dit project als eindwerk dient heb ik het de laaste tijd zeer druk had.
Het is me ondertussen gelukt om de sensor waarde op een server te verkrijgen en een trigger op te stellen die me een sms stuurd.
Toch bedankt voor de moeite.
Mvg
Dumont Miguël
Miguël
Hi Miguël,
Graag gedaan en geen probleem wat de late reactie betreft hoor.
Ik zit zelf midden in een drukke verhuis van de Verenigde Staten naar Nederland, dus mijn reactie snelheid zal ook wel laag zijn de komende weken.
Mooi om te horen dat het werkt!
Wat gebruik je voor het versturen van een SMS?
hans
Beste Hans,
Hele mooie uitleg, hartelijk dank daarvoor.
Bij het uitvoeren van het voorbeeldprogramma, krijg ik in de seriële monitor steeds de melding: “No more addresses.”
Ik blijf dus steeds vast zitten in de eerste if-loop. Enig idee wat hiervan de oorzaak zou kunnen zijn?
Alvast bedankt,
Met vriendelijke groeten,
Ben
Ben
Hi Ben,
er zijn 2 mogelijke oorzaken:
1) De sensors zijn niet correct aangesloten, dus even alle draadjes controleren (maar dat had je vast al gedaan),
2) Je hebt een Chinese clone die niet 100% hetzelfde werkt als de genoemde sensoren.
Voor de niet 100% zuivere Chinese clones, zie ook deze post onder de Engelstalige versie van dit artikel.
hans
Ik ben een beginnend arduino-gebruiker en daarom is dit een fantastisch stuk! Bedankt, hier kan ik direct mee aan de slag.
Je noemt ook de mogelijkheid om een analoog signaal (0 – 5 V?) als output te krijgen. Kun je misschien aangeven hoe ik dat moet doen? Ik wil graag een kleine versie maken met één temperatuursensor en een arduino nano met een analoog uitgangssignaal.
Groeten,
Gerard
Gerard
Hallo Gerard!
Dank je wel voor het compliment
.
Een analoge output is iets lastiger dan een analoge input. Voor een analoge input heeft de Arduino een Analoog-naar-Digitaal converter, maar voor output helaas niet.
In plaats daarvan geeft AnalogWrite() een puls, en deze puls moet dus omgezet worden naar een stabiel analoog signaal (zie onderstaande afbeelding).
Na wat zoeken vond ik het schema van een eenvoudige low-pass filter, dit artikel (in het het Engels) geeft een goede beschrijving hoe je de waarden van de weerstand en condensator moet bepalen. Een calculator vond ik hier. Een zeer uitgebreid artikel vind je hier.
Zoals je ziet, het lijkt eenvoudig, maar toch wel even bewerkelijk wat achterliggende berekening betreft.
Ik moet eerlijk toegeven dat ik het wat eenvoudig had verwacht, maar als je de tijd neemt en alles goed doorleest dan moet het mogelijk zijn.
hans
hallo
bedankt voor de goed uitleg. erg duidelijk.
alleen krijg ik hem echt niet aan de praat. heb alles aan gesloten zoals op de fotos (parasiet en normaal) alleen als ik hem aansluit op de normale modes gaan de lampjes van mijn adruino lanzaam uit (dus ik snel stekker er weer uit en opnieuw checken) na van alles proberen nog steeds het zelfde probleem. toen maar de parasiet ipstelling maar bij parasiet opstelling gebeurt er ook niks de lampjes van de adruino blijven wel branden maar er komt niks in beeld. ook al meerdere codes geprobeer maar
steeds het zelfde
enig iedee wat het kan zijn
bedankt.
bram
Hoi Bram,
jammer om te horen dat je tegen een probleem aanloopt.
De enige 2 mogelijke oorzaken die ik kan bedenken zijn:
– Toch fout aangesloten (misschien dat de kleuren van de kabels niet overeenkomen met het model dat ik gebruikt heb?)
– De sensor is niet hetzelfde als het model wat ik hier gebruik (b.v. een Chinese clone – zie ook het Engelstalige artikel).
hans
Hoi Bram,
sinds gisteren middag loopt bij mij , ook na veel lezen, proberen enz. een Uno met ethernet -shield in mijn thuisnetwerk.
13 Stuks DS18B20 (3 draads ansluiting met 1,2 KOhm weerstand worden mooi na elkaar door de Browser uitgelezen en getoont.
De Refresh, om een aktuele stand te hebben is nog niet gelukt. Moet dus altijd nieuw met b.v. F5 aktualiseren.
De broncode kun je natuurlijk graag krijgen, weet helaas niet hoe ik het van hieuit kan doen.
Groetjes John
John
Hallo John en Bram,
de beste methode om bron code te delen is via het forum – je moet je helaas wel aanmelden (omdat er van die spam grapjurken zijn), maar daarna kun je wel een onderwerp starten en attachments, zoals jouw broncode, plaatsen.
Mocht je besluiten dit te doen, dan kan het handig voor andere lezers zijn als je dan de link van het forum topic hier even plaats. Maar dat is natuurlijk geheel optioneel …
hans
[…] Temperatuur meten […]
Ook bij mij had ik het zo aan de gang, zonder dit zou het nooit gelukt zijn.
Fijn dat er mensen zoals jouw zijn die de tijd nemen om dit op het net te zetten!
mathieu
Dank je wel Mathieu!
het is altijd erg leuk om zulke reacties te horen! Dank je wel voor de leuke reactie en motivatie!
hans
Beste Hans,
Bedankt voor het maken van dit heldere artikel. Ik kan de DS18B20 uitlezen, heb de sketch volledig ontdaan van ballast. Mijn serial monitor print nu het onderstaande uit:
287DDED0600E0;22.06
28E654D360057;20.69
Wat ik nu eigenlijk wil is dat ik de HEX code omzet naar een naam. B.v. woonkamer, slaapkamer, etc.
Woonkamer;22.06
Slaapkamer;20.69
Kun jij aangeven hoe dit moet? of waar ik dit kan vinden?
Alvast bedankt.
M.v.g.
Kevin
Kevin1978
Hi Kevin!
Hartelijk dank voor het compliment – dat wordt altijd gewaardeerd
.
Als je liever namen ziet dan hexadecimale nummers (wat ik me kan voorstellen vanwege de leesbaarheid), dan zul je de variable addr[] (zie regel 32 in de code hierboven) moeten vergelijken met nummers die je vast in de code zet.
Het lastige is het vergelijken van arrays.
De eenvoudigste manier lijkt me door het statement “memcmp()” te gebruiken – dit vergelijkt 2 geheugen blokken voor een gegeven lengte, en geef 0 (nul) terug als alle vergeleken bytes hetzelfde zijn.
Omdat een adres 8 bytes lang is moet je dus eerst 2 arrays maken voor de woonkamer en slaapkamer ROM nummers.
Vervolgens moet je het gelezen adres (addr) vergelijken met deze 2 arrays om te zien met welke we te maken hebben, je dus zoiets kunnen doen:
Let op: Bij het maken van de arrays voor Woonkamer en Slaapkamer heb ik voor elk getal “0x” gezet (hex notatie).
Ik heb dit niet kunnen testen, heb even geen Arduino bij de hand, maar de Arduino IDE compileerde het zonder fouten.
…
Hopelijk helpt je dit op weg
hans
Ik doe het maar even hier en zo. Na honderd keer klikken en mijn profiel te kunnen zien, bijdragen van vele mensen, kom ik niet bij het forum om een vraag te stellen. Misschien is het handig om bovenaan de homepage (of bij je profiel) een link te zetten naar het forum.
Na een half uur zoeken geef ik het op.
arendt
Hallo Arendt!
Jammer om te horen dat je tegen problemen aanloopt – en dat is uiteraard niet de ervaring die ik gebruikers wil meegeven.
Helemaal bovenaan, net onder de oranje/bruine balk, staat al een link naar het forum (“Gemeenschap“).
Nu kan ik me voorstellen dat “Gemeenschap” niet het beste woord is – voor mij persoonlijk zou het woord “Forum” of “Community” beter werken, maar ik ben opgegroeid met niets anders dan de Engelse taal voor computer gebruik. Ik kan dat natuurlijk aanpassen naar het woord “Forum”.
Een link bij het profiel is ook geen slecht idee!
Behalve het vinden van het forum, waren er nog andere issues waar je tegen aan liep? Ik wil graag mijn website verbeteren – dus alle input is welkom!
hans
Ik heb jouw suggesties doorgevoerd!
Nogmaals dank voor de input!
hans
Voor het meten van negatieve (celsius) waarden heb ik dit (2e regel) onderaan toegevoegd.
onder: celsius = (float……
if (celcius>=2000) {celsius = celsius – 4096}
Zo te zien werkt het goed, mvg Ruud
Ruud
Hoi Ruud!
Dank je wel voor de tip.
Ik ben nog niet tegen negatieve waarden aangelopen,… zal ik dus t.z.t. toch eens moeten gaan proberen.
hans
Beste Hans,
ik kreeg ook de melding “no more adresses”. Ik heb op het Engelse forum gekeken naar de mogelijk Chinese tegenhangers en wat daar aan te doen is. Dat stukje code heb ik vervangen in plaats van deze:
ds.reset();
ds.select(addr);
ds.write(0x44);
Ook heb ik het schema gecontroleerd. Ik heb de sensor bij Tinytronics gehaald. Zie; http://www.tinytronics.nl/shop/Sensoren/Temperature-Air-Humidity/DS18B20-TO-92-Thermometer-Temperatuur-Sensor-met-Kabel—Waterproof
Echter de melding die ik ook krijg onderaan is als volgt:
“Niet gebruikt: C:\Program Files (x86)\Arduino\libraries\OneWire
De schets gebruikt 6.274 bytes (19%) programma-opslagruimte. Maximum is 32.256 bytes.
Globale variabelen gebruiken 400 bytes (19%) van het dynamisch geheugen. Resteren 1.648 bytes voor lokale variabelen. Maximum is 2.048 bytes.”
Ik was van plan de sensor te gaan gebruiken voor een temperatuur logger. Dus had ik het ethernetshield er op zitten.
Na deze er af gehaald te hebben en de originele code weer te gebruiken (zonder de Chinese code) krijg ik gewoon de juiste output zonder de bovenstaande melding over opslagruimte.
Afijn, de vraag is nu. Enig idee wat ik moet doen om deze sensor samen met de Ethernet Shield te gebruiken met SD kaart?
Bedankt alvast.
Groeten Daniel
Daniel
Hallo Daniel,
Het probleem zit ‘m in dat beiden (Ethernet en OneWire) waarschijnlijk een conflict hebben m.b.t. de libraries of de gebruikte pin.
Ik vindt dat zelf altijd een lastig probleem om op te lossen.
Je kunt experimenteren met de temperatuur sensor(en) aan een andere pin te hangen en dan de regel
aan te passen (dus ipv “2” het gebruikte pin nummer invullen).
Maar ook voor mij blijft dat vaak proberen met vallen en opstaan. Misschien dat lieden in de engelse versie va dit artikel behulpzaam kunnen zijn.
hans
Het werkt. Ik wil nu graag de (digitale) temperatuur op een LCD laten verschijnen. Hoe moet ik dit aanpakken?
roeland
Mooi!!
Er zijn verschillende manieren om een LCD schermpje aan de Arduino te hangen.
Als je een wat complexer display wilt gebruiken, lees dan dit artikel (als voorbeeld).
Een simpeler LCD display is b.v. in dit artikel besproken.
Er zijn legio voorbeelden te vinden – misschien tijd om hier eens een artikeltje aan te wijden.
hans
Is inmiddels geluk. Mijn eerste projectje met de arduino 😄
roeland
Mooi!
Welke “methode” heb je gebruikt voor het LCD display?
hans
Ik heb een ds1822, dat zou ook goed moeten werken, maar krijg alleen als temperatuur 127,94 Celsius of 262,28 Fahrenheit. Wat kan er fout zijn?j
De sketch heb ik gewoon overgenomen, voor de Sainsmart uno, ik heb ook de parasiet voeding geprobeerd, werkt ook niet, zelfde resultaat.
De sketch meldt netjes dat het een ds1822 is.
Joep Frensen
Ik vermoed dat de temperatuur conversie voor een DS1822 net even anders is als voor een DS1820.
Een berekening die ik hier vond, laat een calculatie voorbeeld voor een DS1822 zien (gelezen waarde 171 HEX):
0x0171 HEX=369 DEC, 369*0.0625=23C (74F).
Misschien helpt dit in de juiste richting?
hans
Prachtig en duidelijk uitgelegd! Knap werk ! Ik had graag een simulatie gemaakt van de DS18B20Z+, dus Arduino die gegevens binnen krijgt van bvb een potmeter net alsof het de DS18B20 zou zijn. De bedoeling is om een verwarmingsinstallatie na te bootsen. De waarde die de Arduino Mega als input krijgt zou ook op een LCD moeten verschijnen…Alvast bedankt voor eventuele input.
Kristof
Hoi Kristof!
Hartelijk dank voor het mooie compliment
Na bootsten van de DS18B20 met een potmeter is helaas geen optie.
De DS18B20 handelt alles intern af en levert een digitaal signaal, dit in tegenstelling tot een potmeter en eenvoudigere temperatuur sensoren. Als je een simulatie wilt doen, dan moet je de code helaas aanpassen zodat het met een temperatuur gevoelige weerstand (of: potmeter) kan werken – maar je hebt dan voor iedere sensor een aparte pin nodig. Meer over Thermistors in dit artikel.
Weergave van waarden op een display is zeer zeker mogelijk, en ik zou met een eenvoudig Character LCD beginnen (zie ook dit AdaFruit artikel). Omdat deze displays eenvoudig te gebruiken zijn en omdat vaak goedkoop zijn, zeker een aanrader om mee te beginnen.
Overigens, mocht je pinnen willen besparen dan kan een dergelijk display ook worden voorzien van USB en/of serieel poort (zie dit AdaFruit artikel).
Nog een goed artikel om te lezen: Arduino website.
Hopelijk helpt je dit een beetje op weg …
hans
Dit is zeker een goede start voor mij Hans. Bedankt voor de info. Vooral in het artikel over thermistors ga ik zeker verder uitzoeken of ik hier wat mee kan. Het lijkt me in elk geval een goed uitgangspunt.
Kristof
Hoi Kristof!
Helemaal toppie – laat ons vooral horen hoe het experiment afloopt! Succes!
hans
Hallo Hans,
Geweldige tutorial! Hiermee kan en durf ik als Arduino beginner aan de slag.
Wel loop ik direct tegen een vraagstuk aan wat voor mij niet triviaal is. In mijn setup komen drie sensoren. Nu wil ik de gemeten temperatuur per sensor kunnen traceren en gebruiken in mijn programmeercode en lcd.print.
Dus niet zoals in jouw voorbeeld met meerdere sensoren gewoon als “loop blokjes” achter elkaar, maar meer zoals Kevin in zijn woonkamer/slaapkamer reactie.
Hoe zorg ik ervoor dat ik de gemeten waarde van ieder van de sensoren netjes op sla in een traceerbare/herbruikbare variabele?
Uiteindelijk wil ik op een LCD iets plotten als:
T=25 T=30 T=90
25% 50% 100%
De bovenste zijn dan de gemeten waardes van de temperatuur sensoren en de onderste de duty cycle output voor PWM aansturing van een pomp.
Lars
Dank je wel Lars!
Je zou een globale variabele kunnen bijhouden, en omdat je er 3 gebruikt zou je dat in een array kunnen zetten.
B.v.
en dan heb je natuurlijk nog een teller nodig om steeds van 1 – 3 te tellen zodat de juiste variabele wordt ingevuld.
Deze twee declaraties beter maar helemaal in het begin van de code zetten (dus voor “void setup()”).
Regel 25-30 aanpassen om de teller op nul te zetten wanneer alle sensoren zijn gelezen;
In regels 105 en 106 wat aanspassen om de waarde op te slaan in de array;
De waarden zouden nu (ik heb dit nog niet getest) in de array temperaturen moeten staan (temperaturen[0],temperaturen[1],temperaturen[2]). En dus dan van daaruit verder werken …
Helpt dit?
hans
Dank voor je reactie!
Ik begrijp ongeveer wat je bedoelt, maar vind het nog wat fuzzy hoe ik er dan achterkom welke sensor dan welke is en of dat altijd in dezelfde volgorde gelezen wordt.
Ik las ook in je code “The DallasTemperature library can do all this work for you!” dus daar ben ik ook even in gedoken. Ik heb van één van mijn sensoren het adres achterhaald en deze hardcoded erin gezet en dan lukt het me om de temperatuur weer te geven.
Ik krijg hem dan echter niet stabiel op m’n LCD. Met m’n dummy waarden gaat dat prima, maar zodra de echte sensor erbij komt luistert setCursor niet meer, lijkt lcd.clear niet meer te werken en gaat alles scrambelen.
Dat is dus nog even een apart vraagstuk. Misschien eindigt het wel dat ik de Dallas library weer overboord zet en jouw suggestie verder op me in laat werken en ga uitwerken.
Ik zal je wel even laten weten hoe het verloopt.
Lars
Hans, het is gelukt! Mijn probleem met het printen naar de LCD zat in de connectie (ik had per abuis de Tx poort op de Mega gebruikt).
Nogmaals dan voor deze tutorial! Dat heeft me in staat gesteld om de implementatie van een DS18B20 te doorgronden en goed aan te sluiten.
Lars
Hoi Lars!
Mooi om te horen – geweldig!
hans
Waar kan ik mij inschrijven voor deze club ?
U verwijst naar “gemeenschap” onder de bruine balk. Bij mij staat die verwijzing er niet op.
Mvg
Jacques valembois
Hi Jacques,
welkom bij Tweaking4All.
De benaming “Gemeenschap” is veranderd naar “Forum” – dit omdat er verwarring was over wat en hoe.
Ik neem aan dat je het trefwoord gevonden hebt in de opmerkingen (zoals hier). Mocht je het ergens anders gezien hebben dan hoor ik dat graag zodat ik dat kan corrigeren.
Mocht je jezelf willen aanmelden dan kan dat ook door de “Log in” optie (rechts boven in de pagina, ook onder de bruine balk).
Hopelijk helpt dit.
hans
mijn vragen en commentaren lijken verdwenen.
Did I something wrong ?
jacques
Hi Jacques,
Sorry te horen dat er iets mis lijkt te gaan.
Je hebt zeker niets verkeerd gedaan … jouw commentaar staat hier boven, … of heb je meerdere opmerkingen geplaatst?
hans
ik vermoed dat ik laatst verkeerdelijk de link “druk deze link om af te melden” geactiveerd heb in plaats van “ga direct naar de commentaar”.
Probleem is wel dat er bij die toevallig verkeerde toetsdruk geen vraag naar “bevestiging voor afmelding” verscheen.
Misschien nuttig om dit te voorzien ?
Mijn technische vragen zal ik zo snel mogelijk opnieuw posten.
DANK voor uw werk !
jacques
Hoi Jacques,
oh dat klinkt inderdaad onhandig. Je bedoelt in de email die je krijgt?
Ik zal zo even kijken of ik het zo 1-2-3 kan vinden en kan verbeteren – dank je wel voor de feedback!
hans
[…] De bovenstaande code is gehaald van tweaking4all.com. […]
Hallo iedereen,
hartelijk dank voor deze duidelijke uitleg. Het is me zo ook gelukt om deze opstelling te maken. Wat me niet lukt is de temperatuursensoren aan een lange kabel te hangen. (ik had graag van in huis gezien wat de temperatuur is in mijn serre, die in de tuin achteraan staat.) Iemand een idee hoe ik zoiets oplos? de afstand is ongeveer 30 m.
bart
Hoi Bart,
mooi om te horen dat je wat had aan dit artikel
Voor wat betreft de kabel lengte; als ik me niet vergis is 1.5 meter de aanbevolen maximale lengte. Ik heb wel gebruikers gezien die met CAT-5 kabel tot 10 meter voor elkaar kregen, maar alles boven de 1.5 meter kan met problemen komen.
Voor de 30 meter die jij graag zou willen, is dat dus niet toereikend.
Hiervoor zou ik (aangezien de prijs van een Arduino Nano or een ESP8266) een kleine opstelling in de Serre plaatsen, die dan via WiFi, Bluetooth of RF de waarden doorgeeft aan de Arduino waarop jij jouw opstelling nu hebt staan. Ik denk dat ik zelf met RF zou beginnen bijvoorbeeld met dee goedkope modules (Amazon USA, Amazon Duitsland). Ik heb zelf nog niet met RF modules gespeeld, maar van wat ik gelezen heb zijn ze eenvoudiger te implementeren en goedkoper in aanschaf.
Overigens, als je dieper wil duiken in de DS18B20 en het zogenaamde “1-wire-netwerk”, dan kan dit (complexe) artikel van dienst zijn om een andere oplossing te vinden (door gebruik te maken van een master-slave opstelling).
hans
Hallo,
Bedankt voor dit leerzame artikel. Ik krijg perfecte readings van de DS18B20, zo lang ik de Uno maar via usb aan mijn Mac gekoppeld heb. Maar zodra ik het spul “live” zet in de schuur en aansluit op een externe 9V power supply dan krijg ik hele vreemde readings van -1000 graden C en dan weer +60 graden C enz. Ik las ergens dat de sensor gevoelig is voor wisselende spanningen en daarom anders gekalibreerd moet worden voor gebruik met een externe voeding.
Herkent u dit gedrag? Weet u hoe kalibreren in zijn werk gaat? Is dat iets softwarematigs of moet ik de hardware aanpassen?
Marco
Hoi Marco!
Leuk om te horen dat je het artikel leerzaam vond – dank je wel
Voor wat zich bij jouw voordoet; ik heb dit zelf niet ondervonden. Ik moet er dan wel bij zeggen dat de voeding die ik gebruik een standaard 2A 5V USB adaptertje is zoals je die voor telefoon en tablets gebruikt (om op te laden). Als ik me niet vergis zou 9V gelijkstroom geen probleem mogen zijn omdat er een spanningsregulator op de Uno dit omlaag regelt naar 5V. Maar … ik gebruik in zulke gevallen toch liever een gewone voeding met 5V en USB aansluiting. Misschien het proberen waard.
Waar ik wel rare meting zie is als de kabels te lang zijn of storing ondervinden van andere apparatuur die dicht bij de kabel liggen. Ook een punt (indien van toepassing) om mee te experimenteren.
Werkt alles wel goed als je alles los koppelt van de computer, en de opstelling (zoals je ‘m wilt gebruiken in de schuur) even ergens anders (binnen) legt en zo test?
hans
Hoi Hans,
Werkt alles wel goed als je alles los koppelt van de computer, en de
opstelling (zoals je ‘m wilt gebruiken in de schuur) even ergens anders
(binnen) legt en zo test?
Geprobeerd, en nu geeft hij ineens wél goede meetwaardes met de externe 9V voeding. De kabel van de DS18B20 (ik heb die waterdichte variant) liep in de foutsituatie over een 230V snoer heen waar een 2000W kachel op aangesloten was via een relais aan de Uno. Alles zit dicht bij elkaar. Bovendien had ik de kabel in een krul gelegd om hem korter te maken. Wellicht trad er daardoor interferentie op. Nu ik de kabel anders neergelegd heb, zijn de metingen wel redelijk accuraat. Dus het lijkt daar inderdaad iets mee te maken te hebben. Echt robuust vind ik het allemaal nog niet, maar goed, het draait nu. Maar als ik de opstelling een meter verplaats ofzo, dan houd ik mijn hart vast. De temperatuur in de schuur blijft nu wel mooi rond de 10 graden C.
Jouw tip heeft zeker geholpen om te komen waar ik nu sta, waarvoor dank
Marco
Mooi om te horen dat het e.e.a. behulpzaam was
De opstelling zou inderdaad goed moeten werken zonder aangesloten te zijn op een computer.
Interferentie zou je misschien kunnen minimaliseren door de kabels anders weg te leggen (data kabels die [deels] parallel lopen aan 220V spanning is geen goed idee), of misschien door gebruik te maken van een beter afgeschermde kabel – de DATA en VDD draden (vermoed ik) moeten waarschijnlijk het beste afgeschermd worden – of misschien door een geaarde metalen/koperen pijpje laten lopen?
hans
Prachtig artikel al veel meer duidelijk voor mij.
Wil een datalogger maken en ik heb 6 ds18b20 aangesloten geheel volgens info internet maar 1t/m 5 werken en de 6e blijft -127 aangeven.
heb er al een andere in gezet maar dat maakt niet uit.(alles doorgemeten)
Voor ik verder ga met de data-shield wil ik er eerst 6 werkend hebben.
Overigens kreeg ik de sketch niet op de chinese kloon ge-upload, keuze vd poort blijft grijs en dus niet te selecteren (werk met win 10) met een kloon vd mega 2640 werkte het wel evenals met een originele arduino.
Wat gaat er fout met de 6e sensor, wie o wie kan mij helpen hiermee
het is ook mijn eerste project dus niet veel kennis
bij voorbaat bedankt!
BEANSR
Hi Beansr!
Dank je wel voor het compliment en mooi om te horen dat het artikel bruikbaar voor je is
Ik heb zelf niet 6 sensoren, dus testen is wat lastig.
Wat initiële gedachten;
1) Heb je geprobeerd te wisselen van manier van voeding? Direct versus Parasiet mode?
Van wat ik ervaren heb is de gewone voeding (zoals in figuur 5) methode de meest betrouwbare (dus niet de parasiet opstelling).
2) Wat ook een rol kan spelen is de lengte van de draden – in een test opstelling zou ik eerst met zo kort mogelijke draden werken.
3) Je kunt overwegen 2 pinnen te gebruiken (b.v. Pin 2 en Pin 4, ieder met 3 sensors), je zult wat code moeten dupliceren en ik weet niet met zekerheid hoe goed dit zal werken. Een eerste poging; (maak eerst een backup van jouw huidige sketch voor het geval alles mis gaat)
Vervang:
door:
Vervolgens hernoem je de void loop naar void loopPin1, en vervang alle referenties naar “ds” door “ds1“.
Kopieer deze nieuwe functie en noem het nu void loopPin2, en vervang alle referenties naar “ds1” met “ds2“.
Maak nu een nieuwe void loop die er zo uit ziet:
Beetje slordig maar genoeg om te experimenteren denk ik.
Geen idee of dit goed gaat … maar hopelijk helpt het
Hans
Ik heb het uitgebreid met een stuk WiFi
Je kunt nu draadloos de temperatuur naar Domoticz sturen
https://www.evernote.com/shard/s653/nl/123826475/a1e74abc-365c-4c30-9f15-cd48ecfe68e6/
Frans eilering
Hoi Frans,
helaas, als men de link wilt bekijken dan moet men eerst inloggen of een Evernote account aanmaken.
Zou je misschien de afbeelding/tekst naar mij kunnen emailen? (webmaster at tweaking4all dot com)
Dan kan ik het hier delen met anderen.
Hans
https://www.evernote.com/l/Ao2h50q8NlxMMJ8VzUjs_mjm3FgO4us-gQQ/
frans eilering