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.
8 Comments
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?
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.
Ş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
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.
#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
Hocam bu kod içerisinde bir label yok ki. Siz buton şeklinde yapmak istiyorsunuz sanırım. Doğru mu anladım?
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.
İletişim sayfası altından gönderebilirsiniz. Orada tüm bilgilerim mevcut.