ESP8266 NodemCU Web Server Kurulumu

spooker42

Üye
Katılım
19 Ağu 2019
Mesajlar
23
Puanları
1
Yaş
33
Değerli hocalarım, ESP8266 ile WebServer üzerinden çalışmak zorunda olan bir röle konrol ve voltaj sensörü ekranı kurmam gerekiyor.(internette BLYNK ile yapıyor herkes.)Bunları internetten edindiğim kodlarla ayrı ayrı kurabiliyorum, hatta voltaj sensörü kodlarını DHT11 sensör ile birleştirerek kurup çalıştırdım. WebServer mantığını oturtamadım bir türlü çok karışık bu konuda yardımcı olur musunuz?

Röle kontrol için kullanmak istediğim kod için kullandığım kaynak:
https://randomnerdtutorials.com/esp8266-relay-module-ac-web-server/

Kod:
/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-relay-module-ac-web-server/
 
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

// Import required libraries
#include "ESP8266WiFi.h"
#include "ESPAsyncWebServer.h"

// Set to true to define Relay as Normally Open (NO)
#define RELAY_NO    true

// Set number of relays
#define NUM_RELAYS  5

// Assign each GPIO to a relay
int relayGPIOs[NUM_RELAYS] = {5, 4, 14, 12, 13};

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

const char* PARAM_INPUT_1 = "relay"; 
const char* PARAM_INPUT_2 = "state";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 3.0rem;}
    p {font-size: 3.0rem;}
    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
    .switch {position: relative; display: inline-block; width: 120px; height: 68px}
    .switch input {display: none}
    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 34px}
    .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 68px}
    input:checked+.slider {background-color: #2196F3}
    input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}
  </style>
</head>
<body>
  <h2>ESP Web Server</h2>
  %BUTTONPLACEHOLDER%
<script>function toggleCheckbox(element) {
  var xhr = new XMLHttpRequest();
  if(element.checked){ xhr.open("GET", "/update?relay="+element.id+"&state=1", true); }
  else { xhr.open("GET", "/update?relay="+element.id+"&state=0", true); }
  xhr.send();
}</script>
</body>
</html>
)rawliteral";

// Replaces placeholder with button section in your web page
String processor(const String& var){
  //Serial.println(var);
  if(var == "BUTTONPLACEHOLDER"){
    String buttons ="";
    for(int i=1; i<=NUM_RELAYS; i++){
      String relayStateValue = relayState(i);
      buttons+= "<h4>Relay #" + String(i) + " - GPIO " + relayGPIOs[i-1] + "</h4><label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"" + String(i) + "\" "+ relayStateValue +"><span class=\"slider\"></span></label>";
    }
    return buttons;
  }
  return String();
}

String relayState(int numRelay){
  if(RELAY_NO){
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "";
    }
    else {
      return "checked";
    }
  }
  else {
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "checked";
    }
    else {
      return "";
    }
  }
  return "";
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  // Set all relays to off when the program starts - if set to Normally Open (NO), the relay is off when you set the relay to HIGH
  for(int i=1; i<=NUM_RELAYS; i++){
    pinMode(relayGPIOs[i-1], OUTPUT);
    if(RELAY_NO){
      digitalWrite(relayGPIOs[i-1], HIGH);
    }
    else{
      digitalWrite(relayGPIOs[i-1], LOW);
    }
  }
 
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP8266 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  // Send a GET request to <ESP_IP>/update?relay=<inputMessage>&state=<inputMessage2>
  server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    String inputParam;
    String inputMessage2;
    String inputParam2;
    // GET input1 value on <ESP_IP>/update?relay=<inputMessage>
    if (request->hasParam(PARAM_INPUT_1) & request->hasParam(PARAM_INPUT_2)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      inputParam = PARAM_INPUT_1;
      inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
      inputParam2 = PARAM_INPUT_2;
      if(RELAY_NO){
        Serial.print("NO ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], !inputMessage2.toInt());
      }
      else{
        Serial.print("NC ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], inputMessage2.toInt());
      }
    }
    else {
      inputMessage = "No message sent";
      inputParam = "none";
    }
    Serial.println(inputMessage + inputMessage2);
    request->send(200, "text/plain", "OK");
  });
  // Start server
  server.begin();
}
 
void loop() {

}

Burda da voltaj sensörü için kullandığım kaynak kod
Kod:
// Bu kısmı kendi kablosuz ag bilgileriniz ile degistirin!
const char* ssid = "ASUS_B0";
const char* password = "Galatasaray42";

// Web server'ı 80 portunda baslatiyoruz.

WiFiServer server(80);
int offset =20;// set the correction offset value
void setup() {
  // Robojax.com voltage sensor
  Serial.begin(115200);
}

void loop() {
  int volt = analogRead(D4);// read the input
  double voltage = map(volt,0,1023, 0, 2500) + offset;// map 0-1023 to 0-2500 and add correction offset
 
  voltage /=100;// divide by 100 to get the decimal values
  Serial.print("Voltage: ");
  Serial.print(voltage);//print the voltge
  Serial.println("V");

delay(500);
}
 
Şöyle düşün;
mesela bir internet sayfasına baglanmak istediginde adres çubuguna göreceginiz sitenin adresini veya ip nosunu yazarsınız ve o site size index sayfasını gösterir.
Esp de aynı şekilde bu index sayfasını esp nin içine gömerseniz ve esp ye baglanırsanız aynı şekilde esp de webserver olarak çalışarak size index sayfası olarak içine gömdüklerinizi gönderecek vede sanki bir web sayfası görür gibi aynı şekilde göreceksiniz.
Buradaki asıl sorun esp modulun ip adresine baglı oldugu modemin dışında başka bir yerden baglanmaya çalıştıgınızda modeminizden port yönlendirme yaparak uzaktan gelen baglantı isteklerini esp ye yönlendirmeniz gerekir.
 
