Windows Phone Sensör Ve Servislerin Yararları Nelerdir?
Accelerometer (ivme ölçer); cihazınızın X, Y, Z koordinatlarındaki bilgisini ve hareketin o anki hızını alır. Cihaza hangi yönden ivme verirseniz, o kısmın hızı ölçülür. Bu yazımızda telefonlar için çok önemli olan sensörlerden ivme ölçeri inceleyeceğiz. Ayrıntılar yazımızda...
10.10.2014 tarihli yazı 9941 kez okunmuştur.
Windows Phone Sensör Ve Servislerin Yararları Nelerdir?
Windows Phone üzerinde bir çok fiziksel sensör bulunmaktadır ve bu sensörler sayesinde uygulamalarımızın daha fonksiyonel olmasını sağlayabiliyoruz. Windows Phone geliştiricileri de bu sensörlerden gelen verileri okuyabilmek için API’ler sunmaktadır. Kullandığımız bütün sensörler SensorBase<TSensorReading>[1] sınıfından türemektedir. Bu sensör API’lerinin neler olduğunu, SensorBase sınıfımızın elemanlarını örneklerle birlikte irdelemeye başlayalım.
· SensorBase sınıfı
· Accelerometer (ivme ölçer)
· Compass (pusula)
· Gyroscope (jiroskop)
· Motion (hareket)
► İlginizi Çekebilir: Silverlight Nedir?
Accelerometer(İvme Ölçer)
Accelerometer sensörü geliştiricilere cihazın X, Y ve Z eksenindeki durumunu vermektedir. Cihazımızın tam ortası başlangıç noktası (0,0,0) olmaktadır. Soldaki resmi incelediğimizde hangi yönün hangi eksen olduğunu daha rahat anlayabilirsiniz.
Örneğin; cihazınız dikey pozisyondayken X koordinatından yukarı doğru ivme kazandırırsak, X koordinatı negatif değer alacaktır ki, cihazın üzerinde bir top olduğunu hayal edersek, top hangi koordinata ivme kazandırılıyorsa, aksi yönde hareket edecektir.
Application bar içerisinde bulunan On/Off düğmesiyle Accelerometer özelliğini açıp kapatılabilir. On/Off düğmesinin bağlı olduğu ApplicationBarIconButton_Click event handler'ı içerisinde bu işlemin nasıl gerçekleştirildiğini görebilirsiniz.
On/Off düğmesini kullanarak Accelerometer'ı aktifleştirdiğimizde, ivmede değişiklik olma anında tetiklenecek accelerometer_CurrentValueChanged aksiyonunu da hazırlamış oluyoruz.
Kullanıcıya geri bildirimde bulunacak kısım ise timer_Tick event'idir. Bu event sayfanın çalışma anında (Constructor içinde tanımlaması yapılmıştır) Timer nesnesi ile devreye alınır. Belli periyotlarda (tanımlandığı yerde 30 milisaniye olarak belirtilmiştir.) Accelerometer'dan aldığı bilgiyi ekrana yazdırır.
Bir örnekle bunu gösterelim. Yeni bir Windows Phone projesi açın ve aşağıda verilen kodları uygun yerlere yerleştirin.
Uygulamada bir Timer (Zamanlayıcı) kontrolü ile, sürekli olarak Compass (pusula) sensöründen gelen yön bilgisi alınır.
Örneğin; cihazınız dikey pozisyondayken X koordinatından yukarı doğru ivme kazandırırsak, X koordinatı negatif değer alacaktır ki, cihazın üzerinde bir top olduğunu hayal edersek, top hangi koordinata ivme kazandırılıyorsa, aksi yönde hareket edecektir.
Application bar içerisinde bulunan On/Off düğmesiyle Accelerometer özelliğini açıp kapatılabilir. On/Off düğmesinin bağlı olduğu ApplicationBarIconButton_Click event handler'ı içerisinde bu işlemin nasıl gerçekleştirildiğini görebilirsiniz.
On/Off düğmesini kullanarak Accelerometer'ı aktifleştirdiğimizde, ivmede değişiklik olma anında tetiklenecek accelerometer_CurrentValueChanged aksiyonunu da hazırlamış oluyoruz.
Kullanıcıya geri bildirimde bulunacak kısım ise timer_Tick event'idir. Bu event sayfanın çalışma anında (Constructor içinde tanımlaması yapılmıştır) Timer nesnesi ile devreye alınır. Belli periyotlarda (tanımlandığı yerde 30 milisaniye olarak belirtilmiştir.) Accelerometer'dan aldığı bilgiyi ekrana yazdırır.
Bir örnekle bunu gösterelim. Yeni bir Windows Phone projesi açın ve aşağıda verilen kodları uygun yerlere yerleştirin.
Uygulamada bir Timer (Zamanlayıcı) kontrolü ile, sürekli olarak Compass (pusula) sensöründen gelen yön bilgisi alınır.
► İlginizi Çekebilir: Expression Blend Nedir?
► Şekil 1: Accelerometer Örneği
C# örneği
using System;
using Microsoft.Phone.Controls;
using Microsoft.Devices.Sensors;
using System.Windows.Threading;
namespace sdkRawSensorDataCS
{
public partial class AccelerometerPage : PhoneApplicationPage
{
Accelerometer accelerometer;
DispatcherTimer timer;
Microsoft.Xna.Framework.Vector3 acceleration;
bool isDataValid;
public AccelerometerPage()
{
InitializeComponent();
if (!Accelerometer.IsSupported)
{
// Öncelikle cihazımız accelerometer destekliyor mu bunu kontrol ediyoruz.
statusTextBlock.Text = "desteklenmiyor";
ApplicationBar.IsVisible = false;
}
else
{
// destekliyorsa bir timer oluşturuyoruz.
timer = newDispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(30);
timer.Tick += newEventHandler(timer_Tick);
}
}
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
if (accelerometer != null&& accelerometer.IsDataValid)
{
// Durdurmak için bastığımız düğme eğer accelerometer doluysa ve üzerindeki veri onaylanırsa accelerometer'ı durduruyor.
accelerometer.Stop();
timer.Stop();
statusTextBlock.Text = "accelerometer durduruldu.";
}
else
{
if (accelerometer == null)
{
// accelerometer boş ise önce instance alıyoruz
accelerometer = newAccelerometer();
// 20 milisaniyede update olacağını söylüyoruz
accelerometer.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20);
// biz istediğimiz değeri atasak da accelerometer bunu desteklemiyor olabilir, bu durumda accelerometer en yakın süreyi üzerine alacaktır. Biz de gerçek zaman aralığını bir textblock'a yazdırıyoruz
timeBetweenUpdatesTextBlock.Text = accelerometer.TimeBetweenUpdates.TotalMilliseconds + " ms";
//değer değiştikçe çalışacak event'i belirtiyoruz.
accelerometer.CurrentValueChanged += newEventHandler<SensorReadingEventArgs<AccelerometerReading>>(accelerometer_CurrentValueChanged);
}
try
{
//accelerometer ı başlatıyoruz ve aynı zamanda timer'ı da çalıştırıyoruz.
statusTextBlock.Text = "Accelerometer başlatıldı";
accelerometer.Start();
timer.Start();
}
catch (InvalidOperationException ex)
{
statusTextBlock.Text = "hata oluştu, ne yazık ki accelerometer başlayamadı. Hata:" + ex.Message;
}
}
}
void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
{
//sensör datalarının doğruluğu onaylanıyor. Normal koşullarda burada bir sıkıntı olmasa da yine de okuma anında bir sıkıntı olursa isdatavalid false dönmektedir.
isDataValid = accelerometer.IsDataValid;
//acceleration üzerinde çizim yapacağımız vektör nesnesi
acceleration = e.SensorReading.Acceleration;
}
void timer_Tick(object sender, EventArgs e)
{
if (isDataValid)
{
statusTextBlock.Text = "accelerometer çalışıyor.";
// textblocklara accelerator den gelen bilgi yazılıyor
xTextBlock.Text = "X: " + acceleration.X.ToString("0.00");
yTextBlock.Text = "Y: " + acceleration.Y.ToString("0.00");
zTextBlock.Text = "Z: " + acceleration.Z.ToString("0.00");
// Line nesnesi ile gelen uzaklığı ekrana bastırıyoruz.
xLine.X2 = xLine.X1 + acceleration.X * 100;
yLine.Y2 = yLine.Y1 - acceleration.Y * 100;
zLine.X2 = zLine.X1 - acceleration.Z * 50;
zLine.Y2 = zLine.Y1 + acceleration.Z * 50;
}
}
}
Tabi bu kadar kodu gördüğümüzde korkabilirsiniz, Windows Phone geliştiricileri bunu düşünerek kendi mağazalarında ivme ölçer sensörünü yapmışlar oradan Windows Phone’ muza kurup rahatça ölçümler yapabiliriz.
using Microsoft.Phone.Controls;
using Microsoft.Devices.Sensors;
using System.Windows.Threading;
namespace sdkRawSensorDataCS
{
public partial class AccelerometerPage : PhoneApplicationPage
{
Accelerometer accelerometer;
DispatcherTimer timer;
Microsoft.Xna.Framework.Vector3 acceleration;
bool isDataValid;
public AccelerometerPage()
{
InitializeComponent();
if (!Accelerometer.IsSupported)
{
// Öncelikle cihazımız accelerometer destekliyor mu bunu kontrol ediyoruz.
statusTextBlock.Text = "desteklenmiyor";
ApplicationBar.IsVisible = false;
}
else
{
// destekliyorsa bir timer oluşturuyoruz.
timer = newDispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(30);
timer.Tick += newEventHandler(timer_Tick);
}
}
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
if (accelerometer != null&& accelerometer.IsDataValid)
{
// Durdurmak için bastığımız düğme eğer accelerometer doluysa ve üzerindeki veri onaylanırsa accelerometer'ı durduruyor.
accelerometer.Stop();
timer.Stop();
statusTextBlock.Text = "accelerometer durduruldu.";
}
else
{
if (accelerometer == null)
{
// accelerometer boş ise önce instance alıyoruz
accelerometer = newAccelerometer();
// 20 milisaniyede update olacağını söylüyoruz
accelerometer.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20);
// biz istediğimiz değeri atasak da accelerometer bunu desteklemiyor olabilir, bu durumda accelerometer en yakın süreyi üzerine alacaktır. Biz de gerçek zaman aralığını bir textblock'a yazdırıyoruz
timeBetweenUpdatesTextBlock.Text = accelerometer.TimeBetweenUpdates.TotalMilliseconds + " ms";
//değer değiştikçe çalışacak event'i belirtiyoruz.
accelerometer.CurrentValueChanged += newEventHandler<SensorReadingEventArgs<AccelerometerReading>>(accelerometer_CurrentValueChanged);
}
try
{
//accelerometer ı başlatıyoruz ve aynı zamanda timer'ı da çalıştırıyoruz.
statusTextBlock.Text = "Accelerometer başlatıldı";
accelerometer.Start();
timer.Start();
}
catch (InvalidOperationException ex)
{
statusTextBlock.Text = "hata oluştu, ne yazık ki accelerometer başlayamadı. Hata:" + ex.Message;
}
}
}
void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
{
//sensör datalarının doğruluğu onaylanıyor. Normal koşullarda burada bir sıkıntı olmasa da yine de okuma anında bir sıkıntı olursa isdatavalid false dönmektedir.
isDataValid = accelerometer.IsDataValid;
//acceleration üzerinde çizim yapacağımız vektör nesnesi
acceleration = e.SensorReading.Acceleration;
}
void timer_Tick(object sender, EventArgs e)
{
if (isDataValid)
{
statusTextBlock.Text = "accelerometer çalışıyor.";
// textblocklara accelerator den gelen bilgi yazılıyor
xTextBlock.Text = "X: " + acceleration.X.ToString("0.00");
yTextBlock.Text = "Y: " + acceleration.Y.ToString("0.00");
zTextBlock.Text = "Z: " + acceleration.Z.ToString("0.00");
// Line nesnesi ile gelen uzaklığı ekrana bastırıyoruz.
xLine.X2 = xLine.X1 + acceleration.X * 100;
yLine.Y2 = yLine.Y1 - acceleration.Y * 100;
zLine.X2 = zLine.X1 - acceleration.Z * 50;
zLine.Y2 = zLine.Y1 + acceleration.Z * 50;
}
}
}
Tabi bu kadar kodu gördüğümüzde korkabilirsiniz, Windows Phone geliştiricileri bunu düşünerek kendi mağazalarında ivme ölçer sensörünü yapmışlar oradan Windows Phone’ muza kurup rahatça ölçümler yapabiliriz.
Kaynak:
► İstanbul Kemerburgaz Üniversitesi Elektrik Elektronik Mühendisliği Bölümü
YORUMLAR
Aktif etkinlik bulunmamaktadır.
- Dünyanın En Görkemli 10 Güneş Tarlası
- Dünyanın En Büyük 10 Makinesi
- 2020’nin En İyi 10 Kişisel Robotu
- Programlamaya Erken Yaşta Başlayan 7 Ünlü Bilgisayar Programcısı
- Üretimin Geleceğinde Etkili Olacak 10 Beceri
- Olağan Üstü Tasarıma Sahip 5 Köprü
- Dünyanın En İyi Bilim ve Teknoloji Müzeleri
- En İyi 5 Tıbbi Robot
- Dünyanın En Zengin 10 Mühendisi
- Üretim için 6 Fabrikasyon İşlemi
- DrivePro Yaşam Döngüsü Hizmetleri
- Batarya Testinin Temelleri
- Enerji Yönetiminde Ölçümün Rolü: Verimliliğe Giden Yol
- HVAC Sistemlerinde Kullanılan EC Fan, Sürücü ve EC+ Fan Teknolojisi
- Su İşleme, Dağıtım ve Atık Su Yönetim Tesislerinde Sürücü Kullanımı
- Röle ve Trafo Merkezi Testlerinin Temelleri | Webinar
- Chint Elektrik Temel DIN Ray Ürünleri Tanıtımı
- Sigma Termik Manyetik Şalterler ile Elektrik Devrelerinde Koruma
- Elektrik Panoları ve Üretim Teknikleri
- Teknik Servis | Megger Türkiye
ANKET