Sıcaklık/Nem Kontrol ve Uyarı Sistemi – 2

Kategori: Arduino, C#, Güvenlik, Referanslar
Tarih: 13th Mart 2015

Bu yazıda artık ortamın sıcaklık ve nem değerlerini ölçüp bilgisayarımıza aktaracak olan devreyi tasarlamaya geçebiliriz. Burada devreyi bağımsız iki parça halinde ele alabiliriz. Birinci parça sıcaklık sensöründen verinin okunması. İkinci parça okunan değerin 7 segmentli göstergede gösterilmesi.

Önce sıcaklık sensörü kısmını halledelim. Biz burada DHT11 sıcaklık ve nem sensörünü kullanacağız. İsteyen buradan sensörü detaylı inceleyebilir. Sensörü devremize aşağıdaki gibi bağlıyoruz.

dht11_arduio_baglanti_semasi

 

Şimdi ikinci kısma geçelim. Bu kısım biraz daha karışık. Önce 7 segmentli göstergeden başlayalım. Aşağıda elemanın yapısı eklenmiştir.

 

ortak-katot-display-baglanti-semasi

 

İncelenince görülecektir ki 7 segmentli gösterge için 1 gönderiyim 1 yazsın 3 gönderiyim 3 yazsın gibi bir yapı yok. Birbirinden bağımsız 7 tane led var. Mesela 1 yazmak için GND bağlantılarını yaptıktan sonra, 6. ve 4. bacaktan 5V vermelisiniz. Her sayı için bu ayrı ayrı hesaplanıp yazılım tarafında bir fonksiyon ile çözülebilir. Ama bu şekilde Arduino tarafında 7 pin meşgul edecektir. İki tane digit bağlarsak 14 pin. Bu çok saçma bir kullanım olur. Ne yapalım. İlk akla gelen bir lojik devre tasarlayıp binary gelen sayıyı 7 segmentli göstergede yazdırmak. Bu şekilde 4 pin kullanarak tüm rakamları yazdırırız. (Örneğin pinlerden 0011 verildiğinde göstergede 3 yazdırmak) Bunun için bir devre tasarlamamıza gerek yok zaten bu işi yapan bir entegre var. 4511 entegresi. Bu entegre 4 pin ile binary gelen değeri 7 segmentli göstergede yazdırmak için tasarlanmış. Buradan datasheeti inceleyebilirsiniz. Bacak bağlantıları ve açıklama tablosu aşağıda.

 

4511

pin isim

bağlantıları

1 B girişi B girişi
2 girişi C C girişi
3 lamba test girişi Lojik-1
4 ripple girişi Lojik-1
5 aktif etme girişi Lojik-0
6 girişi D D girişi
7 A girişi A girişi
8 VSS 0 V güç kaynağı 0 V
9 segment e 7-segment ortak katot ekran, e
10 segment d 7-segment ortak katot ekran, d
11 segment c 7-segment ortak katot ekran, c
12 segment b 7-segment ortak katot ekran, b
13 segment a 7-segment ortak katot ekran, a
14 segmenti g 7-segment ortak katot ekran, g
15 segment f 7-segment ortak katot ekran, f
16 VDD + V güç kaynağı +9 V (aralık 5-15 V)

 

Aşağıdaki örnek bir bağlantı görülebilir.

 

4511-proteus

 

Bu şekilde sadece 4 pini kullanarak tüm rakamları gösterebiliyoruz. Hala bir sorun var. Sıcaklık değeri göstereceğimiz için iki rakama ihtiyacımız var. İki göstergeyi iki ayrı entegre ile tasarlayıp toplam 8 pin kullanarak bunu yapabiliriz. Ama bu çok hızlı olan donanımımızı çok hantalca kullanmak olur. Bunun yerine bilgisayarların mükemmel hızlı olmasını kullanarak maliyeti düşürebiliriz. Tek entegrenin çıkışılarını iki göstergeye birden versek. Sonra bu göstergelerden ilkini bir kaç mili saniye, ardından diğerini bir kaç milisaniye yakıp söndürsek. Ve yanma anlarında da entegreye ilgili rakamları göndersek aynı entegreyi kullanarak iki ayrı rakamı gösterebilmiş oluruz. Göstergeleri yakıp söndürme işlemleri içinde GND bacağını kullanırız. Bir katot göstergede GND bacağından 5V verir isek gösterge söner, toprak verirsek gönderdiğimiz rakam yanar.

 

