Esp8266 โหมด Station และโหมด Access Point



 Esp8266 โหมด Station และโหมด Access Point

ต้องทำให้โหมด Station สามารถใช้งานได้ก่อน ดูคลิปย้อนหลัง

โค้ด ESP8266 ในโหมด AP และ Station Mode ต่างกันอย่างไร

เข้าใจง่าย ๆ คือ

โหมด AP (Access Point): ESP8266 จะทำหน้าที่เป็นจุดกระจายสัญญาณ Wi-Fi เอง

เหมือนเราสร้าง Wi-Fi Hotspot ขึ้นมาเอง อุปกรณ์อื่นๆ (เช่น มือถือ, คอมพิวเตอร์) 

จะมาเชื่อมต่อกับ ESP8266 ได้โดยตรง

โหมด Station: ESP8266 จะทำหน้าที่เป็นลูกข่าย (Client) ที่ต้องไปเชื่อมต่อกับ Wi-Fi 

ที่มีอยู่แล้ว (เช่น Router ที่บ้าน) เพื่อเข้าถึงอินเทอร์เน็ต

ความแตกต่างในระดับโค้ด:

โหมด AP: เหมาะสำหรับสร้างเครือข่ายขนาดเล็ก เช่น ควบคุมอุปกรณ์ภายในบ้าน โดยไม่ต้องเชื่อมต่อ 

กับอินเทอร์เน็ต หรือสร้างจุดเชื่อมต่อ Wi-Fi ชั่วคราว

โหมด Station: เหมาะสำหรับเชื่อมต่อ ESP8266 เข้ากับอินเทอร์เน็ต เพื่อส่งข้อมูลไปยัง Cloud 

หรือควบคุมอุปกรณ์ผ่านอินเทอร์เน็ต


A.การกำหนดให้ บอร์ด esp8266 เปลี่ยนจากโหมด Station to Access Point

1.ตั้งค่า ssid และ password สำหรับรองรับการเชื่อมต่อ

const char* ssid     = "ESP8266-AP";

const char* password = "12345678";

2.กำหนดค่า AP ด้วยคำสั่ง

  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();

  Serial.print("AP IP address: ");

  Serial.println(IP);

แทนที่คำสั้งเดิมใน void setup()

  WiFi.begin(ssid, password);

  Serial.println("Connecting to WiFi");

  while (WiFi.status() != WL_CONNECTED) {

    delay(1000);

    Serial.println(".");

  }

  // Print ESP8266 Local IP Address

  Serial.println(WiFi.localIP());

  

3.scan Wifi และเปลี่ยน wifi ของ PC ให้เป็น 

"ESP8266-AP" password = "12345678"

4.scan Wifi และเปลี่ยน wifi ของมือถือ ให้เป็น 

"ESP8266-AP" password = "12345678"

5.ดูค่าอุณหภมิและความชื่น ที่ http://192.168.4.1/ 

ทั้งพีซีและมือถือ




B.การกำหนดให้ บอร์ด esp8266 เปลี่ยนจาก wifi เป็นเชื่อมต่อมือถือ

แก้ไขในส่วนเชื่อมต่อ 

1. ตั้งค่าชื่อ Hotpot ในมือถือ และรหัสผ่าน 

ตามด้านล่าง

"myhotpot" รหัสผ่าน "12345678"


2.เปลี่ยนโค้ดการเชื่อมต่อ เป็น

const char* ssid = "myhotpot";

const char* password = "12345678";

3.เปลี่ยน wifi ของ PC ให้เป็น 

"myhotpot" รหัสผ่าน "12345678" 

เพื่อทดสอบการทำงานทั้งพีซีและมือถือ

//complete code

// Import required libraries

#include <Arduino.h>

#include <ESP8266WiFi.h>

#include <Hash.h>

#include <ESPAsyncTCP.h>

#include <ESPAsyncWebServer.h>

#include <Adafruit_Sensor.h>

#include <DHT.h>


// Replace with your network credentials

//const char* ssid = "Nui 2.4G";

//const char* password = "0895515998";

const char* ssid = "myhotpot";

const char* password = "12345678";

//const char* ssid     = "ESP8266-AP";

//const char* password = "12345678";

#define DHTPIN 5     // Digital pin connected to the DHT sensor


// Uncomment the type of sensor in use:

//#define DHTTYPE    DHT11     // DHT 11

#define DHTTYPE    DHT22     // DHT 22 (AM2302)

//#define DHTTYPE    DHT21     // DHT 21 (AM2301)


DHT dht(DHTPIN, DHTTYPE);


// current temperature & humidity, updated in loop()

float t = 0.0;

float h = 0.0;

float f = 0.0;

float hic = 0.0;

float hif = 0.0;

// Create AsyncWebServer object on port 80

AsyncWebServer server(80);


// Generally, you should use "unsigned long" for variables that hold time

// The value will quickly become too large for an int to store

