C#: Windows 7 Sensor Development Kit
Sensörler, bilgisayarların dış dünyayı algılamasında birer duyu
organı görevi görür. Çeşitli sensörleri uygulamalarımıza entegre ederek
kullanıcı deneyimini üst noktalara taşımamız daha da mümkün olur. Örneğin, ışık
sensörü kullanarak uygulama arayüzünü dinamik olarak ortam şartlarına göre
optimize edebiliriz. Windows 7'nin
uygulama geliştirmeyi kolaylaştıran özelliklerinden biri de sensör ve konum
belirleme cihazlarına erişim için standart bir altyapı sunmasıdır. Sensor &
Location Platform ile birçok sensöre native kod tarafından ulaşılabilir. .NET
Framework geliştiricileri ise bu özelliklere Windows API Code Pack aracılığıyla
ulaşabilir.
Sensörler fiziksel cihazlar oldukları için, uygulama
geliştirirken bilgisayarımızda bu sensörlerin bulunması yada bir sensör
geliştirme kitine sahip olmamız gerekir. İlerleyen satırlarda Freescale
tarafından geliştirilen Windows 7 Sensor Development Kit'i inceleyeceğiz ve bu
kiti kullanarak ışık ve ivme verisine ulaşmayı ele alacağız.
Windows 7 Sensor Development Kit
Freescale'in ürettiği sensör geliştirme kartı ile sensör
verilerine ulaşmanın yanısıra, üzerindeki mikrodenetleyiciyi programlayarak da
çeşitli uygulamalar geliştirilebiliyor. Kartın üzerinde USB bağlantı noktası,
kızılötesi verici, 3 boyutlu analog ivme sensörü, buzzer, 3.6V li-ion batarya,
-lehimlenmemiş- SD kart yuvası, açma / kapama düğmesi, 8 adet dokunmatik buton,
5x16 LED dizisi, şarj gösterge LEDi, JTAG konnektörü ve mikrodenetleyicinin
giriş / çıkış pinlerine bağlı 60 adet pin (header bağlantı noktası) bulunuyor.

Kurulum diskindeki sürücüleri yüklediğimizde, cihazı aygıt
yöneticisinde Sensors başlığı altında görebiliyoruz.

Sensörleri kullanıma açmak için Windows denetim masasından Konum
ve Diğer Sensörler (Location and Other Sensors) paneline ulaşıp Sensor
Development Kit'in sağındaki checkbox'ı seçmemiz gerekiyor.

Bu aşamadan sonra Sensor Development Kit'imiz Windows
uygulamalarının kullanımına açılacaktır.
Uygulama Geliştirmek
.NET Framework kullanarak sensör uygulaması geliştirmek için
Windows API Code Pack'i indirmemiz gerekiyor. Son sürümünü
http://archive.msdn.microsoft.com/WindowsAPICodePack adresinden indirip,
arşiv içerisindeki
"Microsoft.WindowsAPICodePack.Sensors.dll" dosyasını daha sonra
değiştirmeyeceğiniz bir konuma kaydedin. Visual Studio'dan bir C# uygulaması
oluşturup proje referansları arasına az önce kaydettiğiniz dosyayı ekleyin.
Adım 1: Işık Sensörü (Ambient Light Sensor) Kullanımı
İlk adımda ışık sensörüne ulaşan bir uygulama geliştireceğiz.
Uygulamamız ışık sensörünün adını, durumunu, anlık değerini (lux) ve raporlama
aralığını (1/1000 sn) 4 farklı label üzerinde gösterecek.

Bir cihaz üzerinde aynı sensörden birden fazla bulunabilir. Bu
nedenle Sensor Manager'ı kullanarak sisteme bağlı istenilen tipdeki sensörleri
listeleyip, ID'leri ile bu sensörlere ulaşacağız. İstenilen sensörlerin Data
Report Changed eventlerini oluşturup ölçümledikleri değerlere örnekteki gibi
kolaylıkla ulaşabiliriz.
[C#]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsAPICodePack;
using Microsoft.WindowsAPICodePack.Sensors;
namespace Windows7SensorDevelopmentKit
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SensorList<AmbientLightSensor> ambientLightSensorList;
private void Form1_Load(object sender, EventArgs e)
{
// Ambient light sensörlerini listele:
ambientLightSensorList = SensorManager.GetSensorsByTypeId<AmbientLightSensor>();
// Listelenen ilk ambient light sensöründen veri alındığında tetiklenecek event:
ambientLightSensorList[0].DataReportChanged
+= new DataReportChangedEventHandler(ALS_DataReportChanged);
}
void ALS_DataReportChanged(Sensor sender, EventArgs e)
{
// Non-UI Thread'den gelen rapor verisine göre UI güncelleyecek delegate'i oluştur:
BeginInvoke(new MethodInvoker(delegate { UpdateALSValues(); }));
}
private void UpdateALSValues()
{
// Sensör ismi:
lblALSFriendlyName.Text = "Friendly Name: "
+ ambientLightSensorList[0].FriendlyName.ToString();
// Sensör durumu:
lblALSState.Text = "State: "
+ ambientLightSensorList[0].State.ToString();
// Sensör değeri:
lblALSIntensity.Text = "Luminous Intensity: "
+ ambientLightSensorList[0].CurrentLuminousIntensity.Intensity.ToString();
// Sensörün raporlama zaman aralığı (1/1000 saniye):
lblALSReportInterval.Text = "Report Interval: "
+ ambientLightSensorList[0].ReportInterval.ToString();
}
}
}
Uygulamayı çalıştırdığımızda saniyede 10 defa ışık sensörünün
ölçümlediği değer uygulamamızda görüntülenecek.
Adım 2: 3D İvme Sensörü (3D Accelerometer Sensor) Kullanımı
İvme sensörleri, X, Y ve Z eksenlerine uygulanan yerçekimi
değerini ölçer ve raporlar. Sensörün özelliğine ve yapılandırılmasına göre 2g,
4g, 8, yada 16g gibi ölçüm kapasitelerine sahiptirler. Her bir eksene o an
ne kadar yerçekimi uygulanıyorsa, anlık değeri de o derecede değişir. 1g
değerinin yerçekimine eşit olduğu düşünülürse, ufak bir hesaplama ile cihazın X
ve Y eksenlerinin yere paralellik durumu da elde edilebilir.