Herşey tamam artık devreyi tasarlayıp uygulamamızı yazabiliriz. Sıcaklık sensörünü bağlamıştık. Şimdi entegreyi ve digitleri bağlayalım.

 

 

Scanned-image-0

Scanned-image-1-0

 

Devreyi resimdeki gibi oluşturalım. Karmaşık görüntüyü engellemek için 4511 entegresinden diğitlere giden kablolar çizilmemiştir; harflendirilmiştir. Artık programımızı yazıp arduino’ya yükleyebiliriz. Program kodları aşağıdaki gibidir. Bu uygulama  bir yandan, sensörden okuduğu sıcaklık değerini digitlere yazdırır. Diğer yandan da bağlı bulunduğu bilgisayarın seri portunu dinler. Eğer seri porttan “a”, “b”, yada “c” verisi gelirse yine seri porttan sırsaıyla sıcaklık, nem ve çiğ oluşturma verisini yazar. Bu konu ile ilgili ayarlamaları serialEvent() fonksiyonundan görebilirsiniz.

Bu serinin bir sonraki yazısında bir wcf servis yazacağız. Bu servis gelen isteklere göre sıcaklık nem ve çiğ oluşma noktası verisini seri port aracılığıyla arduino devremizden okuyup istemciye iletecek. Bu şekilde oda sıcaklık vs bilgilerini hem digitler ile odada gösterip hemde masaüstü uygulama, android cihaz vs. gibi farklı platformlara servis edebiliyor olacağız.

 


#include <SimpleTimer.h>
#include <dht11.h> 

dht11 SicaklikSensoru;
SimpleTimer timer;

int pinOtele = 10;
int digitEntegreIzinPin = 9;
int digitBirIzinPin = 8;
int digitSifirIzinPin = 7;
int ZamanKesmesiSuresi = 20000;

float sicaklik = 0, nem = 0, cig = 0;

void digiteYaz(int rakam)
{
 if(rakam < 0 || rakam > 9) return;

 int deger, cikis;

 for(int i = 3; i >= 0; i--)
 {
 deger = pow(2, i) + (i > 1 ? 1 : 0); 

 digitalWrite(i + pinOtele, deger > rakam ? LOW : HIGH);

 rakam -= deger > rakam ? 0 : deger;
 }

 digitalWrite(digitEntegreIzinPin, HIGH);
}

void digitSec(int d)
{
 boolean kontrol;
 if(d == 0)
 kontrol = false;
 else if(d == 1)
 kontrol = true;

 digitalWrite(digitBirIzinPin, !kontrol);
 digitalWrite(digitSifirIzinPin, kontrol);
}

void digitlereYaz(int sayi)
{
 if(sayi < 0 || sayi > 99)
 return;

 int bekleme = 5;

 digitSec(0);
 digiteYaz((sayi > 9 ? sayi % 10 : sayi));
 delay(bekleme);
 digitalWrite(digitEntegreIzinPin, LOW);
 delay(bekleme);

 digitSec(1);
 digiteYaz((sayi > 9 ? sayi/ 10 : 0));
 delay(bekleme);
 digitalWrite(digitEntegreIzinPin, LOW);
 delay(bekleme);
}

void timerInterrupt()
{
 SicaklikSensoru.read(2);

 sicaklik = (float)SicaklikSensoru.temperature;
 nem = (float)SicaklikSensoru.humidity;
 cig = (float)SicaklikSensoru.dewPoint();
}

void serialEvent()
{
 char istek = (char)Serial.read();

 if(SicaklikSensoru.read(2) != 0)
 {
 Serial.print("Hata: 1|Sensor Okunamadı");
 return;
 }

 switch(istek)
 {
 case 'a':
 sicaklik = (float)SicaklikSensoru.temperature;
 Serial.println(sicaklik, 2);
 break; 

 case 'b':
 nem = (float)SicaklikSensoru.humidity;
 Serial.println(nem, 2);
 break; 

 case 'c':
 cig = (float)SicaklikSensoru.dewPoint();
 Serial.println(cig, 2);
 break; 

 default:
 Serial.println("Hata: 2|Gecersiz Istek");
 }
}

