Dallas DS18B20 en Arduino

Digitale sensoren voor de tempertuur. Dat is natuurlijk ideaal. Deze zijn al gekalibreerd en hoeven alleen maar te worden aangesloten. Hier volgt een aansluitschema, libraries en een sketch die je zou kunnen gebruiken (en uiteraard kunt aanpassen) voor je eigen doeleinden

Gezien het feit dat ik 3 sensoren heb (zie ook de video), wilde ik er vandaag twee in gebruik gaan nemen. Hiervoor moest ik weer een schemaatje maken, maar na wat gezoek op internet heb ik deze gevonden.

Ik heb twee sensoren parasitair geschakeld.  Alles loopt via 1 draad en er wordt geen +5V gevraagd.

Er wordt in deze sketch gebruik gemaakt van digital input 3, maar je bent uiteraard vrij om dit zelf aan te passen. Zoek daarvoor de volgende regel op:
#define ONE_WIRE_BUS 3                             // Data wire is plugged into digital pin 3 on the Arduino

en vervang de 3 (in het eerste deel achter …_BUS) door het nummer van je eigen gekozen digitale ingang

Schema Dallas DS18B20 parasitaire mode
Schema Dallas DS18B20 parasitaire mode

Hierdoor kunnen er veel sensoren op 1 draad worden aangesloten. Nu weet ik niet hoe het gaat als je boven de 10 sensoren gaat. Ik heb er namelijk niet zoveel om te kunnen testen. Het is maar om de temperatuur op het dak en in het zwembad te testen 😉 .

De gegevens zien er via de onderstaande sketch als volgt uit;

 

Output Dallas DS18B20 temperature sensors
Output Dallas DS18B20 temperature sensors

 

Om dit aan de praat te krijgen zijn er twee verschillende libraries nodig. Deze kun je hieronder vinden en uitpakken in de map C:\Program Files (x86)\Arduino\libraries of waar de Arduino-library map dan ook staat.

Dallas Temperature library Arduino

one Wire library Arduino

Deze zijn dus beide nodig om de onderstaande sketch te kunnen draaien±

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

#define ONE_WIRE_BUS 3                             // Data wire is plugged into digital pin 3 on the Arduino
#define NumberOfDevices 2                          // Set maximum number of devices in order to dimension
// Array holding all Device Address arrays.

OneWire oneWire(ONE_WIRE_BUS);                     // Setup a oneWire instance to communicate with any OneWire devices

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

byte allAddress [NumberOfDevices][8];              // Device Addresses are 8-element byte arrays.
// we need one for each of our DS18B20 sensors.

byte totalDevices;                                 // Declare variable to store number of One Wire devices
// that are actually discovered.
void setup() {
Serial.begin(9600);
sensors.begin();
totalDevices = discoverOneWireDevices();         // get addresses of our one wire devices into allAddress array
for (byte i=0; i < totalDevices; i++)
sensors.setResolution(allAddress[i], 10);      // and set the a to d conversion resolution of each.
}

byte discoverOneWireDevices() {
byte j=0;                                        // search for one wire devices and
// copy to device address arrays.
while ((j < NumberOfDevices) && (oneWire.search(allAddress[j]))) {
j++;
}
for (byte i=0; i < j; i++) {
Serial.print(“Device “);
Serial.print(i);
Serial.print(“: “);
printAddress(allAddress[i]);                  // print address from each device address arry.
}
Serial.print(“\r\n”);
return j                      ;                 // return total number of devices found.
}

void printAddress(DeviceAddress addr) {
byte i;
for( i=0; i < 8; i++) {                         // prefix the printout with 0x
Serial.print(“0x”);
if (addr[i] < 16) {
Serial.print(‘0’);                        // add a leading ‘0’ if required.
}
Serial.print(addr[i], HEX);                 // print the actual value in HEX
if (i < 7) {
Serial.print(“, “);
}
}
Serial.print(“\r\n”);
}

void printTemperature(DeviceAddress addr) {
float tempC = sensors.getTempC(addr);           // read the device at addr.
if (tempC == -127.00) {
Serial.print(“Error getting temperature”);
} else {
Serial.print(tempC);                          // and print its value.
Serial.print(” C (“);
Serial.print(DallasTemperature::toFahrenheit(tempC));
Serial.print(” F)”);
}
}

void loop() {
delay(4000);
sensors.requestTemperatures();                // Initiate  temperature request to all devices
for (byte i=0; i < totalDevices; i++) {
Serial.print(“Device “);
Serial.print(i);
Serial.print(“: “);
printTemperature(allAddress[i]);
Serial.print(“\n\r”);
}
Serial.print(“\n\r\n\r”);
}

Deze code werkt goed. Nu moet ik helaas (kan uiteraard niet anders :-)) dit alles weer ombouwen naar mijn eigen arduino-project. Maar dat zal vast wel komen…

In elk geval geniet ik nu van het feit dat ik nu twee juiste registraties van de temperatuur heb 🙂

 


 

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.