Arduino Gömülü Sistem Arduino ve NodeMCU I2C Seri haberleşme Protokolü By Fatih Mehmet Yılmaz Posted on 23 Kasım 2017 11 min read Arduino ve NodeMCU I2C Seri haberleşme Protokolü için yorumlar kapalı 0 6,941 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr Merhaba Son zamanlarda esp8266 serisi ile yapılan uygulamalar aldı başını gitti. Türkiye de NodeMCU modüller yeni yeni kullanılmaya başlandığı için pek uygulama göremedim. bu node zımbırtısı esp8266 nın güncellemesiyle ttl dönüştürücüsü ile ayrı ayrı uğraşmadan tek bir modül üzerinde arduino ıde ile rahatlıkla programlayabileceğimiz bir modül haline getirmişler. arduino ide üzerinden basit bir güncelleme ile de onlarca örnek uygulamayı görebiliriz. Bugün biz farklı bir kısıma değineceğiz daha sonra temelden ileri doğru eğitim serisi paylaşırım. Örneğin wifi ile akıllı ev yapmak istiyorsunuz.Bir arduino sadece evin elektirik aksamını ışıklar pirizler vs), bir tanesi akvaryumu, bir tanesi çiçekleri ve sulama sistemini, bir tanesi kapı güvenlik vs. kontrol eder. bunları yönetecek bir master cihaz (wifi,ethernet, bluetooth) bilgisayar veya cep telefonumuzla bağlantı kurar. biz telefonundan ışıkları açmak istediğimizde master cihaz ışıkla alakalı arduinoya açılacak ışık bilgisini gönderir ve ışık açılır. Burada I2C Seri İletişim Protokolü ile Node modülünüzü master yani bir nevi yönetici seçip diğer modülleri veya arduino(ları) yönetebilirsiniz ve denetleyebilirsiniz. Resimde görüldüğü gibi nodemcu D1 VE D2 pinleri ile Arduino A5 ve A4 pinlerini birbirlerine bağlamalayız. Ortak bu tür iletişimlerde ortak gnd şarttır. bunuda unutmayalım. MASTER İÇİN [php] /* I2C haberleşmesinde Master olarak görev yapan nodeMCU için kodlar */ #include <Wire.h> /* * I2C fonksiyonlarını kullanabilmek için * Wire.h kütüphanesini projemize ekledik */ String Gelenveri;/*gelen verileri char dizisi olarak tutacak ve diğer arduinoya yollayacağız*/ int seriGeldimi;/*verinin seri porttan gelip gelmedğini tutacağımız bilgi. */ void setup() { Wire.begin(D1,D2);/*iki arduinonun haberleşmesi için kullandığımız kütüphanenin bağlantıyı başlatma fonksiyounu*/ /* I2C haberleşmesi master olarak başlatıldı */ Serial.begin(9600); /*bilgisayarla haberleşebilmek için seri portu açtık*/ /* Bilgisayara veri yazdırabilmek için seri haberleşme başlatıldı */ } void loop() { while (Serial.available()) /*seri veri olduğu sürece dön diyoruz*/ { // get the new byte: Gelenveri=Gelenveri+(char)Serial.read();/*gelen veri yi char larak Gelenveri[] dizisine aktarıyoruz. */ delay(20);/*her gelen bilgi arasında bir süre bekliyoruz ki bağlantı kopukluğu olmasın*/ seriGeldimi=1;/*seri porttan veri geldi artık kopyalanmaya hazır*/ } if (seriGeldimi==1) { seriGeldimi=0;/*seri porttan veri geldi ve kopyalama işlemi bittiğine göre tekrar veri gelmesini beklemek ve gereksiz yere buradaki kodların çalışmasını engellemek için seri geldimi değişkenini sıfır yapıyoruz. */ if (strlen(Gelenveri.c_str())==1)/*direk enter a baasarsak sdfdsafds cevap bekliyoruz başka şeyler yazarsak ekrana yazdırıyoruz.*/ { Wire.requestFrom(1, 20);/*1 adresine sahip cihazdan cevap bekliyoruz..*/ /* 1 adresine sahip slave (köle) cihazından 20 BYTE’lık(20 karakterlik) veri bekleniyor*/ String slavMetin;/* slave cihazdan veri gelirse kaydedeceğiz.*/ while(Wire.available()) { /* I2C hattında yeni veri olduğu sürece döngü devam edecek */ slavMetin = slavMetin+ char(Wire.read()); /* I2C hattından gelen veriler okunuyor */ } Serial.println(slavMetin.c_str()); } else { Serial.println("veri g0nderildi"); Wire.beginTransmission(1);/*köle cihaza 1 adresini verdik siz başka adresler verebilirsiniz.100 cihaz bağladınızsa 1 den 100 e kadar adres verebilirsiniz.*/ /* 1 adresine sahip Slave (köle) cihazına veri yollanacağı bildiriliyor */ Wire.write(Gelenveri.c_str());/*gelenveriyi köle cihaza kopyalamaya başla*/ delay(20); Wire.endTransmission(); /* Yollanacak verilerin bittiği bildiriliyoruz */ } Gelenveri=""; } } [/php] SLAVE İÇİN [php] /* Slave (köle) görevindeki Arduino’nun kodu */ #include <Wire.h>//ı2c nin kütüphanesi String Gelenveri; int veriGeldimi=0; void veriGeldiginde(int veri) { /* I2C hattında bu cihaz için yeni veri olduğunda bu fonksiyon çalışır */ /*master cihazdan verinin gelip gelmediğini tutuyoruz ki void loop methodunda gereksiz yere işlem yapmayalım. */ /* Hattaki veri okunarak gelenKarakter değişkenine kaydedilir */ while(Wire.available())/*ı2c hattından veri gelince işlemeye başlayan kod.*/ { /* I2C hattında yeni veri olduğu sürece döngü devam edecek */ Gelenveri=Gelenveri + char(Wire.read());/*masterden gelen veri char değer olarak geldiği için Gelenveri string değişkeninde saklıyoruz. */ delay(20);/*gelen veride hata çıkmaması açısından bir miktar bekleterek değişkene aktarıyoruz.*/ } Gelenveri.c_str(); Serial.println(Gelenveri); Gelenveri=" "; } void istekGeldiginde() { /* Eğer master bu cihazdan veri istiyor ise master cihaza veri gönderip cevap beklediğimizde buradaki kod çalışır. verisi yollanılır /* Eğer bu bir sensör olsaydı sıcaklık veya ivme verisi yollanıyor olacaktı*/ String cevap="cevabim=EVET"; cevap.c_str(); Serial.println("benden cevap istedi"); } void setup() { Serial.begin(9600); Serial.println("Arduino ogreniyor muyuuuz?"); delay(2000); Wire.begin(1);/* Slave (köle) cihazımıza 1 adresini verdik. */ /* I2C haberleşmesi, haberleşme adresi 1 olan bir slave cihaz olarak başlatıldı */ Wire.onRequest(istekGeldiginde); /*master cihaz bişeyler istediğinde bu methoda gitmesini istiyoruz*/ /* Master olan cihaz bu Arduino’dan veri istediğinde gerçekleşecek işlem seçildi */ Wire.onReceive(veriGeldiginde);/*biz veri istemesek bile master veri gönderdiğinde buradan takip ediyoruz. adam sahip biz istemesek bile bize iş verebilir.nerede insan pardon arduino hakları */ } void loop() { } [/php] not: Yardımlarından dolayı Osman Semerci ye teşekkür ederim.