STM32 ve ESP8266 ile ThingSpeak Kullanımı

Merhaba,

Bu konuda STM32 ve ESP8266 kullanarak ThingSpeak üzerinde gerçek zamanlı veri gösterimi uygulaması yapacağız. STM32 olarak çokça tercih edilen STM32F103C8 (BluePill) kullanacağım. Örnek olarak bir sensör olması için DHT11 kullanacağım. STM32 ile ESP8266 arasındaki iletişimi AT komutları ile sağlayacağız. Yani herhangi bir kütüphane kullanmadan olabildiğince basit bir şekilde DHT11 verisini ThingSpeak üzerinde göstermeye çalışacağız.

Öncelikle ThingSpeak ‘ dan biraz bahsedelim. ThingSpeak bir veri görselleştirme ve depolama platformudur. HTTP ve MQTT protokolleri kullanarak veri iletişimine izin verir. Ücretsiz olarak 1 yıl boyunca kullanılabilir. Ancak 1 yıl süre içerisinde en fazla 4 adet kanal oluşturulmasına ve toplamda 3 milyon mesaj gönderilmesine izin verir. Sonrası için yeni hesap oluşturmalı yada ücretli versiyon kullanmalısınız. Ayrıca veri gönderim sıklığı çok fazla değil. Maksimum 15 saniyede bir veri gönderip görselleştirebiliyorsunuz. Hesap oluşturma işlemini bağlantıdan yapabilirsiniz. Hesap oluşturma işleminden sonra öncelikle kanal sonra da görselleştirme için oluşturduğunuz kanala widget eklemelisiniz. İlk olarak kanal oluşturmaya bakalım.

Hesabınıza giriş yaptığınızda üstteki sekmelerden “Channels >> My Channels >> New Channel” yolunu izlemelisiniz. Açılan sayfada kanal oluşturma sayfasında kanal ismi girmek zorunludur. Ayrıca kullanacağınız widget sayısı kadar “Field” aktif etmeliyiz. “Field” lere vereceğimiz isimler sadece görselleştirme amaçlıdır. Biz uygulamamızda iki adet veri görselleştireceğimiz için iki adet “Field” aktif etmeliyiz. Diğer kısımlara çok müdahale etmenize gerek yok. Ayrıca kanalı oluşturduktan sonda da düzenleme yapabilirsiniz. Benim oluşturduğum ayarlar aşağıdaki gibidir.

Kanalı oluşturduğumuzda iki adet boş grafik göreceksiniz. Göndereceğimiz veriler bu grafikler üzerinde gösterilecek. Şimdi bu grafiklere nasıl veri göndereceğimize bakalım. Thingspeak’ a veri gönderebilmek için oluşturduğumuz kanalın “API KEY” ine ihtiyacımız var. Bu API KEY bize kanala erişim için yetki vermektedir. API Key’ e kanalın üstteki sekmelerinden ulaşabilirsiniz.

Biz yapacağımız uygulamada HTTP request ile ThingSpeak ‘ a veri göndereceğiz. Sadece 1 grafiğe veri göndermek için gönderilmesi gereken HTTP request aşağıdaki şekildedir.

GET https://api.thingspeak.com/update?api_key=<API_KEY>&field1=0

Verilen komut içerisinde <API_KEY> ifadesi bulunmakta. Burayı kendi API Key’ iniz ile değiştirerek bir Linux Terminalde bu komutu çalıştırır yada bağlantıdaki gibi bir online HTTP Request gönderme aracı kullanırsanız Field 1 grafiğine 0 değerinin gönderildiğini görebilirsiniz. Aynı anda iki değer göndermek istersek HTTP Request içerisindeki QuerryString’ e Field 2 eklemeliyiz. Bunu da basit olarak şu şekilde gerçekleştirebiliriz.

GET https://api.thingspeak.com/update?api_key=<API_KEY>&field1=20&field2=30

Kullanılan komuttan da görüldüğü üzere gönderim için gerekli HTTP request gayet basit. Şimdi gönderme işlemini STM32 ile yapacağız. Ancak öncelikle bağlantı şemamıza bakalım. Hazırlayacağımız yazılımı aşağıda verilen bağlantı şemasına göre oluşturacağız.

