ESP8266-01 Nodemcu I2C EEPROM KULLANIMI

ESP8266-01 kendi küçük fakat işlevi büyük bir modüldür. Nodemcu modunda kendi başına, başka bir işlemciye ihtiyacı olmayacak şekilde çalışabilen bir modüldür. İsterseniz AT modunda SDK olarak da çalıştırabilirsiniz. Ayrıca SDK modunda Arduino ile ESP8266-01 kullanıp benzer mantığı oluşturabilirsiniz. Nodemcu’nun faydası Arduino ya da başka bir işlemciye gereksinim duymaması. Ayrıca ESP8266-01 kullanmak da zorunda değilsiniz. Nodemcu modul de kullanabilirsiniz. Ayrıca ESP8266-01 modülünü, Arduino IDE kullanarak nodemcu mod olarak programlayabilirsiniz.
ESP8266-01 modülününün Üzerinde Tx,Rx,GPIO.0 , GPIO.2 pimlerle kullanımınıza ayrılmıştır. Bizler bu projede, I2C EEPROM 24C16 entegresini kullanacağız.
GPIO.0 =SDA , GPIO.2 = SCK olarak kullanılacak. ( istenirse Tx ve RX pinleri gpio olarak kullanılabilir. )

24C16 EEPROM bağlantı şekli

24C16 eeprom entegresi I2C olarak haberleşir. I2C adresleri değiştirilebiliyor olsa da, bu proje de A0,A1,A2 uçları ve WP ucu GND ye bağladım. Standart adresini kullandım. Resimdeki 1K yerine 10K kullandım. Pull Up dirençleri olarak.

Yukarıdaki devre çalışan devredir. ESP8266-01 3.3V kullandığı için ve 24C16 entegresi de 3V3 kullandığı için devrenin tamamını AMS1117 3V3 regüle entegresi ile besledim. Tüm sistemi ise Powerbank 5V ile besledim.

ESP8266-01 modülümü nasıl nodemcu yapabilirim diyenler bu sayfaya bakabilirler.

EEProm neden kullanılır. Neden kullanmak isteyelim.
Bir çok sebebi olabilir. Mesela datalog olarak kullanılabilir. Bağladığınız bir sıcaklık sensörü, anlık bilgileri eepromda toplar. Belli sürelerle, İnternetteki bilgi deponuza yollar. Her dakikada internete bağlanmak zorunda kalmaz. Ya da internet yoksa verileri kayıt etmeye devam eder. İnternet geldiğinde, internetteki bilgi deponuza yollar. Bir diğer kullanım şekli ise merkez şeklinde çalışır. Anahtara basıldığında, hangi anahtara basıldıysa o anahtar bilgisi eeproma yazılır. Aynı zamanda anahtarın kontrol edeceği lamba devresine bilgiyi yollar. Elektrik kesilip geldiğinde, eepromdaki bilgilere göre, son kaldığı yerden devam eder.
Benim aklıma gelmeyen bir çok proje yapılabilir.
I2C kullanabileceğiniz için, I2C kullanan sensör ya da başka kartları da kullanabilirsiniz. Mesela I2C kullanan LCD modülü ya da I2C kullanan sensör ya da I2C kullanan port çoklayıcı.gibi modülleri kullanabilirsiniz.