void setup()
{
 Serial.begin(9600);

 //Pinler Aktif
 for(int i = 0; i <= 3; i++)
 pinMode(i + pinOtele, OUTPUT);

 //Digitler Aç/Kapat
 pinMode(digitEntegreIzinPin, OUTPUT);
 pinMode(digitBirIzinPin, OUTPUT);
 pinMode(digitSifirIzinPin, OUTPUT);

 timerInterrupt();
 timer.setInterval(ZamanKesmesiSuresi, timerInterrupt);
}

void loop()
{
 digitlereYaz((int)sicaklik); 

 timer.run();
}

Yorumlar: 0 »

Sıcaklık/Nem Kontrol ve Uyarı Sistemi – 1

Kategori: Arduino, C#, Güvenlik, Referanslar
Tarih: 15th Aralık 2014

Yazmaya uzun bi süre ara verdikten sonra ancak bugün birşeyler yazmaya fırsat bulabildim. Bu yazıda bir sıcaklık/nem kontrol devresi ve sıcaklığın farklı platformlara sunulabilmesi hakkında planlamalar yapcağız. İhtiyacımız sıcaklığı farklı sebeplerden dolayı sık sık yükselen server odasını kontrol altında tutmak. Öngörülemeyen bi sıcaklık artışı olduğunda da ilgili personele bilgi verilmesi.

 

Sıcaklık kontrol devresi için ilk başlarda 16F877A mikrodenetleyici ve uyumlu bir sıcaklık sensörü kullanmayı planlamıştım. Ama biraz araştırma yaptıktan sonra Arduino diye birşey gördüm. Bu mikrodenetleyici dünyası için bir framework diye düşünülebilir. Açık kaynak, İtalyan menşeli bir proje. Açık kaynak olduğundan dolayı piyasada çok farklı kombinasyonlarda hatta çin üretimi ürünler bile mevcut. Peki tam nedir bu Arduino. Bu, üzerinde bir mikrodenetleyicisi olan, özel tasarım bir kart. Bu kart sayesinde bir çok özel yazılmış fonksiyonu bu microdenetleyici üzerinde çalıştırabiliyor, kart üzerindeki portları kullanarak da microdenetleyici ile çok rahat bir şekilde iletişim kurabiliyor hatta bir bilgisayar ile seri port iletişimine geçebiliyorsunuz. Buda sizi hem devre kurma çabasından kurtarırken hem de projelerini daha hızlı kodlayabilme imkanı sunuyor. Dezavantajı yok mu? Var tabiki. Mikrodenetleyici üzerinde halihazırda çalışan bir framework olduğundan dolayı bu donanımı 100% verimle kullanamıyorsunuz. Biraz daha yavaş kalıyor. Bu durum C/C++ ve C# dillerinin kıyaslanması gibi düşünülebilir. Daha yavaş olduğu için -bazı özel projeler hariç- C# dan vazgeçmezsiniz herhalde.

 

Arduino’ ya uyumlu bir sensör ile (DHT11) sıcaklığı ve nemi okuyup, 7 segmentli digitler kullanarak yazdırmayı planlıyorum. Ayrıca okunan değerleri seri port üzreinden server odasındaki bir bilgisayarada ileteceğim. İş buradan sonra sizin planınıza kalmış. Ben bütün platformlardan bu bilgiye erişmek istediğim için; bu sunucu üzerinden bilgileri servis edeceğim. Devam eden yazılarımda tarasımları ve kodları paylaşarak bunu bir seri yazı halinde yazmayı planlıyorum. Yapılacak işin kaba taslak bir çizimi aşağıdadır. Herkese iyi günler.

 

Scanned-image-0

Yorumlar: 1 »

Yapıştır! Etiket Programı

Kategori: C#, Referanslar
Tarih: 1st Nisan 2013

Kütahya il özel idaresi için geliştirilmiş etiket yazdırma programı. Program standart bir etiket kağıdı için pdf çıktı oluşturuyor. Şuan nette 3-4 tane etiket programı var ama çok esnek değiller tam istediğiniz etiketi yazdıramıyorsunuz.