Bağlantı Şeması

Yapacağımız uygulamada sadece ESP8266 ve DHT11 kullanmamız Thingspeak uygulaması için yeterli. Uygulmayı mümkün olduğunca basit olması için başka bir eleman kullanmadım. ESP8266, STM32′ nin UART pinlerine bağlıdır. DHT11 ise herhangi bir GPIO’ ya bağlanabilir. Hazırladığımız uygulamada PB6′ ya bağlıdır. STM32′ ye yapılan bağlantıların CubeMx üzerindeki görüntüsü aşağıda verilmiştir.

Hazırlanan bağlantı şemasında DHT11′ in bağlandığı pine etiket olarak “DHT11” verilmiştir. Bunu sağ tıkladıktan sonra “Enter User Label” özelliği ile verebilirsiniz. Bu şekilde etiket vermek yazılım sırasında kullanımı kolaylaştırmaktadır. Bu sebeple sizin de yapmanızı tavsiye ederim. Bunlara ek olarak burada tanımlanmamış birde Timer bulunmakta. Timer daha önceki DHT11 konusunda verilen ile benzer şekilde ayarlanmıştır. Ancak önceki konuda kullanılan F767′ nin çalışma frekansı F103′ den farklı olduğu için Timer parametreleri farklı ayarlanmış olup, yapılan ayarlamalar aşağıda verilmiştir.

Timer’ ın değerlerinin hesaplanmasına önceki konulardan ulaşabilirsiniz. Burada sadece timer’ in her tick’ inin 1uS’ de bir değişmesi için bu ayarı yaptığımızı söyleyeceğim. Yazılımda mikro saniyelik gecikme vermek için bu Timer’ ı kullanacağız. Şimdi gelelim yazılım kısmına. Yazılımda öncelikle DHT11 değerini okuyacağız. Okuma başarılı bir şekilde gerçekleşmişse ESP8266 ile DHT11 verilerini Thingspeak’ a göndereceğiz. DHT11′ i okumak için kullanacağımız yazılım önceki konudakinin aynısıdır. Bu sebeple o konunun üzerinde fazla durmayacağım. ESP8266 ile gönderme işleminde AT komutları kullanacağımızı daha önce söylemiştik. Şimdi kullanacağımız AT komutlarına bakalım.

AT+CIPSTART="TCP","api.thingspeak.com",80
AT+CIPSEND=<LEN>

Üstte verilen komut Thingspeak sitesi ile TCP bağlantının kurulması için gereklidir. Komutun kullanılmasının Thingspeak sitesine veri gönderebiliriz. Veri gönderim işlemi ikinci satırdaki komutu kullanabiliriz. Bu komutun kullanımı diğerlerine göre biraz daha farklı. Bu komutu kullanırken öncelikle göndereceğimiz verinin karakter olarak uzunluğunu parametre olarak vermeliyiz. Böylece sunucu ona kaç karakter geleceğini bilip işlemleri ona göre yapacaktır. Sonrasında göndermek istediğimiz veriyi gönderebiliriz. Bu işlemin daha iyi anlaşılması için bir şöyle bir örnek verebilirim. Göndermek istediğimiz veri “merhaba” olsun. Bu durumda öncelikle “AT+CIPSEND=6” ESP8266′ ya UART üzerinden göndermeliyiz. Sonrasında ESP8266 bize cevap olarak “>” gönderecektir. Bu cevap geldikten sonra yine UART üzerinden göndermek istediğimiz “merhaba” verisini gönderebiliriz. Böylece “AT+CIPSTART” ile bağlantı kurduğumuz sunucuya merhaba verisini göndermiş oluruz. ESP8266 “>” cevabını genellikle CIPSEND komutundan kısa bir süre sonra gönderir. Biz işlemin karmaşık olmaması için bu geldi mi diye kontrol eden bir yapı kullanmayıp sadece araya bekleme (delay) koyacağız. CIPSTART komutunu göndermek için aşağıdaki gibi bir yazılım kullanabiliriz.

