ESP8266 ile Server üzerinde RGB Led Kontrolü

ESP8266 RGB Led Server

Bir önceki NodeMCU ile DHT11 Kullanımı yazımda da belirttiğim gibi ESP8266 kullanarak bir şeyler öğrenmeye devam ediyorum. Bu yazımda ise Arduino‘muza bağlı olan ESP8266 modülü ile server üzerinden, bizim vermiş olduğumuz değerler ile yanacak bir RGB led kontrolü yapacağız.

İnternetteki bir çok kaynaktan bulabileceğiniz server kurma kodlarını yazarak vakit kaybetmek istemiyorum. Ben öncelikle RGB ledim için küçük bir renk fonksiyonu yazarak başlamak istiyorum.

https://gist.github.com/erenkeskin/5ad3207a1ee6db9bb609123233d29951

Bu kodları gerekli yerlere yerleştirdikten sonra geriye sadece RGB led’imiz için değer göndermek kalıyor. Unutmayın! RGB bacaklarınızı PWM sinyali veren pinlere takmalısınız.

Serverdan değerleri almamız için ben GET methodunu kullandım. Sanırım POST methodu ile de yapılabiliyor ama henüz o konuda net bir bilgiye ulaşamadığım için GET methodunu kullandım. Bunun için öncelikle bir HTML formu içerisinde değerler ile göndermemiz gerekli. Gönderme işleminin ardından sayfa adresi “/kirmizi=90&yesil=130&mavi=240” gibi bir hal alıyor. Bizim yapmamız gereken ise bu satırdan sayısal verileri alarak integer’a çevirmek ve ardından bu integer değerleri renkAyarla() fonksiyonuna göndererek ledi yakmak.

C’de URL parçalamak için çok kolay bir yol bulamadım. O yüzden kısmen uzun bir yol izleyerek tek tek parçaladım ve stabil sonuç elde edebildim. Eğer siz daha kısa ve kolay bir yol biliyorsanız benimle paylaşırsanız sevinirim.

Aşağıdaki kodlar ile HTML sayfanızı oluşturup RGB ledinizi kontrol edebilirsiniz.

Loop fonksiyonu içerisinde HTML olarak server yapısı oluşturduğum kod:

https://gist.github.com/e9ded39eaaf7e80900876f5c8650f59b

URL’yi parçalamak (split) ve Led’i yakmak için ise aşağıdaki kodu kullanıyorum.

https://gist.github.com/e3409dd51e52052324916a5d201086b4

Herhangi bir soru ve sorununuz olursa elimden geldiği kadar yardımcı olmaya çalışırım, yorum olarak belirtmeniz yeterli.

