DS9490R DS18S20 C# och temperatur

Generella Windowsfrågor och frågor gällande Windowsmjukvara som saknar egen forumkategori skall postas i detta forum

Moderator: elf98

Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
hilding
Inlägg: 1
Blev medlem: 09 maj 2010, 21:25
Ort: la

DS9490R DS18S20 C# och temperatur

Inlägg av hilding » 09 maj 2010, 21:39

Hej

Jag hade svårt att hitta exakt vad som behövdes för att mäta temperatur så nu när det funkar tänkte jag dela med mig.

För att det skall funka så krävs drivern från Maxim
http://www.maxim-ic.com/products/ibutto ... /index.cfm

hmmm...formateringen sket sig men men thats life

Denna klassen är skapad i C# i VS ....Det är en singelton så det är bara att anropa
float temp = Temp.Instance.Temperature;
från sin egen klass.

Kod: Markera allt

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DalSemi.OneWire.Adapter;
using DalSemi.OneWire;
using System.Windows.Forms;

namespace UnaWire
{

public class TempSensor
{
private static TempSensor instance = null;
private Timer timer = null;
private PortAdapter adapter = null;
private float temperature = float.NaN;

private TempSensor()
{
SetSensor();

timer = new Timer();
timer.Interval = 1000;
timer.Enabled = true;
timer.Tick += new System.EventHandler(Timer_Tick);

}

public void SetSensor()
{
try
{
if (adapter == null)
{
adapter = AccessProvider.GetAdapter("{DS9490}", "USB1");
InitTemperatureConversion();
}
}
catch (Exception ex)
{
string failstr = ("Failure: " + ex.Message + "\n" + ex.StackTrace + "\n" + 		((ex.InnerException != null) ? ex.InnerException.Message : ""));
adapter = null;
}

}

public float Temperature
{
get { return temperature; }
}

private void ReadTempAndInitConversion()
{
temperature = ReadTemperature();

InitTemperatureConversion();
}

private void InitTemperatureConversion()
{
if (adapter == null)
return;

try
{

adapter.BeginExclusive(true);

adapter.Reset();

//skip rom
adapter.PutByte(0xCC);

//read temp
adapter.PutByte(0x44);

adapter.EndExclusive();
}

catch (Exception ex)
{
string failstr = ("Failure: " + ex.Message + "\n" + ex.StackTrace + "\n" + 		((ex.InnerException != null) ? ex.InnerException.Message : ""));
adapter = null;
}

}

private float ReadTemperature()
{
float temp = float.NaN;

if (adapter == null)
return temp;

try
{

adapter.BeginExclusive(true);

/*we only have one temp device but
		otherwise we need the addresses
// clear any previous search restrictions
adapter.SetSearchAllDevices();
adapter.TargetAllFamilies();
adapter.Speed = OWSpeed.SPEED_REGULAR;

string str;

byte[] address = new byte[8];

if(adapter.GetFirstDevice(address, 0))
{
do // get subsequent 1-Wire device addresses
{
str = Print1WireHexAddress(address);
}
while(adapter.GetNextDevice(address, 0));
}*/

adapter.Reset();

adapter.PutByte(0xCC);

adapter.PutByte(0xBE);

byte[] data = new byte[9];

adapter.GetBlock(data, 9);

short t = (short)(data[0] | data[1] <<>

temp = 0.5f * (float)t - 0.25f + (float)(data[7] - data[6]) / (float)data[7];

adapter.EndExclusive();

}

catch (Exception ex)
{;
string failstr = ("Failure: " + ex.Message + "\n" + ex.StackTrace + "\n" + 		((ex.InnerException != null) ? ex.InnerException.Message : ""));
adapter = null;
}

return temp;
}

private void Timer_Tick(object sender, EventArgs e)
{
	 //Once per second
ReadTempAndInitConversion();
}

public static TempSensor Instance
{
get{
if(instance == null)
instance = new TempSensor();
return instance;
}
}


}



}
Senast redigerad av 1 Plutonium, redigerad totalt 9 gånger.
Anledning: La all kod i kodvisning