Arduino Uno ESP8266 Kullanımı ve TCP Client Oluşturma
|
Merhabalar..
Öncelikle yazı yazmaya ara verdiğim uzun süre için özür dilerim. Bu yaz önceki yazlara nazaran çok daha yoğun geçtiği için yazacak bir konu üzerinde yoğunlaşamadım. Bundan sonra açığı kapatmaya çalışacağım..
Bugün ki konuda Arduino Uno kullanarak ESP8266 kullanımından bahsedeceğiz. Son olarak da bir DHT11 entegresinden aldığımız sıcaklık verilerini oluşturduğumuz bir TCP server’ a göndereceğiz.
Öncelikle neden Arduino Uno ile ESP8266 kullanımı diye ayrı bir konu açma gereği duymamdan bahsedeyim. ESP8266 bilindiği üzere AT komutları yardımı ile seri port üzerinden haberleşilebilen bir elektonik donanım. Daha önce konusu buluan Arduino ile ESP8266 kullanımı konusunda anlattığımız Arduino’ nun Mega modeli kullanılmıştı. Bu modelde konuda da belirttiğimiz üzere birden fazla HardwareSerial modülü bulunmakta idi. Bu modül ile haberleşme hızı 115200′ lere kadar sorunsuzca çıkartılabilmekte. Ancak Arduino Uno üzerinde 1 adet hardware serial modülü var biz bunu genelde debug işlemleri için kullanıyoruz. İkincil haberleşme donanımı olarak da SoftwareSerial yapısını kullanmamamız gerekiyor.
Peki ya ikisinin farklı nedir? HardwareSerial Arduino içerisinde ADC gibi bir modüldür, SoftwareSerial ise yazılımsal oluşturulmuştur. Yazılımsal oluşturulmuş olmasının dezavantajı olarak yüksek veri transfer hızlarında çalışamaz. Arduino ‘ nun kendi içerisindeki SoftwareSerial kütüphanesi ile kullanılabilecek en fazla haberleşme hızı Arduino’ nun web sitesinde de belirtildiği üzere 38400 baud ‘ dır.(Çalışan daha yüksek bir SoftwareSerial kütüphanesi bulamadım, bulan banada ulaştırabilirse sevinirim .. :) ) Deneme yapacak olursanız bu iki baud rate arasındaki farkı seri porta analog porttaki veriyi yazdırmak gibi basit işlemlerde gözlemleyemezsiniz. Ancak ESP8266 gibi hızın önemli olduğu bir modülde son derece önemlidir. Bu yaptığım örneklerde baud rate’ i 38400 olarak ayarladım. Size de bunu şiddetle tavsiye ederim.
Daha önceki örnekte ESP8266 ile haberleşmek için herhangi bir kütüphaneden yardım almadan doğrudan AT komutları kullanmıştım. Şimdiki örneklerde ise kullanımı kolaylaştıran bir kütüphaneden yardım alacağım. Bu kütüphaneye buradan ulaşabilirsiniz.
İlk olarak bu kütüphane ile Arduino Uno’ yu nasıl kullanacağımızdan bahsedelim. Daha önce de belirttiğim gibi Arduino Uno’ nun üzerinde sadece bir tane HardwareSerial donanımı var. Biz bu donanımı genellikle basit debug işlemleri için kullanırız bu yüzden aynı zamanda farklı bir donanım ile haberleşemeyiz. Bu yüzden de SoftwareSerial kütüphanesini kullanmamız gerekir. Biz kütüphaneyi Arduino’ nun dijital 2 ve 3 nolu pinleri ile kullanacağız. 38400 baud rate için dijital 2 ve 3 nolu pinleri kullanmanızı tavsiye ederim. Kütüphaneyi inidrikten sonra kütüphane içerisindeki “ESP8266.h” isimli dosyayı açın.
Resimde kutu içerisinde görülen 27. satırı yorum satırı olmaktan çıkarın. (Baştaki iki // silmeniz yeterlidir). Artık kütüphane SoftwareSerial kütüphanesi ile uyumlu hale gelmiş oldu. Şimdi tanımlamalarımızı yapalım.
#include <SoftwareSerial.h>
#include <ESP8266.h>
SoftwareSerial espSerial(2, 3);
ESP8266 wifi(&espSerial);
void setup() {
// put your setup code here, to run once:
Serial.begin(38400);
espSerial.begin(38400);
}
Artık Arduino Uno ile SoftwareSerial kullnarak sorunsuz bir şekilde ESP8266 ile iletişim kurabilirsiniz. SoftwareSerial’ i kullanmak için burada bahsi geçen kütüphaneyi kullanmak zorunda değilsiniz. Önceki örnekteki HardwareSerial kısımlarını SoftwareSerial ile değiştirerek ve Baud Rate’ i değiştirerek de kullanabilirsiniz.
TCP iletişim örneğine geçmeden önce Arduino ile io data visualization cloud’ lardan olan freeboard.io ya nasıl veri göndereceğimize bir bakalım. freeboard.io’ yu seçmemedeki sebep diğer cloud’ lara göre daha çok widget olması ve ücretsiz pakette sınırsız widget eklenebiliyor olması. Ancak verilerin aktarılması güvenliksiz bir metod ile gerçekleşir. Bu yüzden sadece hobi amaçlı uygulamalarda kullanılmasını tavsiye ederim.
Öncelikle Arduino ile ESP8266 bağlantısından bahsedelim.
Bu devrede haberleşme için kullanılacak 2 ve 3 nolu pinlerden veri gönderiminde kullanılacak 3 bolu pine bağlı dirençler gerilim bölücü olarak kullanılmıştır. ESP8266 3.3V gerilim seviyesinde çalışır. Arduino ise 5V gerilim seviyesinde çalışır. Gerilim bölücü bu yüzden kullanılmıştır. Kullanılacak gerilim bölücünün dirençleri 10k’ yı geçmeyecek şekilde ayarlamanızı tavsiye ederim. Aksi taktirde haberleşmede gürültü nedeniyle sorunlar meydana gelmektedir. Ancak gerilim bölücü kullanmak sizin tercihinize kalmıştır. Gerilim bölücü kullanmasanızda haberleşme gerçekleşir lakin ESP8266 zarar görebilir. Bağlantı şemamızdan sonra sıra yazılıma geldi.
freeboard.io ile haberleşmeyi dweet.io üzerinden gerçekleştireceğiz. Biz DHT11′ den gelen sıcaklık ve nem değerlerini dweet.io ya GET metodu ile göndereceğiz. dweet. io GET metodu ile gelen verileri anahtar isimleriyle birlikte JSON formatına çevirir. Daha sonra biz freeboard.io ile bu verilere JSON formatından rahatlıkla erişebiliriz.
#define HOST_NAME "www.dweet.io" #define HOST_PORT (80)
Daha sonra TCP port ile dweet.io’ ya bağlanalım.
Serial.println("Connecting dweet.io.."); if (wifi.createTCP(HOST_NAME, HOST_PORT)) { Serial.println("connect OK"); } else { Serial.println("connecting failure!"); while (1); }
Şimdi TCP port ile sıcaklık ve nem değerlerini dweet.io’ ya GET edelim. Burada metod oluşturulurken string’ ler ayrı ayrı oluşturulup en son olması gereken sıra ile birleştirilmiştir. Bu sıranın neden böyle olması gerektiğine buradan ulaşabilirsiniz. Eminim daha güzel kaynaklar da araştırarak bulabilirsiniz.
//içeriği oluşturduk String content = " HTTP/1.1\r\nHost: dweet.io\r\nConnection: close\r\n\r\n"; //http get metodunu oluştrduk. //content ile birleştirip tcp server' a göndereeğiz sendData = "GET /dweet/for/" + String(thing_name) + valueStr + content; sendData.toCharArray(sendArray, 128); //string veriyi karakter dizisine çevirdik Serial.println(sendData); //gönderilen veriyi gördük wifi.send((const uint8_t*)sendArray, strlen(sendArray)); //tcp server a gönder
Şimdi sıra geldi freeboard.io’ daki dashboard’ ımızı düzenlemeye. Üyelik açtıktan sonra bir dashboard oluşturun. Daha sonra resimlerdeki adımları takip etmeniz yeterlidir. Data source’ ü daha kendisi bulabilmesi için Arduino’ daki yazılımı en az bir sefer çalıştırmış ve veri başarılı bir şekilde soket ile iletilmiş olmalıdır. Aksi taktirde data source kısmından nesne isminizi girsenizde widget’ larda JSON formatındaki veriyi göremezsiniz.
Özetle Arduino ile verileri internet üzerinde bu tür verileri görüntülemek bu kadar kolay. Yazılımın tamamına buradan ulaşabilirsiniz.
Şimdi sıra geldi kendi oluşturduğunuz tcp server’ ınıza Arduino ile nasıl veri göndereceğinize değinelim. Bunun için öncelikle bir TCP Server kurmuş olmalısınız. Ben server’ ı NodeJs kullanarak oluşturdum. Siz farklı framework’ ler yada programlama dilleri ile oluşturabilirsiniz. Bir fark olmayacaktır. Nodejs kısmındaki yazılıma buradan ulaşabilirsiniz. Bağlantı şeması aşağıdaki resimdeki gibidir. Üstteki çizime ek olarak ortak Anot RGB Led eklenmiştir.
Yapacağımız uygulamada Arduino DHT11′ den gelen verileri TCP Server’ e gönderecek TCP Server ise Arduino’ ya RGB led parlaklık bilgilerini rasgele üretip gönderecektir. Server bağlanma kısmına kadar freeboard için verdiğimiz örnek ile aynı olduğundan onlara tekrar değinmeyeceğim. Aşağıda DHT11′ den veriyi okuyup gönderilecek veri formatını oluştuşturduk. Sunucu bizim olduğu ve parse işlemlerini biz yapacağımız için veriyi istediğiniz formatta gönderip alabilirsiniz. Ben JSON formatına benzeterek göndermeyi tercih ettim.
//2 sn de bir dht11 ' den veri oku if (millis() - lastTime > 2000) { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); } else { //veriyi json formatına çevir sendData = "{ temp : " + String(t) + " , hum : " + String(h) + " }"; Serial.println(sendData); //debug } lastTime = millis(); }
Daha sonra bu verileri sokete yazalım. Bu kısımda soketin kapanma durumunda tekrar bağlanması için ufak bir ek yaptım. Eğer send fonskiyonu false değer dönmüşse veri sokete yazılamamış demektir.
//DHT' den alınan veriyi sokete yaz if (!wifi.send((const uint8_t*)hello, strlen(hello))) { //soket kapandı ise tekrar bağlan wifi.createTCP(HOST_NAME, HOST_PORT); }
Şimdi sıra geldi server’ ın gönderdiği verileri okumaya. Soketten verileri okumak için ESP8266 kütüphanesinin recv isimli fonksiyonunu kullandık. Bu fonksiyon 3. parametre olarak timeout değeri alır. Bu değeri siz değiştirebilirsiniz.
uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000); //soketten veri geliyorsa oku if (len > 0) { //eğer veri rgb> ile başlıyorsa rgb datasıdır parse işlemine geç if (strncmp((char*)buffer, "rgb>", 3) == 0) { ledParser((char *)buffer); } //tampondaki veriyi debug etmek için yorum satırını kaldırın /* Serial.print("Received:["); for (uint32_t i = 0; i < len; i++) { Serial.print((char)buffer[i]); } Serial.print("]\r\n");*/ }
Bu konunda sonuna geldik. TCP client yazılımının tamına buradan ulaşabilirsiniz. Umarım hatamız olmamıştır.
İyi çalışmalar..
Elinize sağlık. Hobi olarak geliştireceğim bir iki proje için başlangıç oldu detaylı yazınız.
Hocam selamlar. Regulator kullanmadan bağlantı yapmanın bir yolu yok mu? Cihaz çalışamıyor. Sadece fw flashlayabildim. Çoğu videoda kırmızı led ile beraber mavi LED de yanıyor fakat bende sadece mavi çalışıyor o da bazı durumlarda. Saygılar…
Merhaba, regülator kullanmadan bağlantı yapmaktan kastınızı anlamadım ki konu içerisinde regülatör kullanılmamakta. daha açık olursanız yardımcı olmaya çalışırım. ESP8266 üzerinde mavi led haberleşme olduğu zaman yanan leddir. Normal durumlarda mavi led zaten yanmaz. İyi çalışmalar dilerim…
ıyı gunler hocam direnç kullanmak şartmi.arduino Nanoyla direk bağlayamazmiyız gerilim bölücü kullanmadan.
Merhaba, Arduino 5V ile çalışan bir mikrodenetleyicidir. ESP8266 ise 3.3V ile çalışır. Gerilim bölücü aradaki bağlantıyı 3.3V’ a indirmeye yarar. Kullanmazsanız da çalışacaktır. Lakin ESP8266′ ya zarar verebilirsiniz. Size tavsiyem gerilim bölücü olmadan kullanmayın. İyi çalışmalar dilerim…
Can you provide full proper code
Hi, You can access full code from this link.
ESP kullanarak hem veri almak hemde veri göndermek mümkün müdür ?
aynı esp modülü üzerinden
Merhaba, ESP8266 Bluetooth modülü gibi bir haberleşme modülü değil. Veri iletmek yada almak için Wi-Fi standartlarındaki haberleşme protokollerini kullanmalısınız. Bunlar TCP, UDP gibi websoketlerdir. Yada doğrudan http kullanarak da haberleşebilirsiniz. Bunların hepsi çift yönlüdür. Yani aynı anda hem veri alıp hem veri gönderebilirsiniz. Ancak haberleşmenin efektifliği sizin yazılım ve algoritma bilginize de bağlıdır. Çünkü web protokolleri çok basit olmayan haberleşme protokolleridir. İyi çalışmalar dilerim…