ESP8266-01 ile iki ledi kablosuz bağlantıdan kumanda projesi

Bu projede iki led lambanın veya iki rölenin WiFi üzerinden kumanda edilmesi uygulanacaktır.

Tekrar olmaması için ESP8266-01’in nasıl programlanacağı burada anlatılmayacaktır. Ancak programlamayı bu yazımızda bulabilirsiniz.

Aşağıdaki resimdeki gibi bağlantıları yapın. Besleme geriliminin 3,3 volt olmasına dikkat edin. USB modülünün gücü ESP01’i beslemeye yetmez ise başka bir güç kaynağı kullanmak gerekebilir.

Bu bağlantı ile modülün seri porttan gönderdiği mesajlar Arduino IDE’sinden görülür. Mesajlardan modülün IP adresini öğrenebilirsiniz. Bu programda sabit IP adresi kullanılmaktadır. Sabit IP adresi var olan sisteme göre ayarlanmalıdır. Dolayısıyla IP adresi için Arduino IDE’ye bağlantı gereği yoktur. IP adresini internet tarayıcısının adres satırına girerek modülle bağlantı kurup butonlar kullanılabilir. Arduino IDE ile haberleşecek bağlantının başka yararı, varsa hatayı düzeltecek bilgiler alınabilmesidir. Geliştirme tamamlanınca aşağıdaki gibi bağlantı yaparak modülü bağımsız kullanabilirsiniz.

/*********
  Bu projede iki led kablosuz ağdan kumanda edilir  
*********/

// Wi-Fi kütüphanesini yüklenmesi
#include <ESP8266WiFi.h>

// Sizin ağ özelliklerine göre değiştirin
const char* ssid = "Kablosuz ağ adı";
const char* password = "Kablosuz ağ şifresi";

// Sunucu port numarası 80'e ayarlanır
WiFiServer server(80);

// Bağlantının sabit IP ile yapılması için ayarlar (Kendi ağınıza göre düzenleyiniz)
IPAddress staticIP(192,168,1,116);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0); 

// HTTP isteklerini için değişken tanımı
String header;

// Çıkışların durumlarını kaydedecek değişkenler
String output5State = "off";
String output4State = "off";

// Çıkış değişkenlerine pin numarası atanması
const int output5 = 0;
const int output4 = 2;

// Geçerli zaman
unsigned long currentTime = millis();
// Önceki zaman
unsigned long previousTime = 0;
// Bekleme süresinin mili saniye cinsinden ayarlanması (örnek: 2000ms = 2s)
const long timeoutTime = 2000;

