.NET Gadgeteer – Data Logger
Typické využití jednočipových počítačů je kontinuální sběr dat ze senzorů. V následujícím příkladu si ukážeme, jak využít SD kartu pro záznam informací ze senzoru. Tentokrát použijeme desku FEZ Spider, ale identicky, kromě inicializace SD karty, se to bude chovat i na jiných deskách, např. FEZ Panda II.
Zapojení
- FEZ Spider – řídící deska
- UsbClientDP – deska napájení
- Barometr – čidlo atmosférického tlaku a teploty
- SDCard – čtečka SD karet
- MulticolorLed – kontrolní LED, blikne červeně při chybě zápisu na SD, jinak zeleně
Schéma zapojení příkladu
Časovač
Pro periodické spouštění kódu, např. čtení dat ze senzorů, se typicky používají systémové časovače. My využijeme objekt Timer. Abychom mohli přistupovat k senzoru, musíme jako parametr state, předat odkaz na objekt barometru.
Barometr
Vývojové prostředí vám automaticky vytvoří objekt barometr, který vám zpřístupňuje informace o tlaku (hPa) a teplotě (°C). Tyto informace čtete asynchronně (metoda RequestMeasurement), proto je třeba si zaregistrovat událost MeasurementCompleteEventHandler.
Multicolor LED
Tuto část můžete klidně vynechat. Multicolor LED používáme pouze jako zpětnou vazbu, že se něco děje. V době psaní tohoto článku byla ovladači pro Multicolor LED chyba, takže je prohozena zelená a modrá barva.
Zdrojový kód
using System.Threading;
using Microsoft.SPOT;
using Gadgeteer.Modules.Seeed;
using System.IO;
using Gadgeteer.Modules.GHIElectronics;
using System;
namespace SimpleDataLogger
{
public partial class Program
{
// časovač
Timer t = null;
// soubor, kam se budou ukládat data
static string dataFilePath = @"\SD\DATA.TXT";
// doba bliknutí kontrolní diody
static TimeSpan ledTime = new TimeSpan(0, 0, 1);
// callback pro Timer
static void ReadData(object o)
{
// Požádání o data z barometru
((Barometer)o).RequestMeasurement();
}
void ProgramStarted()
{
// inicializace karty
if (sdCard.IsCardInserted && !sdCard.IsCardMounted)
{
sdCard.MountSDCard();
}
// čtení dat z barometru je asynchronní
barometer.MeasurementComplete += new Barometer.MeasurementCompleteEventHandler(barometer_MeasurementComplete);
// vytvoření časovače - callback, parametr, prodleva startu, perioda opakování
t = new Timer(new TimerCallback(ReadData), barometer, 5000, 5000);
}
void barometer_MeasurementComplete(Barometer sender, Barometer.SensorData sensorData)
{
// pomocný výpis
Debug.Print(sensorData.ToString());
// test připojení karty
if (!sdCard.IsCardMounted)
{
led.BlinkOnce(Gadgeteer.Color.Red, ledTime);
return;
}
led.BlinkOnce(Gadgeteer.Color.Green, ledTime);
// zápis na SD kartu
StreamWriter sw = new StreamWriter(File.Open(dataFilePath, FileMode.Append, FileAccess.Write));
sw.WriteLine(sensorData.Pressure + ";" + sensorData.Temperature);
sw.Flush();
sw.Close();
}
}
}
Štěpán