unsigned long previousMillis = 0;    // will store last time DHT was updated


// Updates DHT readings every 10 seconds

const long interval = 3000;  


const char index_html[] PROGMEM = R"rawliteral(

<!DOCTYPE HTML><html>

<head>

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

  <style>

    html {

     font-family: Arial;

     display: inline-block;

     margin: 0px auto;

     text-align: center;

    }

    h2 { font-size: 3.0rem; }

    p { font-size: 3.0rem; }

    .units { font-size: 1.2rem; }

    .dht-labels{

      font-size: 1.5rem;

      vertical-align:middle;

      padding-bottom: 15px;

    }

  </style>

</head>

<body>

  <h2>ESP8266 DHT Server</h2>

  <p>

    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 

    <span class="dht-labels">Temperature</span> 

    <span id="temperature">%TEMPERATURE%</span>

    <sup class="units">&deg;C</sup>

  </p>

  <p>

    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 

    <span class="dht-labels">Temperature</span> 

    <span id="temperaturef">%TEMPERATUREF%</span>

    <sup class="units">&deg;F</sup>

  </p>

  <p>

    <i class="fas fa-thermometer-half" style="color:#ff7043;"></i> 

    <span class="dht-labels">Heat Index</span> 

    <span id="hic">%HIC%</span>

    <sup class="units">&deg;C</sup>

  </p>

  <p>

    <i class="fas fa-thermometer-half" style="color:#ff7043;"></i>   

    <span class="dht-labels">Heat Index</span> 

    <span id="hif">%HIF%</span>

    <sup class="units">&deg;F</sup>

  </p>


  <p>

    <i class="fas fa-tint" style="color:#00add6;"></i> 

    <span class="dht-labels">Humidity</span>

    <span id="humidity">%HUMIDITY%</span>

    <sup class="units">%</sup>

  </p>



</body>

<script>

setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("temperature").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/temperature", true);

  xhttp.send();

}, 10000 ) ;


setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("temperaturef").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/temperaturef", true);

  xhttp.send();

}, 10000 ) ;


setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("humidity").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/humidity", true);

  xhttp.send();

}, 10000 ) ;


setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("hic").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/hic", true);

  xhttp.send();

}, 10000 ) ;

setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("hif").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/hif", true);

  xhttp.send();

}, 10000 ) ;


</script>

</html>)rawliteral";


// Replaces placeholder with DHT values

String processor(const String& var){

  //Serial.println(var);

  if(var == "TEMPERATURE"){

    return String(t);

  }

  else if(var == "TEMPERATUREF"){

    return String(f);

  }

  else if(var == "HUMIDITY"){

    return String(h);

  }

  else if(var == "HIC"){

    return String(hic);

  }    

  else if(var == "HIF"){

    return String(hif);

  }    


  return String();

}


void setup(){

  // Serial port for debugging purposes

  Serial.begin(115200);

  dht.begin();

  

  WiFi.begin(ssid, password);

  Serial.println("Connecting to WiFi");

  while (WiFi.status() != WL_CONNECTED) {

    delay(1000);

    Serial.println(".");

  }

  // 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);

  });

  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", String(t).c_str());

  });

  server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", String(f).c_str());

  });


  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", String(h).c_str());

  });


  server.on("/hic", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", String(hic).c_str());

  });

  server.on("/hif", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", String(hif).c_str());

  });


  // Start server

  server.begin();

}

 

void loop(){  

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {

    // save the last time you updated the DHT values

    previousMillis = currentMillis;

    // Read temperature as Celsius (the default)

  float newT = dht.readTemperature();

  float newF = dht.readTemperature(true);

  if (isnan(newT)) {

      Serial.println("Failed to read from DHT sensor!");

    }else {

      t = newT;

      Serial.println(t);

      f = newF;

      Serial.println(f);

    }

    // Read Humidity

    float newH = dht.readHumidity();

    float newHIF = dht.computeHeatIndex(newF, newH);

    float newHIC = dht.computeHeatIndex(newT, newH, false);      

    // if humidity read failed, don't change h value 

    if (isnan(newH)) {

      Serial.println("Failed to read from DHT sensor!");

    }else{

      h = newH;

      Serial.print("newH:");

      Serial.println(h);

      hif = newHIF;

      Serial.print("newHIF:");      

      Serial.println(hif);

      hic = newHIC;      

      Serial.print("newHIC:");      

      Serial.println(hic);      

    }

  }

}

///////////////////////////

Reference:

https://www.embedded-robotics.com/esp8266-wifi/


Playlist:

Nodemcu,Esp8266,Esp32

https://www.youtube.com/playlist?list=PLa7GH7az0Vb2IMg1GSMnVq92M1uvVBNO8

Arduino uno,nano

https://www.youtube.com/playlist?list=PLa7GH7az0Vb2ODrMfl3rYzeZPAnjuH4WS


ความคิดเห็น