void setup() {
  Serial.begin(115200);
  // Pinlerin çıkış olarak ayarlanması
  pinMode(output5, OUTPUT);
  pinMode(output4, OUTPUT);
  // Çıkışların düşük olarak ayarlanması
  digitalWrite(output5, LOW);
  digitalWrite(output4, LOW);

  // Wi-Fi ağına SSID ve password ile bağlanma
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.config(staticIP, gateway, subnet);  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Web server IP adresinin seri porttan yazdırılması
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop() {
  WiFiClient client = server.available();  // Gelen istemci için dinleme

  if (client) {                     // Eğer yeni bir istemci varsa,
    Serial.println("New Client.");  // Seri porttan bir mesaj verilir
    String currentLine = "";        // İstemciden gelenleri tutmak için değişken tanımlanır
    currentTime = millis();
    previousTime = currentTime;
    while (client.connected() && currentTime - previousTime <= timeoutTime) {  // loop while the client's connected
      currentTime = millis();
      if (client.available()) {  // Eğer istemciden okunan bayt varsa,
        char c = client.read();  // Bir bayt oku, sonra
        Serial.write(c);         // Seri porttan yazdır
        header += c;
        if (c == '\n') {  // Eğer bayt yeni satır işareti ise 
          // Eğer gelen satır boşsa, ozaman iki yeni satır işareti alınır.
          // Bu, istemci HTTP isteğinin sonudur, bu nedenle bir yanıt gönderin:
          if (currentLine.length() == 0) {
            // HTTP başlıkları her zaman bir yanıt koduyla başlar (HTTP/1.1 200 OK gibi)
            // ve istemcinin ne geleceğini bilmesini sağlayacak bir içerik türü, ardından boş bir satır:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();

            if (header.indexOf("GET / HTTP/1.1") >= 0) {

              // HTML web sayfasını görüntüle
              client.println("<!DOCTYPE html><html>");
              client.println("<head><meta name=\"viewport\" charset=\"UTF8\" content=\"width=device-width, initial-scale=1\">");
              client.println("<link rel=\"icon\" href=\"data:,\">");
              // Açma/kapama düğmelerini biçimlendirmek için CSS kodları
              // Tercihlerinize uyacak şekilde arka plan rengi ve yazı tipi boyutu niteliklerini değiştirmekten çekinmeyin
              client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
              client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");
              client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
              client.println(".button2 {background-color: #FF0000;}</style></head>");

              // Web sayfası başlığı
              client.println("<body><h1>ESP8266 Web Server</h1>");
              client.println("<p>GPIO durumu</p>");
              
              if (output5State=="off"){
              client.println("<p id=\"dugme1\">LED1: <button class=\"button\" onclick=btn(\"LED1on\")>ON</button></p>");
              } 
              else {
              client.println("<p id=\"dugme1\">LED1: <button class=\"button button2\" onclick=btn(\"LED1off\")>OFF</button></p>");
              }
              
              if (output4State=="off"){
              client.println("<p id=\"dugme2\">LED2: <button class=\"button\" onclick=btn(\"LED2on\")>ON</button></p>");
              } else {
              client.println("<p id=\"dugme2\">LED2: <button class=\"button button2\" onclick=btn(\"LED2off\")>OFF</button></p");
              }
              client.println("<p></p>");
              client.println("<script>");
              client.println("function btn(str) {");
              client.println("var istek = new XMLHttpRequest();");

              client.println("istek.open(\"GET\", \"dosya.php?q=\" + str, true);");
              client.println("istek.send();");
              client.println("istek.onreadystatechange = function() {");
              client.println("if (this.readyState == 4 && this.status == 200) {");
              client.println("var donus=this.responseText.trim();");
              client.println("switch(donus){");
              client.println("case \"LED1on\" :");
              client.println("document.getElementById(\"dugme1\").innerHTML = 'LED1: <button class=\"button button2\" onclick=btn(\"LED1off\")>OFF</button>';");
              client.println("break;");
              client.println("case \"LED1off\" :");
              client.println("document.getElementById(\"dugme1\").innerHTML = 'LED1: <button class=\"button\" onclick=btn(\"LED1on\")>ON</button>';");
              client.println("break;");
              client.println("case \"LED2on\" :");
              client.println("document.getElementById(\"dugme2\").innerHTML = 'LED2: <button class=\"button button2\" onclick=btn(\"LED2off\")>OFF</button>';");
              client.println("break;");
              client.println("case \"LED2off\" :");
              client.println("document.getElementById(\"dugme2\").innerHTML = 'LED2: <button class=\"button\" onclick=btn(\"LED2on\")>ON</button>';");
              client.println("break;}}}");
              client.println("setTimeout(btn, 1000, \"ghi\");}");
              client.println("setTimeout(btn, 1000, \"ghi\");");
              client.println("</script></body></html>");

              // HTTP yanıtı başka bir boş satırla sona eriyor
              client.println();
            }
            
            // GPIO'ları açıp ve kapatılması
            
            if (header.indexOf("LED1on") >= 0) {
              Serial.println("GPIO 5 on");
              output5State = "on";
              digitalWrite(output5, HIGH);
              client.println("LED1on");
            } else if (header.indexOf("LED1off") >= 0) {
              Serial.println("GPIO 5 off");
              output5State = "off";
              digitalWrite(output5, LOW);
              client.println("LED1off");
            } else if (header.indexOf("LED2on") >= 0) {
              Serial.println("GPIO 4 on");
              output4State = "on";
              digitalWrite(output4, HIGH);
              client.println("LED2on");
            } else if (header.indexOf("LED2off") >= 0) {
              Serial.println("GPIO 4 off");
              output4State = "off";
              digitalWrite(output4, LOW);
              client.println("LED2off");
            }

            // While döngüsünden çıkın
            break;
          } else {  // eğer yeni bir satır aldıysa, o zaman currentLine'ı temizlenir
            currentLine = "";
          }
        } else if (c != '\r') {  // eğer satır başı karakterinden başka bir karakter varsa,
          currentLine += c;      // onu currentLine'ın sonuna ekle
        }
      }
    }
    // Header değişkenini temizle
    header = "";
    // Bağlantıyı kapat
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}

Share your love

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir