Hello,
i got a little problem and hope that someone here can help me.
I found this tutorial: gadgeteering.net
I liked the graph and tried to use it with my DS1820.
In my Program.cs i get the temp from my DS1820 with this code:
// Spider: EMX.Pin.IO16 = Socket #8, Pin #6
using (OneWireBus.OneWireBus oneWireBus = new OneWireBus.OneWireBus(EMX.Pin.IO16))
{
OneWireDevice[] oneWireDevices = oneWireBus.Devices;
//Debug.Print("Found " + oneWireDevices.Length + " devices");
//Debug.Print(string.Empty);
while(true){
foreach (OneWireDevice oneWireDevice in oneWireDevices)
{
//Debug.Print("Device: " + oneWireDevice.DeviceAddress);
// We only handle temperature devices
TemperatureDevice temperatureDevice = oneWireDevice as TemperatureDevice;
if (temperatureDevice == null)
{
continue;
}
Debug.Print(MeasurementsTaken+"Synchronous temperature: " + temperatureDevice.GetTemperature() + "C");
// Collect a number of measurments to have smoother data
if (MeasurementsTaken < MeasurementsToAverage)
{
//TemperatureAsyncResult temperatureAsyncResult = temperatureDevice.BeginGetTemperature();
//AverageTemperature += temperatureAsyncResult.End() * 8;
AverageTemperature += 20.00;
MeasurementsTaken++;
}
else
{
// Calculate averages of sensor data
AverageTemperature = AverageTemperature / MeasurementsTaken;
Debug.Print("Average temperature: " + AverageTemperature + "C");
// Display the altitude as text. The use of .ToString("f2") means that only two decimal
// values will be printed
altitudeText.TextContent = "Altitude: " + AverageTemperature.ToString("f2") + " meters above sea level.";
// Plot the new altitude value on the graph
altitudeGraph.Plot(AverageTemperature);
// Reset values and start a new averaging phase
AverageTemperature = 0;
MeasurementsTaken = 0;
}
//display.SimpleGraphics.Clear();
//display.SimpleGraphics.DisplayText(""+temperatureDevice.GetTemperature()*8,Resources.GetFont(Resources.FontResources.NinaB), Colors.Green, 100, 100);
//TemperatureAsyncResult temperatureAsyncResult = temperatureDevice.BeginGetTemperature();
//Debug.Print("Asynchronous temperature: " + temperatureAsyncResult.End() + "C");
//Debug.Print(string.Empty);
}
}
}
For using it with the altimeter tutorial i removed the while loop and wrote this program.cs:
using GHIElectronics.NETMF.Hardware;
using TempDS1820.OneWireBus;
using TempDS1820.OneWireBus.Devices;
using Gadgeteer.Modules.GHIElectronics;
using System;
using System.Collections;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;
using Microsoft.SPOT.Touch;
using Gadgeteer.Networking;
using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using Gadgeteering;
namespace TempDS1820
{
public partial class Program
{
GT.Timer sensorUpdateTimer;
const int MeasurementsToAverage = 3;
int MeasurementsTaken = 0;
double AverageTemperature = 0;
void ProgramStarted()
{
PrepareWindow();
sensorUpdateTimer = new GT.Timer(100); // Request a new reading every 100 millseconds
sensorUpdateTimer.Tick += new GT.Timer.TickEventHandler(sensorUpdateTimer_Tick);
sensorUpdateTimer.Start();
Debug.Print("Starting ...");
}
void sensorUpdateTimer_Tick2(GT.Timer timer)
{
AverageTemperature += 0.1;
altitudeGraph.Plot(AverageTemperature);
}
void sensorUpdateTimer_Tick(GT.Timer timer)
{
altitudeGraph.Plot(20.0);
// Spider: EMX.Pin.IO16 = Socket #8, Pin #6
using (OneWireBus.OneWireBus oneWireBus = new OneWireBus.OneWireBus(EMX.Pin.IO16))
{
OneWireDevice[] oneWireDevices = oneWireBus.Devices;
foreach (OneWireDevice oneWireDevice in oneWireDevices)
{
// We only handle temperature devices
TemperatureDevice temperatureDevice = oneWireDevice as TemperatureDevice;
if (temperatureDevice == null)
{
continue;
}
Debug.Print(MeasurementsTaken+"Synchronous temperature: " + temperatureDevice.GetTemperature() + "C");
// Collect a number of measurments to have smoother data
if (MeasurementsTaken < MeasurementsToAverage)
{
//TemperatureAsyncResult temperatureAsyncResult = temperatureDevice.BeginGetTemperature();
//AverageTemperature += temperatureAsyncResult.End() * 8;
AverageTemperature += 20.00;
MeasurementsTaken++;
}
else
{
// Calculate averages of sensor data
AverageTemperature = AverageTemperature / MeasurementsTaken;
Debug.Print("Average temperature: " + AverageTemperature + "C");
// Display the altitude as text. The use of .ToString("f2") means that only two decimal
// values will be printed
altitudeText.TextContent = "Altitude: " + AverageTemperature.ToString("f2") + " meters above sea level.";
// Plot the new altitude value on the graph
altitudeGraph.Plot(AverageTemperature);
// Reset values and start a new averaging phase
AverageTemperature = 0;
MeasurementsTaken = 0;
}
//TemperatureAsyncResult temperatureAsyncResult = temperatureDevice.BeginGetTemperature();
//Debug.Print("Asynchronous temperature: " + temperatureAsyncResult.End() + "C");
//Debug.Print(string.Empty);
}
// Test to dispose ... no effect
//oneWireBus.Dispose();
//oneWireBus.Release();
}
}
// Graphical user interface elements
Window window;
Canvas canvas;
Text altitudeText;
SimpleGraph altitudeGraph;
void PrepareWindow()
{
// Get a reference to the WPFWindow from the display
window = display.WPFWindow;
// Create a new canvas, which will be used to lay out all the
// other elements
canvas = new Canvas();
// Add the canvas as the only child of the window.
window.Child = canvas;
// Load a font from the resources.
Font defaultFont = Resources.GetFont(Resources.FontResources.NinaB);
// Crete a graph that is 200 pixels high, and 300 wide.
// The graph will be used to plot altitudes between 0 and 20 meters
// Change these values according to desired plotting range.
// The graph is also configured to plot 300 values in one screenful
// which is 5 minutes of data (with the sensor update interval at 1 second).
// After the graph is full, it will automatically start to scroll.
altitudeGraph = new SimpleGraph(200, 300, 0, 100, 300, 1, Colors.Blue);
...
altitudeGraph.Clear();
}
}
}
But i always get this Error:
[quote]3Synchronous temperature: 3.0625C
Average temperature: 20C
#### Exception System.Threading.ThreadAbortException - 0x00000000 (47) ####
#### Message:
#### System.Threading.Thread::Sleep [IP: 0000] ####
#### TempDS1820.OneWireBus.OneWireBus::AsyncTaskQueueThread [IP: 0050] ####
Eine Ausnahme (erste Chance) des Typs “System.Threading.ThreadAbortException” ist in mscorlib.dll aufgetreten.[/quote]
If i call sensorUpdateTimer_Tick2(), the graph is drawn perfectly.
I have also tried something like that:
But then i got this message:
[quote]Using mainboard GHIElectronics-FEZSpider version 1.0
#### Exception System.Threading.ThreadAbortException - 0x00000000 (3) ####
#### Message:
#### System.Threading.Thread::Sleep [IP: 0000] ####
#### TempDS1820.OneWireBus.OneWireBus::AsyncTaskQueueThread [IP: 0050] ####
Eine Ausnahme (erste Chance) des Typs “System.Threading.ThreadAbortException” ist in mscorlib.dll aufgetreten.
Der Thread ‘’ (0x3) hat mit Code 0 (0x0) geendet.
Starting …
#### Exception System.ObjectDisposedException - CLR_E_OBJECT_DISPOSED (1) ####
#### Message:
#### GHIElectronics.NETMF.Hardware.OneWire::Reset [IP: 0000] ####
#### TempDS1820.OneWireBus.OneWireBus::Reset [IP: 0008] ####
#### TempDS1820.OneWireBus.Devices.OneWireDevice::Select [IP: 0008] ####
#### TempDS1820.OneWireBus.Devices.DS18B20::GetTemperature [IP: 0015] ####
#### TempDS1820.Program::sensorUpdateTimer_Tick [IP: 0058] ####
#### Gadgeteer.Timer::dt_Tick [IP: 0018] ####
#### Microsoft.SPOT.DispatcherTimer::FireTick [IP: 0010] ####
#### Microsoft.SPOT.Dispatcher::PushFrameImpl [IP: 004a] ####
#### Microsoft.SPOT.Dispatcher::PushFrame [IP: 001d] ####
#### Microsoft.SPOT.Dispatcher::Run [IP: 0006] ####
#### Gadgeteer.Program::Run [IP: 001c] ####
#### TempDS1820.Program::Main [IP: 001a] ####
Eine Ausnahme (erste Chance) des Typs “System.ObjectDisposedException” ist in GHIElectronics.NETMF.Hardware.dll aufgetreten.
In System.ObjectDisposedException ist eine Ausnahme vom Typ “GHIElectronics.NETMF.Hardware.dll” aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.
[/quote]
Maybe someone can help me to fix it
King Regards
Yuri