arduino ile röle çektirme etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Merhabalar,
Yaratıcı arduino projelerinden bir başkası ile yeniden karşınızdayım.Yayının başlığından da anlayacağınız üzere bu arduino projesi bir alkışınızla lambayı yakıp söndürebilen bir devre olacak :)
Çok değil biraz geriye gidelim filmlerde görmeye alışık olduğumuz bir devre kendisi gelin ilk öncelikle devre şemasına bir göz atalım.
Şemalara dikkat ederseniz eğer sistemimizde bir adet mikrofon bulunmakta ve bu mikrofon el çırpma sesimizi algıladığı anda kapasitör üzerinde 1 nolu analog pinimizi tetikleyecek kadar miktarda voltaj depolayacak ve böylelikle yazılımımıza el çarpıldığı bilgisini gönderebileceğiz.
Yine şemalara dikkat ettiğimizde arduinomuzun 3 numaralı dijital pininden mosfetimizin Gate ucuna bağlantı var.Bu ne demek? eğer biz 3 nolu dijital çıkışımızı 1 konumuna getirirsek bu durumda mosfetimize bağlı olan röle çekecektir ve artık bu 5Vdc gücünde ve akımı belli olmayan rölemizle :) akımının müsade ettiği değerdeki bir cihazı kontrol etmek bizim elimizde olacaktır.
Röle çektirme devremizde kullanılan diyodun amacı ters akımı engelleyerek arduinomuzun 5Vdc çıkışını korumak ve aynı zamanda rölenin bobin uçlarına ters bağlantıyı önlemek amacını taşımaktadır.
Gelelim kodumuzu özetlemeye :
İlk olarak şunu belirtmek gerekir sistemde 2 adet mod var bunlardan biri normal durum diğeri programlama modu aslında şifre değiştirme modu.
Şifremiz bizim belirlediğimiz süreler içerisinde saniye bazında yapabildğimiz alkış miktarları.Eğer ki biz bu sekansı tutturabilirsek sistem hazır hale geliyor ve yeşil led yanıyor ve bundan sonra her el cırpmamızda cıkıs vererek cihazımızı calıstırıyor.Peki ne zamana kadar? Bizim belirledigimiz zaman asım suresine kadar bizi dinliyor.Sonraki el cırpmamızda ya da cıkısa atanan zaman asım degerinden sonra cıkıs vermeyi kesiyor ve sistem duragan hale geri geliyor.
Sistemde log olma suresini astık sonrasında cihaz duragan hale geciyor.Her zaman suna bakıyor ben programlama modundamıyım yoksa operasyon modunda mı? eğerki programlama modu anahtarı kapalı ise bize kırmızı ledi yakıyor ve bizden yeni bir alkıs listesii bekliyor.Programda ne tanımladık biz alkıslar arası zaman aralıgı.Bu alkıslar arasındaki zaman aralıgında cırptıgımız her alkıs liste olarak bizim sifremiz halinde kayıt altına alınıyor eger ki kayıt basarılı ise sistem bize yesil led yakıyor ve sonrasında alkıs listemizi bize ısık olarak calıyor :) Yanlıs ise ya da kayıt altına alınamadı ise kırmızı led yanıyor.
Özetlemeye gelirsek :)
Bu sistemle klima ça kapa,aydınlatma aç kapa,üşengeçsiniz kumanda yanınızda değil :) 3lü prize müdahale eden bir devre ile tv ac kapa yapabilirsiniz.
Son fikir size :D arada sizi deli eden ve tıkanan modeminize reset atmak için kalkmayın yerinizden iki alkıs size modeminiz resetlensin :)
Umarım keyifle okuduğunuz bir yazı olmuştur.Bir sonraki yazımda tekrar görüşmek dileği ile
Yazar: Caner ÇAKAR
Yaratıcı arduino projelerinden bir başkası ile yeniden karşınızdayım.Yayının başlığından da anlayacağınız üzere bu arduino projesi bir alkışınızla lambayı yakıp söndürebilen bir devre olacak :)
Çok değil biraz geriye gidelim filmlerde görmeye alışık olduğumuz bir devre kendisi gelin ilk öncelikle devre şemasına bir göz atalım.
Yine şemalara dikkat ettiğimizde arduinomuzun 3 numaralı dijital pininden mosfetimizin Gate ucuna bağlantı var.Bu ne demek? eğer biz 3 nolu dijital çıkışımızı 1 konumuna getirirsek bu durumda mosfetimize bağlı olan röle çekecektir ve artık bu 5Vdc gücünde ve akımı belli olmayan rölemizle :) akımının müsade ettiği değerdeki bir cihazı kontrol etmek bizim elimizde olacaktır.
Röle çektirme devremizde kullanılan diyodun amacı ters akımı engelleyerek arduinomuzun 5Vdc çıkışını korumak ve aynı zamanda rölenin bobin uçlarına ters bağlantıyı önlemek amacını taşımaktadır.
Sistemin kod kısmı
Gelelim yine her zaman olduğu gibi sistemimizin kod kısımlarını incelemeye :)
/* Pin Connections
Analog Pin 1: mikrofonumuzun bağlı olduğu pin
Digital Pin 2: Yeniden programlama
Digital Pin 3: Röle çıkışı
Digital Pin 4: kırmızı led. kapalı bilgisi
Digital Pin 5: Yeşil led. sistem açık bilgisi
*/
// pinlerimize sabit integer değerlere olarak adreslerini veriyoruz.İsterseniz direkt olarak program içerisinde integer olarak da çağırabilirsiniz.//
const int NoiseSensor = 1;
const int programSwitch = 2;
const int Output = 3;
const int redLED = 4;
const int greenLED = 5;
const int threshold = 8; //Bir alkışın belirlenmesi için tanımlanmış minimum sinyal
const int rejectValue = 25; // 25 eşiğinin üzerindeki sinyaller görmezden geliniyor
const int averageRejectValue = 15; // bir alkışın reddedilmesi için gerekli ortalama süre
const int knockFadeTime = 150; // 2 alkış arasında beklenmesi istenilen süre
const int maximumKnocks = 20; // Dinlenebilecek maksimum alkış miktarı
const int knockComplete = 1200; // Bir alkışın son bulması için beklenebilecek en uzun zaman aralığı
// Değişkenlerimiz
int secretCode[maximumKnocks] = {50, 25, 25, 50, 100, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Bir dinleme süresinde çırpılması gereken alkış listemiz.Bu bizim passwordumuz :)
int knockReadings[maximumKnocks]; // Şifre okuma listesi
int NoiseSensorValue = 0; // Son alkış dinlemesi
int programButtonPressed = false; // programlama butonu statusu basıldımı basılmadımı bilgisi
void setup() {
pinMode(Output, OUTPUT); // çıkışlar atandı....
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(programSwitch, INPUT);
Serial.begin(9600);
Serial.println("Program start.");
digitalWrite(greenLED, HIGH); // program başladı ve bizi dinliyor
}
void loop()
{
NoiseSensorValue = analogRead(NoiseSensor); // Alkışı dinle
if (digitalRead(programSwitch)==HIGH) // Programlama butonuna basıldı mı?
{
programButtonPressed = true; // Evet basıldı
digitalWrite(redLED, HIGH); // Programlama moduna gir ve kırmızı ledi yak.
}
else // programlama butonuna basılmadıgı durumlar..
{
programButtonPressed = false; // programlama durum bilgisini false yap
digitalWrite(redLED, LOW); // kırmzı ledi sondur lakin programlama durumunda değiliz.
}
if (NoiseSensorValue >=threshold) // alkış istenilen eşik değerini geçtimi ?
{
listenToSecretKnock(); // şifreyi al
}
}
void listenToSecretKnock() // Alkışlar arasında geçen süreleri kontrol et
{
Serial.println("knock starting");
int i = 0;
// Alkış sırasının resetle
for (i=0;i<maximumKnocks;i++)
{
knockReadings[i]=0;
}
int currentKnockNumber=0; // Her alkış sıralaması aldığında liste indexini 1 arttır
int startTime=millis(); // alkış geldiğinde referans süresini al
int now=millis();
digitalWrite(greenLED, LOW); // ne zaman alkış duyulsa ledi söndür ve yak.
if (programButtonPressed==true)
{
digitalWrite(redLED, LOW); // programlama moduna girildi ise her alkısta kırmızı ledi yak sondur.
}
delay(knockFadeTime); // dinleme durumunu bekle 2. alkıs komutunu alamdan
digitalWrite(greenLED, HIGH); // sonraki alkısı dinlemeye hazır isen yesil ledi yak
if (programButtonPressed==true) // programlamaya girildimi
{
digitalWrite(redLED, HIGH); // evet kırmızı ledi yak
}
do //2. el cırpmayı dinle ya da zaman aşımını bekle.
{
NoiseSensorValue = analogRead(NoiseSensor);
if (NoiseSensorValue >=threshold) //diğer alkısı al ve ne kadar sürede geldi hesapla
{
Serial.println("knock.");
now=millis();
knockReadings[currentKnockNumber] = now-startTime;
currentKnockNumber ++; //alkıs sayacını 1 arttır
startTime=now; // alkıslar arası gecen sureyi sıfırla
digitalWrite(greenLED, LOW); // yeni alkısı kabul edecegini belirten yesil ledi yak
if (programButtonPressed==true)
{
digitalWrite(redLED, LOW); // programlama tusuna basıldı kırmızı ledi yak
}
delay(knockFadeTime); //alkıslar arasında biraz bekle
digitalWrite(greenLED, HIGH);
if (programButtonPressed==true)
{
digitalWrite(redLED, HIGH);
}
}
now=millis();
}
while ((now-startTime < knockComplete) && (currentKnockNumber < maximumKnocks)); //did we timeout or run out of knocks?
//yeni şifremiz belirlendi
if (programButtonPressed==false) // programlama modundamıyız?
{
if (validateKnock() == true)
{
triggerOutput();
}
else
{
Serial.println("Secret knock failed.");
Serial.println("");
digitalWrite(greenLED, LOW); // gizli sifre tutmadı yesil ledi sondur cıkısı 1 yapamadık.
for (i=0;i<4;i++)
{
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
}
digitalWrite(greenLED, HIGH);
}
}
else
{
validateKnock();
Serial.println("New code stored."); // Eğer yeni gizli kodumuz kabul gordu ise kırmızı led sön yeşil yan
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
for (i=0;i<3;i++)
{
delay(100);
digitalWrite(redLED, HIGH);
digitalWrite(greenLED, LOW);
delay(100);
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
}
}
}
void triggerOutput() // Röleyi çektir ve cihazı çalıştır
{
Serial.println("Output Triggered!");
Serial.println("");
int i=0;
digitalWrite(Output, HIGH); // outputu bir sure sonra kapat
digitalWrite(greenLED, HIGH); // yeşil ledi de söndür
delay(10000);
digitalWrite(Output, LOW); // sistemi kapat
}
boolean validateKnock(){
int i=0;
int currentKnockCount = 0;
int secretKnockCount = 0;
int maxKnockInterval = 0;
for (i=0;i<maximumKnocks;i++){
if (knockReadings[i] > 0){
currentKnockCount++;
}
if (secretCode[i] > 0){
secretKnockCount++;
}
if (knockReadings[i] > maxKnockInterval){
maxKnockInterval = knockReadings[i];
}
}
// Eğerki yeni bir şifre girildi ise bunu kayıt altına al
if (programButtonPressed==true){
for (i=0;i<maximumKnocks;i++){ // normalize the times
secretCode[i]= map(knockReadings[i],0, maxKnockInterval, 0, 100);
}
// ledlerin ısıklarını da kayıt altına alınan yeni şifre sırasına göre yak ve sondur
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
delay(1000);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
delay(50);
for (i = 0; i < maximumKnocks ; i++){
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
// only turn it on if there's a delay
if (secretCode[i] > 0){
delay( map(secretCode[i],0, 100, 0, maxKnockInterval));
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
}
delay(50);
}
return false; // Yeni bir şifre belirlerken cihaza cıkıs vermek istemiyoruz
}
if (currentKnockCount != secretKnockCount) //Dogru şife alkıslandı mı ? :)
{
return false;
}
int totaltimeDifferences=0;
int timeDiff=0;
for (i=0;i<maximumKnocks;i++)
{
knockReadings[i]= map(knockReadings[i],0, maxKnockInterval, 0, 100);
timeDiff = abs(knockReadings[i]-secretCode[i]);
if (timeDiff > rejectValue)
{
return false;
}
totaltimeDifferences += timeDiff;
}
if (totaltimeDifferences/secretKnockCount>averageRejectValue)
{
return false;
}
return true;
}
İlk olarak şunu belirtmek gerekir sistemde 2 adet mod var bunlardan biri normal durum diğeri programlama modu aslında şifre değiştirme modu.
Şifremiz bizim belirlediğimiz süreler içerisinde saniye bazında yapabildğimiz alkış miktarları.Eğer ki biz bu sekansı tutturabilirsek sistem hazır hale geliyor ve yeşil led yanıyor ve bundan sonra her el cırpmamızda cıkıs vererek cihazımızı calıstırıyor.Peki ne zamana kadar? Bizim belirledigimiz zaman asım suresine kadar bizi dinliyor.Sonraki el cırpmamızda ya da cıkısa atanan zaman asım degerinden sonra cıkıs vermeyi kesiyor ve sistem duragan hale geri geliyor.
Sistemde log olma suresini astık sonrasında cihaz duragan hale geciyor.Her zaman suna bakıyor ben programlama modundamıyım yoksa operasyon modunda mı? eğerki programlama modu anahtarı kapalı ise bize kırmızı ledi yakıyor ve bizden yeni bir alkıs listesii bekliyor.Programda ne tanımladık biz alkıslar arası zaman aralıgı.Bu alkıslar arasındaki zaman aralıgında cırptıgımız her alkıs liste olarak bizim sifremiz halinde kayıt altına alınıyor eger ki kayıt basarılı ise sistem bize yesil led yakıyor ve sonrasında alkıs listemizi bize ısık olarak calıyor :) Yanlıs ise ya da kayıt altına alınamadı ise kırmızı led yanıyor.
Özetlemeye gelirsek :)
Bu sistemle klima ça kapa,aydınlatma aç kapa,üşengeçsiniz kumanda yanınızda değil :) 3lü prize müdahale eden bir devre ile tv ac kapa yapabilirsiniz.
Son fikir size :D arada sizi deli eden ve tıkanan modeminize reset atmak için kalkmayın yerinizden iki alkıs size modeminiz resetlensin :)
Umarım keyifle okuduğunuz bir yazı olmuştur.Bir sonraki yazımda tekrar görüşmek dileği ile
Yazar: Caner ÇAKAR
Yaratıcı arduino projelerinden belkide en ilgi çekici olanı arduino ile ev otomasyonu yapımı.
Bu projede evin iklimlendirmesi, güvenliği ve aydınlatma kontrolü ele alınmış.Gelin genel olarak kullanılan ekipman listesine bir bakalım.
1 adet Arduino geliştirme kartı
1 adet homeeasy controller - HE300
1 prototip board u - Vero board
10 adet direnç - 47 ohm
10 adet led
4 adet opto izolatör - RS part 308-613
1 prototip board u - Vero board
10 adet direnç - 47 ohm
10 adet led
4 adet opto izolatör - RS part 308-613
Genel olarak sistem nasıl işliyor ?
Uzaktan kumanda edilecek olan röleler opto kupler kullanılarak kontrol ediliyor.Neden opto kupler ile kontrol ediyoruz.Çünkü opto kupler bize geliştirme kartından bağımsız yüksek güçlerde röle çektirmemizi sağlıyor.Bunu nasıl yapıyor ?
Kontrol kartımızdan gelen 3.3 ya da 5V dijital bilgi opto kuplerimiz içerisinde bulunan ledi yakarak ışığa duyarlı olan transistörü tetikler ve bu durumda transistörün kollektöründen emitterine akım akmaya başlıyor.Emitter tarafıda 10k ohm gibi bir direnç bağlayarak buradan röle çektirme gücümüzü almış oluyoruz.
Yukarıdaki resimde görüleceği üzere 4 adet opto kupler her biri içerinde 2 şer adet kupler bulunan entegrelerle 8 kanallı bir sistem oluşturulmuş.Bu ne demek sekiz adet röleyi kontrol kartımızdan izole edilmiş halde çektirebiliriz anlamını taşıyor.
Uzaktan kumanda sisteme uygun hale getirilmiş.Kullanılacak olan her butonun ortak uçları ve tetikleme uçları alınarak arduinoya gönderilmiş.
Gelelim yazılım kısmını irdelemeye :)
Yazılım kısmında seri haberleşme ile kontrol ele alınmış.
Yazılım kısmında seri haberleşme ile kontrol ele alınmış.
char val; // seri haberleşme portundan gelecek olan komutu tutacak olan değişkenimiz
void setup()
{
pinMode(2, OUTPUT); // 2 den baslayarak 11 e kadar olan dijital noktalarımızı
pinMode(3, OUTPUT); // output olarak ayarlıyoruz
pinMode(4, OUTPUT); //
pinMode(3, OUTPUT); //
pinMode(6, OUTPUT); //
pinMode(7, OUTPUT); //
pinMode(8, OUTPUT); //
pinMode(9, OUTPUT); //
pinMode(10, OUTPUT); //
pinMode(11, OUTPUT); //
Serial.begin(9600); // 9600 baudrate ile seri haberleşmemizi başlatıyoruz.
}
void loop() {
if( Serial.available() ) //Seri haberleşme hazır mı?
{;}
val = Serial.read(); // hazırsa komutu val içine al
if( val == 'h' ) // val = h ise ısıtma sistemini durdur.
{
digitalWrite(2, HIGH); // 2 nolu çıkışa 1 yaz
delay(1000); // 1 saniye bekle
Serial.println("h = Heating off"); // seri monitöre ısıma kapalı yaz
digitalWrite(2, LOW); // 2 nolu çıkışı tekrar 0 yap
}
if( val == 'H' ) // Gelen komut H ise
{
digitalWrite(3, HIGH); //3 nolu çıkışı 1 yap
delay(1000); //
Serial.println("H = Heating on"); Seri Monitore ısıtma devrede yaz
digitalWrite(3, LOW); // 3 nolu çıkışı 0 yap
}
if( val == 's' ) //
{
digitalWrite(4, HIGH);
delay(1000); //
Serial.println("s = gate off"); elektronik kilit kapalı
digitalWrite(4, LOW); //
}
if( val == 'S' ) // if '5' was received
{
digitalWrite(5, HIGH); //
delay(1000); //
Serial.println("S = gate on"); elektronik kilit açık
digitalWrite(5, LOW); //
}
if( val == 'g' ) //
{
digitalWrite(6, HIGH); //
delay(1000); //
Serial.println("g = Garden lights off"); //bahçe ışıkları kapalı
digitalWrite(6, LOW); //
}
if( val == 'G' ) //
{
digitalWrite(7, HIGH); //
delay(1000); //
Serial.println("G = Garden lights on");// Bahçe ışıkları açık
digitalWrite(7, LOW); //
}
if( val == 'b' ) //
{
digitalWrite(8, HIGH); //
delay(1000); //
Serial.println("b = Bedroom light off");//yatak odası ışıkları kapalı
digitalWrite(8, LOW); //
}
if( val == 'B' ) //
{
digitalWrite(9, HIGH); //
delay(1000); //
Serial.println("B = Bedroom light on");// yatak odası ışıkları açık
digitalWrite(9, LOW); //
}
}
Sistemi özetlemek gerekirse:
komutlar :
H: ısıtma sistemini devreye al ve ısıtma açıldı ledini 1 saniye yak ve söndür
h:ısımta sistemini devre dışı bırak ve ısıtma kapatıldı ledini 1 saniye yak ve söndür
G:Bahçe ışıklandırmasını aç ve ışıklandırma açıldı ledini 1 saniye yak ve söndür.
g: Bahçe ışıklandırmasını kapa ve ışıkladırma ledini yak ve 1 saniye sonra söndür
B:Yatak odası ışıklarını aç ve ışıklar açıldı ledini 1 saniye yak ve söndür
b:Yatak odası ışıklarını kapa ve ışıklar kapandı ledini 1 saniye yak ve söndür
S:Elektronik kapı kilidini aç ve kilit açıldı ledini 1 saniye yak ve söndür
s:elektronik kapı kilidini kitle ve kilitlendi ledini 1 saniye yak ve söndür
Her bir durum kontrolü için atanmış çıkışlar üzerinden optokuplerler aracılığı ile rölelerin çektirilme mantığı ile birlikte sistem on / off olarak kontrol edilmiş.
1.PWM çıkışı ile birlikte gerek pulse göndererek ya da gerekse 0-10V gönderilmesi ile dimmer kontrolü sağlanabilir
2.Seri haberleşme olarak değilde bir Ethernet shiled ve sabit ip aracılığı ile birkaç basit php ve html bilgisi ile webbrowser üzerinden kontrol sağlanabilirdi (farklı kablosuz haberleşme metodları da kullanabilir :) )
3.Güvenlik kısmı azınlıkta kalmış.Sisteme duman sensörü,su baskını sensörü gibi farklı güvenlik kontrol sensörlerinin bağlantısı da sağlanabilir.
Şu anda aklıma gelenler bunlar :) Sizlerde yorumlarınızla aklınıza gelen eklemeleri paylaşabilirsiniz ve bunu gerek facebook grubumuzda gerekse sohbet bölümümüzde tartışabiliriz.
Bir sonraki yazımda görüşmek dileği ile ...
Yazar: Caner ÇAKAR