Gelelim bu projede ne yaptığımıza.
Bu projede esp8266-01 in soft AP dediğimiz kısmını kullanacağız. Bunu kullanırken, TCP server ve TCP client olarak birlikte kullanıyoruz. TCP server kısmı gelen bilgileri alıyor. Yani bir kablosuz anahtara bastığımızda bu modüle AN,1,0- ya da AN,1,255- gibi bilgi yollar. Bu bilgiyi açarsak AN=anahtar, 1=anahtar numarası( aynı zamanda eeprom bellek adresi, 0-255 arası ise PWM olarak kullanabileceğiniz bir sayıdır. Şayet sadece ON – OFF olarak kullanacaksanız OFF=0 ON=255 yapabilirsiniz. Fakat bazen dimerli lamba kontrol edilmek istenir. Bu kodlamada 0-255 arası sayıyla PWM çalışma sağlanarak lamba kısılabilir. İsterseniz RGB lambalar için kodlamanızı geliştirip, AN,1,Rsay,Gsay,Bsay şekline getirebilirsiniz. virgülleri bulmak için izlenen yol program içerisinde var. Aynı yolu kullanabilirsiniz.

Pratikte bu sistem tasarruf amaçlı kullanılıyor. Gece herkesin olduğu zaman tüm lambalar en yüksek aydınlıkta kullanılır. Gece belli bir saatten sonra sadece pilot lambalar kalacaksa bu lambalar için bilgisayar otomatik olarak lamba numarası ve PWM kodunu yollar. istediklerini kapatır, istediklerini kısmak suretiyle tasarruf sağlamış olur.
Kontrol nasıl olacak derseniz, isterseniz ANDROID program yapabilirsiniz. İsterseniz Bilgisayara otomatik çalışma için program yazarsınız. Bilgisayar günün belli saatlerine göre kablosuz olarak gönderdiği komutlarla lambaları kontrol eder. Ya da kablosuz duvar anahtarı kullanabilirsiniz. Bir pot çevirerek PWM kodunu ESP modüle, oradan da lamba kısmına ulaştırmış olursunuz.

Anahtara bastığınızda 1000ms yani 1sn. sonra merkez modül, gelen çağrıyı işlemiş olduğundan, yeni çağrı için gelen hattı kapatır ve yeni sinyal dinlemeye başlar.
Birden fazla verici anahtar olabilir. Tabii ki android program ve PC programı da olabilir. Her biri bilgi gönderir. Fakat bu bilgi çakışmadan dolayı işlenemez. Bunu engellemek için Geri bildirim yapılıyor. Yani anahtara bastığınızda modülümüz aldığı bilgiyi geri yolluyor. Şayet gönderici bu bilgiyi alamadıysa 1sn sonra tekrar ediyor olacaktır. Bu şekilde çakışmaların problem olması önlenecektir.

Anahtarlar merkez modüle ait tek bir IP ye bağlanacağından, sorun olmayacaktır. Fakat lamba devrelerinin her birinin IP adresi değişik olacağından bir standart saptamak lazım. Her bellek adresi belirtildiğinden, Lamba alıcılarının IP adresleri bellek adresine göre verilmeli. Örnek vermek gerekirse şunu söyleyebiliriz.
192.168.4.1 merkez modülün adresidir. lambaların 1. lamba 2. lamba olarak verilmesi durumunda 1. lambanın IP adresi: 192.168.4.2 olacaktır. AN,1,255- dediğimizde 1. lamba yansın istiyoruz ve 1. bellek adresi kullanılacak. IP adres kısmındaki bilgileri 192.168.4.1+1 olarak degerlendirebiliriz. Yani 1. lamba IP adresi : 192.168.4.2 olacaktır. buna göre ister eepromun 2. adresinden başlayın isterseniz eeprom adresine 1 ekleyerek devam edin. İsteğinize kalmış bir durumdur. IP adresi nerede kullanılacak. Merkez modül lambalara komut verebilmek için IP adresini biliyor olması lazım. İstemci ( client ) olarak bağlanacaktır. Her lambada bulunan ESP8266-01 modülüne tcp server kurulacak. bunu kurduktan sonra onlar sadece dinlemede kalacak. Merkezden çalış ya da dur diye komut aldığında geri bildirim verebilirse iyi olacaktır. merkez emrinin uygulandığından emin olmalı. Şu anda bu özellik bu programda yok, ekleyebilirsiniz.

Normalde IP adresinin son kısmını değiştirerek 255 adres verilebilir. Yani 127 anahtar 127 lamba olacaktır. Bu devre doğru programlandığında 127 lambaya kadar kullanılabilir. Tabii ki teoride.

Program LUA programıdır. Bu programı ise LUA loader kullanarak ESP modüle gönderebilirsiniz. LUA LOADER programını şu linkten alabilirsiniz.
İsterseniz ESPLORER programını da kullanabilirsiniz.

wifi.setmode(wifi.SOFTAP)
wifi.ap.config({ssid="ESP8266",pwd="12345678"})
wifi.ap.setip({ip="192.168.4.1",netmask="255.255.255.0",gateway="192.168.4.1"})
id  = 0
sda = 3		-- GPIO.0 esp 8266 da 2 tane var diğerlerinde 2 den fazla port var. 
scl = 4		-- GPIO.2    port isimlerini buradan görebilirsiniz. https://nodemcu.readthedocs.io/en/master/modules/gpio/

-- initialize i2c, set pin 1 as sda, set pin 2 as scl
i2c.setup(id, sda, scl, i2c.SLOW)
uart.setup(0,9600,8,0,1,0)


sv=net.createServer(net.TCP, 10) -- çalışan hali 20 sn. gerekirse değiştir. **************************************

global_c = nil
global_sck = nil	-- her fonksiyonda ortak kullanılsın

print ( "ESP8266-01 Sizi Dinliyor ")


sv:listen(3000, function(c)
    if global_c~=nil then
        global_c:close()
    end
    global_c=c
    c:on("receive",function(sck,pl)

            feedback(pl,sck)	

    end)
end)

function feedback(data,sck)  
okuadres=0
 
        sck:send(data, function()-- parantez içine sk yaz. sk close kısmını aç.
                --sk:close()  -- bu satır bağlantı işini bitirince hemen kapanması için.
        end)

                    reg=data
if string.find(reg,"AN,") then		
        local startfind
        if string.find(reg,"-") then
       startfind = string.find(reg, "AN,") + 3 
       local endfind  = string.find(reg, ",",startfind)-1 
       anah = string.sub(reg, startfind, endfind)  --look for ssid in http call
       --print("newssid "..newssid)  --prints to serial, for testing mostly
    --	print ( startfind,"  ",endfind,"  ",anah)
        startfind=endfind+2
        endfind= string.find(reg,"-",startfind-1)
        deger = string.sub(reg, startfind, endfind-1)
        

        anah=tonumber(anah)
        deger= tonumber(deger)
        count = write_reg(id, 0x50, anah, deger)
        count=tonumber(count)

    
        print(" ")
        reg = read_reg(id, 0x50, anah,count)
        
        print(" Lamba Numarasi : ",anah)
        
        print(" Lamba seviyesi : ",deger)
        
        end
        
end	
                        
if string.find(data,"OKU,") then		
        local startfind
        if string.find(data,"-") then
       startfind = string.find(data, "OKU,") + 4
       local endfind  = string.find(data, "-",startfind)-1 
       okuadres = string.sub(data, startfind, endfind)  --look for ssid in http call
       okuadres=tonumber(okuadres)
    
        end
end		
        
sendlamp(data,okuadres)		
end



function sendlamp(data,okuadres) 

IP="192.168.4.2"
port=3000
        
        istemciac(port,IP)
        
if string.find(data,"AN,") then		
        sk:send("LAMP,")
        sk:send(anah)
        sk:send(",")
        sk:send(deger)
        sk:send("-")
end		
if string.find(data,"OKU,") then
    for i = 1, okuadres do  
    
    deger = read_reg(id, 0x50, i,1) 
pwmdeger=string.byte(deger)
        sk:send(i)
        sk:send(". adres , ")
        sk:send(pwmdeger)
        sk:send(" - ".."\r\n")
    end
end
        tmr.alarm(0, 1000, 1, function ()
        sk:close()
        end)
end


function istemciac(port,IP)
        sk = net.createConnection(net.TCP, 0)
        sk:connect(port, IP) 
end


function write_reg(id, dev_addr, reg_addr, data1)
    i2c.start(id)
    i2c.address(id, dev_addr, i2c.TRANSMITTER)
    i2c.write(id, reg_addr)
    c = i2c.write(id, data1)
    i2c.stop(id)
    return c
end


function read_reg(id, dev_addr, reg_addr,count)
reg_addr=tonumber(reg_addr)
    i2c.start(id)
    i2c.address(id, dev_addr, i2c.TRANSMITTER)
    i2c.write(id, reg_addr)
    i2c.stop(id)
    i2c.start(id)
    i2c.address(id, dev_addr, i2c.RECEIVER)
    c = i2c.read(id, count)		-- kaç karakter okunacaksa. yani kaç bellek adresi başlangıç adresinden itibaren okunacak. 
    i2c.stop(id)
    return c
end

 

Yukarıdaki programda write_reg fonksiyonu ve read_reg fonksiyonu I2C için kullanılmaktadır. Programın en başında ise SOFTAP nin açıldığını görüyorsunuz.
sv:listen satırları ise WI-FI üzerinden gelen bilgi var mı diye dinlediği yerdir.
function istemciac ise Lambalara bağlantı yapmak için istemci olarak çalışmasını sağlar. Burada IP adresi önemlidir. Lambaların IP adresini yukarıdaki bilgilere göre düzeltebilirsiniz.
Aşağıdaki 2 adet ekran görüntüsünden biri, AN ile verilen, bir kaç tane anahtar bilgisini gösterir. Diğer resim ise EPROM içeriğini göstermek amaçlıdır.
Epromun içeriğini görmek isterseniz OKU,15- yazabilirsiniz. 0. adresten başlayarak 15 adet bellek adresinin tamamını size gönderir.( isterseniz 15 sayısını lamba sayısına kadar çıkarabilirsiniz. )  Son durumu kontrol etmek için böyle bir komut kullanıldı. İstemezseniz bu kısmı iptal edebilirsiniz.

() işareti komut sonuna neden kondu. Programa gönderdiğimiz komutlar bir katar şeklindedir ve virgüllerle ayrılmıştır. String.find komutu, gelen bilgi içerisinde virgül arayıp, 2 virgül arasındaki bilgiye ulaşmayı sağlar. Bu bilgi katarının sonuna hiç bir işaret koymazsanız, bu ayrımı yine de yapabilirsiniz. Fakat başka işlemlerle tabii ki. Bilgi katarının uzunluğunu elde etmeniz gerekecektir. Son parçayı da öyle alabilirsiniz.
Ben ise nasıl virgül buluyorsam işaretini de koyduğum için o şekilde işaretini bulup, son nokta olduğunu görüyorum.

LUA programını yaparken yardım alacağınız site burası olabilir.

Nodemcu Lua programının komutlar dahil bilgilerini görmek için, bu link’i ziyaret etmelisiniz.

Gerçek devre resimleri :

8 Comments

  1. Hocam merhabalar,

    ESP8266 konusunda çok faydalı yazılarınızı takip ediyorum.Ayrıcada çok teşekkür ederim.Terminal programı üzerinden arduino library kullanmadan firebase realtime database e veri gönderme ve okuma gibi işlemlerin nasıl yapabileceği konusunda bir örnek çalışma yapmanız mümkün olur mu?Şimdiden teşekkür ederim.

    1. bu konuda bilgim yoktu. sizden öğrendiğim iyi oldu. bu konuda çalışacağım. hatta araştırmalara başladım. sayenizde yeni şeyler öğrenebileceğim. çalışmalarım meyvesini verdiğinde sizinle paylaşırım.

      Kolay gelsin,

      1. sizin bilgilendirmenizden sonra firebase de database oluşturdum hem herkese açık hem de kilitli yani key gerektiren şekilde bunu yaptım. sonrasında postman ile aynı esp ile istek yapıyormuş gibi komut satırını denedim hem okuyup hem yazıyorum hem de güncelleme yapabiliyorum.
        Postman da ki örnek satırı bu şekilde yazdım. get komutu internet url satırında okuma için kullanıldığından bu satırı web sayfasına koyarsanız okuyabilir.
        bunu gördükten sonra yazma işlemi için put kullanmanız gerekir. fakat web sayfasıondan put kullanılamaz ama esp put komutunu kullanabilir. bunu google postman programıyla kolayca deneyebilirsiniz. o size çalışan kodun bilgisini verecek esp ile bu kodu gönderip okuyabileceksiniz. esp client olarak çalışacak. bu kodu esp ye yazarken boşluklar bile sorun olabilir bunu deneyerek bulabilirsiniz.

        Bu satırı web sayfasına yazıp deneyin bu, key ile açılan database için. : https://kilitli-e3e5e.firebaseio.com/denkilit1.json?auth=M9ZunLwxxaYNmiKjKGSXg1G41C42YlFJgta0CAe3

        ayrıca key gerektirmeyen 30 günlük test database için de bunu web sayfasına yazarsanız bu databes i de okursunuz.
        https://firestore.googleapis.com/v1/projects/deneme-b47b4/databases/(default)/documents/esp-dene

        postman programını esp uygulamalarını denemeniz için tavsiye ederim.

        ayrıca bu kadar araştırma boşa gitmesin diye esp uygulamasını da gerçekleştirebilirsem bunu hem firebase database açmak hem de esp ile kontrol etmek olarak bir yazı olarak kaleme alacağım belki orada daha ayrıntılı olarak yazacağımdan arkadaşlara faydalı olur.

        kolay gelsin.

        1. Hocam tekrar merhabalar,
          İlgi alakanıza ve bilgilere çok teşekkür ederim çok faydalı oldu gerçekten.Postman üzerinden data okuyabiliyorum ancak Fırat Deveci Bey’in sitesinde yayınladığı “ESP8266 user program” üzerinden okumaya çalıştığımda başarılı olmuyor.Aynı programda api weather ve thinkspeak üzerinden bağlanmaya çalıştığımda rahatlıkla okuyor.Kusura bakmayın belirtmişsiniz boşluklar bile önemli diye ama denemediğim varyasyon kalmadı diyebilirim.Esp tarafında özel bir yazım terminolojisimi vardır.Denemeye vaktiniz olurmu

          1. postmandan kodu alabildin mi. önce oradaki kodu alman lazım. postmanın sağ üst tarafına yakın yerde code yazan kırmızı bir yer var. orada sana kodu veriyor. bu kodun en alttaki postman token kısmını kullanmıyorsun cache de kullanmıyorsun. host kısmı zaten var. fıratın programında host kısmına yazarsın. alttaki send bölgesine de get satırını kopyalarsın. get satırının sonuna 2 adet entere bas. bir de get ile satır baslangıcı arasına 1 boşluk verip dene ya da boşluğu silerek dene. bunlar eski tecrübeme göre söylendi. ben daha esp ye geçip fıratın programında denemedim tam nasıl olacağını söyleyemiyorum. son kısıma 2 tane enter bas dememin sebebi esp cr lf istiyor satır sonunda postman bunu yapmıyor. umarım başarırsın. başarırsan ekran görüntüsünü atarsan ben de aynı şekilde sorunla boğuşmamış olurum. kolay gelsin.

  2. merhaba sinan bey , bir şeyleri eksik söylemişim şimdi fark ettim. benim eski örneklerimde http olan sitelere bağlantı yapılıyordu. fırat devecinin programıyla https ile başlayan sitelere bağlantı yapmak sorun oluyordu. şimdi kendim de esp üzerinde denedim sonunda fark ettim. web sayfasından yada postmandan denendiğinde sorun olmasa da maalesef fırat devecinin programında hata oluyordu. burada bir video var. arduino için secure kütüphanesinden bahsediliyor. arduino ile get request yaparken bunu kullanırsan sorun olmayabilir. videonun haricinde bazı kütüphanelerde değişiklik yapıldığında https request yapılabiliyormuş. Video sanırım yardımcı olacaktır. https://www.youtube.com/watch?v=iY72oPAaa_8

    kolay gelsin.

    1. Şafak Bey merhabalar, biraz uğraştım ama sorunu çözemedim maalesef.NodeMCu kullandığımda sıkıntı yok çalışıyor.Ancak amacım arduino sketch ve library’leri kullanmadan atmega328P ve esp üzerinden data alışverişi yapmaktı.https işin içine girdiğinde durum biraz değişiyor anladığım kadarıyla.Çözebilirsem sizinlede paylaşacağım.Aşağıdaki linkelerde arduino tarafında çözüm ve anlatım içeren videolar var sizinde işinize yarar diye düşünüyorum.Destek için tekrar teşekkür ederim.

      https://www.youtube.com/watch?v=1OzAug0HUcQ
      https://www.youtube.com/watch?v=Wm1xKj4bKsY&t=651s

  3. Merhabalar. Iletisim bolumundennsize mesaj gondermek istedim ancak form gonderiminde hata bildiriyor, mail adresim uzerinden sonus yaparsaniz sevinirim. Kolay gelsin.

sinan için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir