Scale-N

Scale-N
Arduino
Componenten
Rollend Materieel
Naslag
Onderdelen
Wissels
Basis Electronica
Symbols Electronica
Programming Arduino
AKS
DCC++
DR5000













































DS18B20 Temperatuur meten

De DS18B20 is een aardig stukje techniek dat behoorlijk wat in huis heeft. 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 …


Library: OneWire.zip

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.


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 , 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:

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.
        
Broncode:
#include 

// 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 10 (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:
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.
    

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).


ref: www.tweaking4all.nl