“ESP8266 ile Server üzerinde RGB Led Kontrolü” üzerine 8 yorum

  1. Hocam merabalar bu ledin parlaklık değerini sıfır girdiğimizde ledin sönmesi gerekiyor ama küçük bir değer ile yanıyor onun nedeni nedir?

    1. Merhaba hocam,

      Normalde RGB değerleri arasında (0, 0, 0) da bir renk belirtir ve bu siyah renktir. Ama bizim modülümüz o kadar kaliteli bir modül olmadığı için siyahı göremiyoruz ve onun üzerine çok düşük seviyede bir ışık görüyoruz. Bizim yaptığımız iş led parlaklığı ayarını değil de ledin hangi RGB değerlerinde yanmasını sağlamak oluyor aslında.

      1. Şimdi şöyle bişey var ben internetten led kontrol yapıyorum lenin url parçalama kodalarını kullandım ben tek led yaktıgım için mavi ve yesili sildim ama şöyle bir sorun var ben serverdan labele 0 degeri gindirdigimde 2 dönduruyor buda anladigim kadariyla bana dondurdugu degeri parcalarken yani int yaparken sifir bana iki olarak donuyor bunu nasil duzelte bilirim yada bana url parcalama kisminda ne yaptiginizi anlatirsaniz makbule gecer

        1. URL parçalama mantığı, gelen “/kirmizi=54&yesil=254&mavi=64” bu URL’yi ampersand ve eşittir işaretlerine göre ayırarak işlem yapıyor. Tamamen dinamik bir sistem olmadığı için hatayla karşılaşmış olabilirsiniz. Bunun için “esitlik1 + 1, esitlik1 + 4” yerlerindeki artı değerleriyle oynayarak istediğiniz sonuca ulasabilirsiniz diye düşünüyorum. Ya da isterseniz kodunuzu mail olarak gönderin, onun üzerinde denemeler yaparak size geri dönüş yapayım.
          Kolay gelsin.

          1. #define ag_ismi “azyedeinternetal”
            #define ag_sifresi “Aadsaeer2+”
            #define kirmiziPin 6
            void setup()
            {
            Serial.begin(115200); //Seriport’u açıyoruz. Güncellediğimiz
            //ESP modülünün baudRate değeri 115200 olduğu için bizde Seriport’u 115200 şeklinde seçiyoruz
            Serial.println(“AT”); //ESP modülümüz ile bağlantı kurulup kurulmadığını kontrol ediyoruz.
            pinMode(kirmiziPin,OUTPUT);
            delay(3000); //ESP ile iletişim için 3 saniye bekliyoruz.

            if(Serial.find(“OK”)) //esp modülü ile bağlantıyı kurabilmişsek modül “AT” komutuna “OK” komutu ile geri dönüş yapıyor.
            {
            Serial.println(“AT+CWMODE=1”); //esp modülümüzün WiFi modunu STA şekline getiriyoruz. Bu mod ile modülümüz başka ağlara bağlanabilecek.
            delay(2000);
            String baglantiKomutu=String(“AT+CWJAP=\””)+ag_ismi+”\”,\””+ag_sifresi+”\””;
            Serial.println(baglantiKomutu);
            delay(5000);
            }

            Serial.print(“AT+CIPMUX=1\r\n”);
            delay(200);
            Serial.print(“AT+CIPSERVER=1,80\r\n”);
            delay(1000);
            }
            void loop()
            {
            if(Serial.available()>0){ // Serialdan veri geliyor ise
            if(Serial.find(“+IPD,”)){
            String Header;
            Header = “HTTP/1.1 200 OK\r\n”;
            Header += “Content-Type: text/html; charset=utf-8\r\n”;
            Header += “Connection: close\r\n”;

            String HTML;
            HTML = “”;
            HTML += “”;
            HTML += “LED Kontrolu”;
            HTML += “”;
            HTML += “LED Kontrolü.”;
            HTML += “”;
            HTML += “ON OFF“;
            HTML += “Kırmızı: “;
            HTML += “”;
            HTML += “”;
            HTML += “”;
            String cipsend = “AT+CIPSEND=”;
            cipsend +=”0″;
            cipsend +=”,”;
            cipsend += HTML.length();
            cipsend += “\r\n”;
            Serial.print(cipsend);
            delay(500);
            Serial.println(HTML);
            led_yakma(); // alt fonksiyona gidiliyor
            Serial.println(“AT+CIPCLOSE=0″);

            }
            }
            }

            void led_yakma() // ledin yanması için alt fonksiyon
            {
            String gelen =””;
            char serialdenokunan;
            while(Serial.available()>0)
            {
            serialdenokunan = Serial.read();
            gelen +=serialdenokunan;
            if((gelen.indexOf(“:GET /?pin=on”)>1)) //on butonuna basıldığında server adresinde /?pin=on var ise
            {
            analogWrite(kirmiziPin,255);
            }
            if((gelen.indexOf(“:GET /?pin=off”)>1)) // off butonuna basıldığında server adresinde /?pin=off var ise
            {
            analogWrite(kirmiziPin,0);
            }

            int ampersand1 = gelen.indexOf(‘&’);
            int ampersand2 = gelen.indexOf(‘&’, ampersand1 + 1);
            String ilkKisim = gelen.substring(0, ampersand1);
            int esitlik1 = ilkKisim.indexOf(‘=’);
            int kirmiziDeger = ilkKisim.substring(esitlik1 + 1, esitlik1 + 4).toInt();

            if((kirmiziDeger))
            {

            renkAyarla(kirmiziDeger);
            }
            }
            }
            void renkAyarla(int kirmizi)
            {

            analogWrite(kirmiziPin, kirmizi);
            Serial.print(“Kirmizi icin deger: “);
            Serial.println(kirmizi);
            }

            kod bu benim istediğim serverdan labale yazdığım 0 değeri benim ledimi söndürsün istiyorum birde maxsimum kaç yaza biliyorum oraya aslında amacım bir slient yapmak ama şimlik bunu yapsam yeterli

          2. Varda o kısım yoruma düşmemiş o html kodlarının devamında vardı. eğer mail adresinizi verirseniz ben size dosyayı yollarım.

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.