DS18B20 tempsensor og Arduino

For å enkelt kunne snakke med 1wire enheter fra en Arduino finnes det library (OneWire.h) for dette, det finnes her  http://www.arduino.cc/playground/Learning/OneWire Men denne er veldig generell mot 1wire, og ikke tilpasset tempsensorene noe særlig.

Jeg bruker DS18B20 sensorene,  og de krever en del kode for initieres, og for så å lese av verdiene.

For å lese ut temperaturen med OneWire.h biblioteket vil koden se slik ut:

#include 

// DS18S20 Temperature chip i/o
OneWire ds(5);  // on pin 10
byte inne[8] = { 0x28,0x2A,0xDE,0x5E,0x02,0x00,0x00,0x19 };
void setup(void) {
  // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
}

void loop(void) {

  readTemp(inne);
}

void readTemp(byte* addr){

  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i;
  byte data[12];

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n");
      //Sendmail CRC
      return;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  delay(1000);     // maybe 750ms is enough, maybe not

  ds.reset();
  ds.select(addr);
  ds.write(0xBE);         // Read Scratchpad
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8 ) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if (Fract < 10)
  {
     Serial.print("0");
  }
  Serial.println(Fract);

}

Altså veldig mye kode, samtidig som temperaturen blir gitt i form av to variabler, et heltall, og så desimalene for seg selv.

Men etter litt leting fant jeg et library som var egnet for tempsensorene. Det ligger også tilgjengelig på arduino.cc, men litt gjemt: DallasTemperature.h Legger ved dette biblioteket her, slik at det er tilgjenglig. Siste versjon kan til enhver tid hentes fra http://www.milesburton.com.

Et eksempel for å lese ut temp ved hjelp av DallasTemperature.h:

#include
#include
#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress innetemp = { 0x28, 0xF0, 0x12, 0x5F, 0x02, 0x0 , 0x0, 0x9E };
void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(innetemp, 12);
}

float printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.println(tempC);
  return tempC;
}

void loop(void)
{
sensors.requestTemperatures(); // Send the command to get temperatures
float inne = printTemperature(innetemp); // Use a simple function to print out the data
Serial.print("INNE TEMP:");
Serial.println(inne);

}
3 replies
  1. Lasse
    Lasse says:

    Flott! har slitt litt med oversikten på den øverste koden selv, og DallasTemperature gjør det _litt_ enklere.
    Blir nok å kode om litt hjemme da på klokke-termometeret mitt.

  2. Espen
    Espen says:

    Lasse :

    Flott! har slitt litt med oversikten på den øverste koden selv, og DallasTemperature gjør det _litt_ enklere.
    Blir nok å kode om litt hjemme da på klokke-termometeret mitt.

    Liv i deg også?
    Har leket litt med HomeSeer i påsken, fått inn alle temperaturer og strømforbruket inn på den. Kan da kjøre scripts/events utifra temperaturer osv.. Morro for unga.

Trackbacks & Pingbacks

  1. […] Les mer om 1Wire Templogging med Arduino […]

Legg igjen et svar

Want to join the discussion?
Feel free to contribute!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *