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);
}

Tilbaketråkk: » Wattwatcher 0.2 – Nå med templogging og sms varsling
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.