En basitinden başlaman gerek. Web server adres çubuğundaki parametrelere göre atama yapar. Aşağıdaki örnekte adres çubuğuna ip/led_yak yazar entera basarsan ledi yakar, ip/led_sondur yazar enter yaparsan ledi söndürür. Bunu anlarsan aynı satırda çoklu parametre yerine ayrı ayrı sayfalar çağırarak işini görürsün.

C++:
//#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = "WIFI_ADI";
const char* password = "WIFI_SIFRESI";

ESP8266WebServer server(80);

void setup() {
  pinMode(LED_BUILTIN,OUTPUT);

  WiFi.mode(WIFI_STA); 
  WiFi.begin(ssid, password); 

  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }     
  digitalWrite(LED_BUILTIN, HIGH);

  server.on("/led_yak",[](){        //  ip_adresi/led_yak
    digitalWrite(LED_BUILTIN,LOW);
    server.send(200,"text/html","<center><h1><LED YANDI!</h1>");
  });
  server.on("/led_sondur",[](){        //  ip_adresi/led_sondur
    digitalWrite(LED_BUILTIN,HIGH);
    server.send(200,"text/html","<center><h1><LED SONDU!</h1>");
  });
  server.begin();

}

void loop() {

}
 
Şöyle düşün;
mesela bir internet sayfasına baglanmak istediginde adres çubuguna göreceginiz sitenin adresini veya ip nosunu yazarsınız ve o site size index sayfasını gösterir.
Esp de aynı şekilde bu index sayfasını esp nin içine gömerseniz ve esp ye baglanırsanız aynı şekilde esp de webserver olarak çalışarak size index sayfası olarak içine gömdüklerinizi gönderecek vede sanki bir web sayfası görür gibi aynı şekilde göreceksiniz.
Buradaki asıl sorun esp modulun ip adresine baglı oldugu modemin dışında başka bir yerden baglanmaya çalıştıgınızda modeminizden port yönlendirme yaparak uzaktan gelen baglantı isteklerini esp ye yönlendirmeniz gerekir.
Hocam Teşekkür ederim öncelikle. Esp webserver olarak çalışıyor ve atadığı ip adresinden giriş yaparak index ulaşıyorum. Hatta sabit IP kullandığım için port yönlerdirmeside yapabiliyorum. İki farkı kod iki farklı webserver kütüphanesi kullanıyor onu çözemedim.
En basitinden başlaman gerek. Web server adres çubuğundaki parametrelere göre atama yapar. Aşağıdaki örnekte adres çubuğuna ip/led_yak yazar entera basarsan ledi yakar, ip/led_sondur yazar enter yaparsan ledi söndürür. Bunu anlarsan aynı satırda çoklu parametre yerine ayrı ayrı sayfalar çağırarak işini görürsün.

C++:
//#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = "WIFI_ADI";
const char* password = "WIFI_SIFRESI";

ESP8266WebServer server(80);

void setup() {
  pinMode(LED_BUILTIN,OUTPUT);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }    
  digitalWrite(LED_BUILTIN, HIGH);

  server.on("/led_yak",[](){        //  ip_adresi/led_yak
    digitalWrite(LED_BUILTIN,LOW);
    server.send(200,"text/html","<center><h1><LED YANDI!</h1>");
  });
  server.on("/led_sondur",[](){        //  ip_adresi/led_sondur
    digitalWrite(LED_BUILTIN,HIGH);
    server.send(200,"text/html","<center><h1><LED SONDU!</h1>");
  });
  server.begin();

}

void loop() {

}
Hocam teşekkür ederim öncelikle. Sorunum biraz da bu adres satırından müdahele edemem çünkü tek ben kullanmayacağım. iki farkı kod farklı kütüphane kullandığı için mi ben iki kodu birleştiremiyorum, tek sayfada. Birleştirilebilir mi?
 
Ben sana olayın nasıl işlediğini anlaman için bu örneği gönderdim aynısın kullanman gerekmiyor. Örneğin aşağıdaki kodu eklersen ip adresini girdiğin anda çıkacak iki linkten birisi ledi yakar diğeri söndürür.

C++:
  server.on("/",[](){
    server.send(200,"text/html","<center><a href = \"/led_yak\">LED YAK</a><br><a href = \"/led_sondur\">LED SONDUR</a>");
  });
 
Ben sana olayın nasıl işlediğini anlaman için bu örneği gönderdim aynısın kullanman gerekmiyor. Örneğin aşağıdaki kodu eklersen ip adresini girdiğin anda çıkacak iki linkten birisi ledi yakar diğeri söndürür.

C++:
  server.on("/",[](){
    server.send(200,"text/html","<center><a href = \"/led_yak\">LED YAK<br><a href = \"/led_sondur\">LED SONDUR");
  });
şimdi anladım hocam ben sizi sayfadaki butonada bsatığım zamanda adres satırı değişiyor zaten. ben tek sayfada değiştiğini varsayıyordum hep.
 
Mikroişlemcilerle yapılan webserver lar normal serverlar gibi sadece sayfa göstermez işlemciye istediğin herşeyi yaptırabilirsin. Sadece adres satırını değiştirmen yeterli
 

Forum istatistikleri

Konular
127,956
Mesajlar
913,902
Kullanıcılar
449,606
Son üye
rasit.

Yeni konular

Çevrimiçi üyeler

Geri
Üst