Yazılım

buffLen = sprintf(sendBuff, "AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",80\r\n"); 

HAL_UART_Transmit(&huart1, (uint8_t *)sendBuff, buffLen, 1000);

Hazırlanan yazılımda kullanılan sprintf fonksiyonu C dili için standart bir fonksiyondur. Karakter dizisi içerisine formatlı bir şekilde string kayıt etmekte kullanılır. Kullanımı “printf” ile benzerdir. Sadece parametre olarak ifadeyi konsolda göstermez, değişkene yazdırır. Ayrıca “sprintf” fonksiyonu karakter dizisine atama yaparken, atama yaptığı veri uzunluğunu geri döndürür. Biz bu uzunluk değerini “buffLen” isimli değişkene kayıt ederek, UART üzerinden karakter dizisini gönderme sırasında kullandık.

CIPSEND komutunun gönderilmesi biraz daha karmaşık olacaktır. Bu komutun gönderilmesi için iki ayrı değişken grubunun kullanılması kolaylık sağlamaktadır. Bu değişken gruplarının kullanımı aşağıdaki gibidir.

buffLen = sprintf(sendBuff, "GET /update?api_key=%s&field1=%d&field2=%d\r\n", API_KEY, dhtval[0], dhtval[1]); 

buffLen2 = sprintf(sendBuff2, "AT+CIPSEND=%d\r\n", buffLen);

Yazılımda da görüldüğü üzere “sendBuff” ve “sendBuff2” isimli iki adet değişken tanımlandı. Öncelikle veri uzunluğunu göndermemiz gerektiği için bu şekilde bir yapı kullandık. İlk sprintf fonksiyonu ile sendBuff değişkenine gönderilecek veriyi atıyoruz ve buffLen de bu verinin boyutunu saklıyoruz. Gönderilecek veri boyutu CIPSEND komutunda gerekli olduğu için de bu değişkeni sonraki sprintf fonksiyonu ile birlikte kullanıyoruz. Daha sonra da öncelikle sendBuff2′ yi sonra da sendBuff’ ı UART üzerinden ESP8266′ ya gönderiyoruz ve Thingspeak’ a başarılı bir şekilde veri gönderme işlemini tamamlamış oluyor.

HAL_UART_Transmit(&huart1, (uint8_t *)sendBuff2, buffLen2, 1000); 
HAL_Delay(1000); 
HAL_UART_Transmit(&huart1, (uint8_t *)sendBuff, buffLen, 1000);

 

İki bufffer’ ın gönderimi sırasında araya koyulan 1 saniye gecikme CIPSEND komutundan sonra gelecek olan “>” cevabı içindir. Aslında bu süre sucunun vereceği cevabın gecikmesine bağlı olmakla birlikte genelde daha kısadır. Bu sebeple uygulamanızda isterseniz daha kısa gecikme de kullanabilirsiniz.

Ayrıca Thingspeak kullanmak için önemli bir nokta olarak, Thingspeak’ da veri güncelleme için bir zaman sınırı bulunmaktadır. Bu zaman sınırı 15 saniyede 1 veri şeklindedir. Bundan daha sık veri gönderirseniz bu veriler Thingspeak tarafından reddedilir ve görüntülenmez. Bu sebeple yazılımdaki gönderme işleminden sonra en az 15 saniyelik bir gecikme kullanılmalıdır. Ben hazırladığım uygulamanın sonunda 30 saniye gecikme kullandım. Eğer verilen gecikme sistemin çalışmasını etkiliyorsa, yani o 30 saniyelik süre bekleme süresi içinde başka şeylerin yapılması gerekiyorsa gecikme millis yapısı kullanılarak verilerek bekleme asenkron hale getirilebilir.

Verilenlere ek olarak daha önce anlatmadığım bir konu yok sanırım. Konuyu burada sonlandırıyorum. Yazılımın tamamına bağlantıdan ulaşabilirsiniz.

2 Comments

Add a Comment

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