Örnek uygulamamızda, yukarıda yazdıığımız kodlara ekleme yaparak
ivme sensörünün adını, durumunu, 3 eksendeki yerçekimi değerini ve raporlama
aralığını 6 farklı label üzerinde göstereceğiz.
[C#]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsAPICodePack;
using Microsoft.WindowsAPICodePack.Sensors;
namespace Windows7SensorDevelopmentKit
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SensorList<AmbientLightSensor> ambientLightSensorList;
SensorList<Accelerometer3D> accelerometer3DSensorList;
private void Form1_Load(object sender, EventArgs e)
{
// Ambient light sensörlerini listele:
ambientLightSensorList = SensorManager.GetSensorsByTypeId<AmbientLightSensor>();
// Listelenen ilk ambient light sensöründen veri alındığında tetiklenecek event:
ambientLightSensorList[0].DataReportChanged
+= new DataReportChangedEventHandler(ALS_DataReportChanged);
// 3D Accelerometer sensörlerini listele:
accelerometer3DSensorList = SensorManager.GetSensorsByTypeId<Accelerometer3D>();
// Listelenen ilk 3D Accelerometer sensöründen veri alındığında tetiklenecek event:
accelerometer3DSensorList[0].DataReportChanged
+= new DataReportChangedEventHandler(Accel_DataReportChanged);
}
#region Ambient Light Sensor
void ALS_DataReportChanged(Sensor sender, EventArgs e)
{
// Non-UI Thread'den gelen rapor verisine göre UI güncelleyecek delegate'i oluştur:
BeginInvoke(new MethodInvoker(delegate { UpdateALSValues(); }));
}
private void UpdateALSValues()
{
// Sensör ismi:
lblALSFriendlyName.Text = "Friendly Name: "
+ ambientLightSensorList[0].FriendlyName.ToString();
// Sensör durumu:
lblALSState.Text = "State: "
+ ambientLightSensorList[0].State.ToString();
// Sensör değeri:
lblALSIntensity.Text = "Luminous Intensity: "
+ ambientLightSensorList[0].CurrentLuminousIntensity.Intensity.ToString();
// Sensörün raporlama zaman aralığı (1/1000 saniye):
lblALSReportInterval.Text = "Report Interval: "
+ ambientLightSensorList[0].ReportInterval.ToString();
}
#endregion
#region 3D Accelerometer Sensor
void Accel_DataReportChanged(Sensor sender, EventArgs e)
{
// Non-UI Thread'den gelen rapor verisine göre UI güncelleyecek delegate'i oluştur:
BeginInvoke(new MethodInvoker(delegate { UpdateAccelValues(); }));
}
private void UpdateAccelValues()
{
// Sensör ismi:
lblAccelFriendlyName.Text = "Friendly Name: "
+ accelerometer3DSensorList[0].FriendlyName.ToString();
// Sensör durumu:
lblAxisState.Text = "State: "
+ accelerometer3DSensorList[0].State.ToString();
// Sensörün X ekseni değeri:
lblAxisX.Text = "Axis X: "
+ accelerometer3DSensorList[0].CurrentAcceleration[AccelerationAxis.XAxis].ToString();
// Sensörün Y ekseni değeri:
lblAxisY.Text = "Axis Y: "
+ accelerometer3DSensorList[0].CurrentAcceleration[AccelerationAxis.YAxis].ToString();
// Sensörün Z ekseni değeri:
lblAccelZ.Text = "Axis Z: "
+ accelerometer3DSensorList[0].CurrentAcceleration[AccelerationAxis.ZAxis].ToString();
// Sensörün raporlama zaman aralığı (1/1000 saniye):
lblAccelReportInterval.Text = "Report Interval: "
+ accelerometer3DSensorList[0].ReportInterval.ToString();
}
#endregion
}
}
Uygulamanın son halini çalıştırdığımızda, X, Y ve Z eksenlerine
uygulanan yerçekimi kuvvetini göreceğiz.
Uygulama kodlarını
buradan
indirebilirsiniz.