ESP8266-01 ve PCF8574 Dijital Port Çoklayıcı ile 8 led kontrol.

Bir önceki yazımda PCF8574 I2C LCD kontrol modülünün nasıl port çoklayıcı olarak kullanıldığını anlatmıştım. Bunun 2 port çıkışı olan ESP8266-01 ile kablosuz olarak ve bu I2C lcd modül kullanılarak, 8 çıkışı nasıl kontrol edebileceğinizi göstereceğim.
Burada dikkat ederseniz ev otomasyonu demedim. ( Bir çok kişinin dediği gibi ) EV OTOMASYONU BAŞKA BİR ŞEYDİR. Sadece kablosuz olarak nasıl kontrol edileceğini anlatacağım. Şunu da belirtmek gerekir ki bu program sadece bulunduğunuz yerdeki modemi kullanarak yerel cihazlarınızın kontrolünü yapmanızı sağlayacak. İnternetten nasıl kontrol edebilirim derseniz  ESP8266-01 konularına bir göz atabilirsiniz.
Resimdeki cihaz gibi bir cihaz yapmış olacağız. Fakat bu cihaz 1 adet sistem kontrol ederken siz 8 röle ile bunun 8 tanesini kontrol etmiş olacaksınız.


Elimizde bir adet ESP8266-01 modülümüz var. Bunu Arduino ile nodemcu olarak programlayabiliriz.
Ayrıntılı bilgi için Arduino ile ESP8266-01 programlama konusuna bakabilirsiniz.

ESP01 modülümüzü bu şekilde programladıktan sonra, I2C bağlantılarını şemaya göre yaparak I2C LCD modülünü çoklayıcı olarak kullanabilirsiniz. Bu modüle bağlı Portlarla da Ledleri veya uygun şekilde bağladığınız rölelerinizi kontrol edebilirsiniz. SDA ve SCL ye bağlı 10K dirençler modül üzerinde olduğundan bağlamanıza gerek yok.                        
ESP01 programı 3 bölümden oluşuyor. Birincisi web server bölümü bunu ESP8266WiFi.h kütüphanesi kontrol eder. ikincisi yine bu kütüphane ile kontrol edilen Soft AP ( Esp01 hem soft AP hem de STA modunda çalışır. ) Soft Ap direkt olarak ESP nin IP adresi ile bağlanılması demektir. 192.168.4.1  IP adresidir. Bunu kullanmak için mutlaka ESP01 wifi ağına bağlanmanız gerekir.
STA modu ise ortak kullanılan wifi ağınızdan ESP yi kontrol etmenizi sağlar. Bunun için size standart bir IP vermiyorum. Çünkü her ağ içerisinde, o ağa mahsus bağlantı yapıldığında gösterilebilecek bir adrestir. ESP01 i PC nizde ya da telefonunuzda kullandığınız wifi ağına bağlıyorsunuz. Mesela sizin PC ya da telefonunuzun IP adresi 192.168.2.34 ise ESP de otomatik olarak bir IP alacaktır. Bu IP ye internet sayfanızdan bağlanabileceksiniz.
Programın başında bulunan bu alana kendi modeminizin bilgilerini girerseniz ESP ortak ağınıza bağlanacaktır.
// kendi modem bilgilerinizi girin
const char* ssid = “SSID”;
const char* password = “ŞİFRE”;

Diyeceksiniz ki ESP nin standart IP adresini biliyoruz. Ama ESP nin STA modunda aldığı adresi bilmiyoruz. Nasıl bulacağız.
Doğrusu bu durumda da izlenecek 2 yol var. Birincisi modemin içine girip IP adreslerini listelemek ki. Bu en zoru, bazen de modem sizin kontrolünüzde değilse imkansızdır. İkinci yol daha basittir. WIFI ağlarını listeleyin ve ESP01 in wifi ağına bağlanıp 192.168.4.1 adresine internet sayfanızdan bağlanın. ESP01 sizin bağlantınızı görecek ve Ledleri kontrol etmeniz için size butonları görebileceğiniz bir sayfa  gösterecektir.
Aynı zamanda altında ise, o an bağlı bulunduğu STA- IP adresini verecektir. Artık bu IP yi bulduğunuza göre, kendi PC ya da telefonunuzun ortak wifi ağına tekrar bağlanıp, ESP nin verdiği STA IP adresini internet sayfanıza yazarak bağlanabileceksiniz.
Biraz uzun bir anlatım oldu ama buna aşina değilseniz tek tek uygulayabilmeniz için açıkladım. Zaten aşina olanlar bunu hemen uygulayacaklardır.