Program WPF üzerine MVC pattern kullanılarak geliştirilmiştir. Arayüzle kodlamayı tamamen bağımsızlaştırmak içinde MVVM pattern kullanılmıştır. Veri Tabanına bağlantı için Entity Framework ile Mysql kullanılmıştır. EF ile istediğiniz veritabanına bağlayabilirsiniz.  Ekran önizlemeleri, kaynak kod ve veritabanı dosyası aşağıdadır indirerek istediğiniz şekilde özelleştirebilirsiniz.

Projeyi İndir

Edit: Programda tespit edilen bazı hatalar giderilmiş ve bazı fonksiyonlar geliştirilmiştir v1.1 i buradan indirebilirsiniz.

Yorumlar: 0 » tags: , , , ,

Bilişim Envanteri // Bir yazılımın anatomisi

Kategori: C#, Referanslar
Tarih: 19th Temmuz 2012

1. İhtiyaç Belirleme
Emekli olan, kurum değiştiren vs personelin bilgisayarları önlenemez şekilde el değiştiriyor. Demirbaş takibi güçleşiyor.

2. Analiz

İşleyiş: Yönetim panelinden bilgisayarlar ve parçalar, personellerle eşleştirilip zimmetlenecek. Panelden pasifleştirilen bilgisayarlar kullanılmayacak.

Yöntemler

  • Veritabanı olarak Mysql kullanılacak
  • Veri işlemede Entity Framework ve linq teknolojileri kullanılacak
  • WCF Service ile sunucu istemci iletişimi gerçekleştirilecek.

3. Tasarım ve Gerçekleme

Program gerçeklendikten sonra testleri yapılıp bir ftp sunucusuna deploy edilmiştir. Bu şekilde tüm yönetici ve istemciler güncellemeri otomatik olarak alacaklardır.

Önizleme:

Bir çözülemezliğin ispatı

Kategori: C#, Referanslar
Tarih: 18th Nisan 2012

Şekilde duvarlarla (kalın çizgilerle) bölünmüş 5 oda ve 16 kapı var. Her kapıdan 1 sefer geçme hakkınız var bütün kapılardan geçmelisiniz.

Ben kapıları ve odaları numaralandırdım. En dışarıya da bir oda numarası verdim çünkü bazı odalardan bazı odalara en dış alandan geçiş var. Bir kapıya iki yönden girilebileceğini düşünerekte (kuzey güney yada doğu batı) yönlerede numara verdim.

Program 1. kapının 0. y0nünden (yani kuzey) başlayarak tüm ihtimalleri deniyor. Çözüm yok…

Programı buradan indirebilirsiniz.

Delege – Event hakkında

Kategori: C#
Tarih: 19th Ocak 2012

Bu yapı benim aklıma hep mail listelerini getiriyor. Önce bir gurup oluşturursun sonra bir bilgiyi göndermek için sen bir sefer gönder dersin sonra sistem o bilgiyi listedeki herkese gönderir. Aslında Delege – Event yapısıda buna benzer. Önce bir delege oluşturursun (bunu bir kişi olarak düşün). Sonrada bir event oluşturursun. -bunuda bir liste olarak düşünebiliriz- Eventi istediğin kadar Delege ile doldurursun. İhtiyacın oluncada sen eventi çalıştırırsın, o da listedeki bütün delegeleri.

Delegeler fonksiyonları temsil eden yapılardır. Aslında bi işlem yapmazlar. Sadece bağlı oldukları fonksiyonları tetiklerler. Bir delegeyi aşağıdaki şekilde tanımlayabiliriz.

public delegate void BenimDelegem(int parametre);

Delegeler bağlı oldukları fonksiyonlar ile aynı yapıda olmalılardır. Yani yukarıdaki delegeyi bağlayacağınız fonksiyonda void türünde olmalı ve integer bir paratmetre almalı. İsterseniz Event olmadan da direk fonksiyonu delegeye bağlayabilirsiniz

BenimDelegem delege = fonksiyonAdi;

“delege” isminde bir delege oluşturduk ve fonksiyonAdi metoduna bağladık.