3. bölüm ise WIRE kütüphanesiyle I2C yollamak. (Bu kısım zaten I2C lcd modül ile çoklayıcı konusunda anlatıldı. )

Aşağıda gerçek devre bulunmakta. ESP01, 3V3 ile çalıştığından I2C lcd modülü 5V ile çalıştırsam araya seviye dönüşüm için devre kurmam gerekecekti. 5V ile 3v3 sinyalleri dengelemem gerekecekti. SDA ve SCL için örnek bir seviye dönüşüm devresi, Gerçek devre resminin altındadır.  SDA ve SCL sinyallerinden SCL olan tek yönlü olsa da, SDA çift yönlü olacaktır. Bundan dolayı her zaman 3V3 seviye dönüşümlerinde kullanılan 2 direnç ile gerilim bölme burada uygulanamamaktadır. Bundan dolayı devre kurulması gerekiyor. PCF8574, 3V3 ile çalışabildiğinden ben ESP01’i ve I2C lcd modülünü 3V3 ile besledim. Bu şekilde çalıştırdığımda araya seviye dönüşüm gerekmeyecektir. Çünkü tüm sistem 3V3 ile çalışmaktadır.  Resmin sağındaki protoboard üzerinde 1 adet I2C lcd modül var 1 adet ise 3V3 regülatör bulunmaktadır. ESP01 pcbsinde de 3V3 regülatör bulunmaktadır. Her iki devre de powerbank çıkışındaki 5V ile çalışmaktadır. Bu regülatörler devreleri 3V3 ile beslemektedir. LED gerilimini ise 5V bıraktım. Ledleri, isterseniz üzerindeki LCD aydınlatma devresindeki transistör gibi sürerek, Röle kontrolüne çevirebilirsiniz.
Bu gerilimi bundan dolayı durumu göstermek için 5V bıraktım.  En önemli kısım ESP01 ile I2C LCD arasındaki bağlantı hattıdır. Bu hatta dikkat ederseniz 3 adet kablo vardır. SDA,SCL,GND.
GND nin her iki devrede ortak olması önemlidir. 2 besleme kaynağı kullanıyorsanız mutlaka GND uçları birleştirilmeli. Mesela 12V röle kullandık diyelim. Röle beslemesinin GND ucu ile Kart beslemesinin 3V3 GND ucu birleştirilmeli.

Bu devrenin benzerlerini internette bulabilirsiniz.

Yukarıdaki devrede kırmızı ışık yanan  bir kart daha var. Bu da FT232RL Usb seri çevirici kartıdır. Bu ESP01 için program yüklemeye ve Programımız çalışırken Seri monitör ekranına bilgi göndermeye yarıyor. Oradan da ESP ye 3 kablo gider. Tx,RX,GND. Gördüğünüz gibi tüm kartların GND uçları ortak hale getirilmiştir. FT232RL nin çalışma gerilimini ayarlayan jumper da 3V3 kısmına alınmıştır. Tüm sistem 3V3 ile çalışmaktadır.

I2C LCD modülün port pimleri bu şekildedir.

Yukarıdaki modül LCD modül olmasına rağmen, port çoklayıcı olarak kullanılabileceğinden Çıkış portlarını resimde gösterdim. Burada sadece P3 farklı. P3 LCD ledinin kontrolü için transistöre bağlıdır. Bundan dolayı diğer çıkışlara göre ters çalışır. Yani diğer çıkışlar 0 iken led yanıyorsa P3 portunda 1 iken led yanacaktır tek fark budur.

Tüm programlara ve Proteus çizimine Github üzerinden ulaşabilirsiniz.

Bazıları, port çoklayıcılar için kütüphane kullanmak istiyorlar. Buna anlam veremiyorum. Wire kütüphanesi I2C bilgi göndermek ve almak için yeterli. Sadece 3 komut satırı ile gönderiliyor
3 komut satırı ile okunuyor. Bunu kavradığınızda I2C modüllerini rahatlıkla kullanabilirsiniz. Ayrıca I2C modülün adresleri ile sorununuz olursa ayrıntılı bilgiyi, bu yazımdan alabilirsiniz.

Biraz da programdaki mantığı anlatmak isterim. Ben ledlerin sadece butona basınca, basılan butona ait olanın yanmasını istedim. Bunun için bir dizi kullandım.
int LedI2C[]={246,245,243,255,231,215,183,119};     bu dizide led butonuna basıldığında o lede ait numara alınır ve I2C ile modüle gönderilir. Mesela 246 sayısını ele alalım.
Binary olarak 1111 0110 şeklinde gösterilir. en sağdaki bit P0 çıkışıdır. buna göre bakarsak 1. led yanıyor. Yani 1. bit 0 diğerleri 1 olacak ve sönük olacaktır. ( Özel bir durum P3 diğerlerinin tersi çalışıyor diye 0 olmaktadır. ) Bu şekilde sadece her seferinde 1 tek led yanar. Ben bu şekilde basit olarak programladım.

Fakat röle sistemlerinde bu istenmez.
Bağlantıda olan ikinci bir röleyi kapatırsak o devredeki iş yarım kalır. Burada bir başka programlama yöntemi bulup, diğer röle konum değiştirmeden basılan butona ait röle çalışsın dememiz gerekir. Bunun için size gösterebileceğim yol. Son I2C gönderdiğimiz sayıyı OR veya AND işleminden geçirmektir. 
Binary sayımıza göre düşünürsek bir ledi tek başına açalım fakat diğerleri etkilenmesin dediğimiz zaman ve yanması için 0 gerektiğinden AND işlemini kullanabiliriz.
Binary son sayımız  1111 0110 dur.  Bu sayıda P7 çıkışını 0 yapmak istesek vereceğimiz değer şu şekilde olmalı. 1111 0110  AND 0111 1111 sayısıyla AND işlemi uygulamak. Burada yapılan işlem çarpma olarak düşünün . Çarpmada bir sayıyı 0 ile çarparsanız sonuç 0 dır. Mantık kapılarına göre düşünürsek girişlerden biri sıfırsa çıkış sıfırdır. Bu mantıkla sadece son sayıda değişiklik yapmış olduk. Son sayı 0111 0110 olarak değişmiştir. 1. ve 7 ledler yanmaktadır.
Sonrasında 1. ledi söndürmek istersek yine son sayıda tek bir biti değiştirmeliyiz. 1 yapmak için OR işlemini yapacağız. Mantık kapısı olarak bakarsak, OR işleminde girişlerden biri 1 ise çıkış 1 dir.
Bu mantıkla son sayımızı OR işlemine tabi tutalım.
Son sayımız,  1. ve 7. ledler yanan sayı: 0111 0110  OR 0000 0001 sayısıyla OR işlemine tabi tutulduğunda 1. ledi 1 yapmak istediğimizi belirtmiş oluruz. OR işleminde 0 etkisiz elemandır. Durum değiştirmez. 1. led, 1 durumuna geçeceği için söner. Son durumdaki sayı ise 0111 0111 şeklinde olacaktır.

Video da ayrıntılı anlatmaya çalıştım. Sorunuz olursa ya da eksik bulduğunuz bir kısım varsa bunu buradan ya da face gruplarından bana bildirebilirsiniz.

Not: Sitemde ABONELİK yok. Fakat isterseniz Video üzerindeki Ş butonuna basarak ve ABONE OL butonuna basarak kolaylıkla YOUTUBE üzerinden ABONE olabilirsiniz. Yazılar ilk gün YOUTUBE üzerinde yayınlanacak sonrasında diğer ortamlarda paylaşılacak.  Yazılarımdan anında haberdar olmak isteyenler, ABONE olabilirler. 

I2C seviye dönüşüm devresinin Proteus üzerinde çalışması.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.