Eventler birden fazla -aynı türde- delegeyi barındıran yapılardır. Aşağıdaki şekilde oluşturulurlar.

public event BenimDelegem BenimEventim;

Bir evente aşağıdaki şekilde delege ekleyebilir ve çıkartabilirsiniz.

BenimEventim+= new BenimDelegem(delegenin bağlı olduğu fonksiyon ismi);

BenimEventim-= new BenimDelegem(delegenin bağlı olduğu fonksiyon ismi);

Senaryo şu çok odalı bir işletme düşünelim oda sayısıda dinamik olsun, sürekli yeni odalar eklenebliyor ve çıkabiliyor. Her odada bir buton var müdür gelince personelden birisi odanın butonuna basıyor ve her odada müdürün bulunduğu odanın numarası çıkıyor. Delege yapısı kullanmıyor olsak her oda için ayrı ayrı fonksiyon ( “müdürün bulunduğu odayı ekrana yaz” fonksiyonu) tetiklememiz gerekecekti. Yada odaları (formları) foreach ile okuyup  bu fonksiyonu tetikletebilirdik.

Delege – event yapısı bizim işimizi çok kolaylatıracak. 1 tane müdür geldi diye event oluşturacağız. Ve tüm odaları (delegeleri) bu evente ekleyeceğiz. Bunu görev listesi olarak düşünebiliriz. Evente, müdür hangi odaya geldi ise onun numarasını göndereceğiz. Sonra o bütün delegeleri çalıştıracak yani bütün formlara bizim yerimize müdür şu odada yazacak. İcraata geçelim.

Bir tane oda formumuz olsun. Bunun iki tane methodu olacak:

1.si ekranaYaz metodu. Delege bu methoda mürün kaçıncı odada olduğunu söyleyecek buda kendi formuna yazacak

2.si buttonClick metodu. Müdür bu odaya gelir ise personel bu butona basarak diğer odalara müdür bizim odada diye haber verecek.

Özetleyecek olursak hangi odadan basılırsa basılsın müdür bizim odaya geldi eventi tetiklenecek. Oda görev listesindeki bütün görevleri (yani delegeleri ve dolayısıyla delegelerin çalıştırdığı fonksiyonları) çalıştıracak böylece tek işlem ile bütün odalara bilgi yazılmış olacak. Proje dosyasını buradan indirebilirsiniz.

Yorumlar: 0 » tags: , ,

Deprem hasarları tespitinde bulanık mantık modellemesi

Kategori: Bulanık Mantık, C#, Referanslar
Tarih: 15th Aralık 2011

Standart bir program:

Temel girdiler → Program → Sabit bir sonuç

 

Bir bulanık mantık modellemesinin yapısı:

Sayısı belli olmayabilen veri yığını → Program → Girdilere ve varsayıma göre değişken bir veya birden fazla sonuç

 

Program 2 giriş için (kat sayısı ve fay bilgisi) tek çıkış veriyor. Sınırlar keyfi verilmiştir. Tecrübe edilerek sınırlar düzenlenebilir; girişler artırılabilir. Proje dosyası ektedir.

 

 

Proje dosyasını indirmek için tıklatınız.

Yorumlar: 6 »

Sağlık Kabini Otomasyonu

Kategori: C#, Referanslar
Tarih: 20th Ağustos 2011

Piyasada sağlık kabinleri hatta hastahaneler için bile yazılmış bir çok program mevcut ama hem çok karmaşıklar hatta bazılarını kullanabilmek için eğitim almanız gerekiyor hemde çok maliyetliler. Sağlık kabinlerinin sadece genel ihtiyaçlarını karşılayabilmek için yazılmış bir otomasyon. Bu otomasyonda malesef gereksiz özellikler ve karışık form yapıları yok.

Genel Özellikler:

*Anlaşılabilir ve sade arayüz ile personel, ilaç, doktor ve hasta yönetimi.

*Personel yönetimi ile birden fazla bilgisayarda ve şubede kullanabilme

*Gelir-gider ve borçlu hasta takibi

*Yedekleme ve geri yükleme sistemi

 

Önizlemeler:

Yorumlar: 1 »
Optimization WordPress Plugins & Solutions by W3 EDGE