Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - spider28

#2
เอาโจทย์มาจาก Facebook น่ะครับ

อยากให้esp8266สองตัวสื่อสารกันได้.โดยตัวแรกเป็น input แล้วส่งให้ตัวที่สองแสดงผลเป็น output
--->วิธีการแบบนี้เขาเรียกว่าอะไรครับ.เผื่อผมไปดู google ต่อ. ขอบคุณนะครับ.^^. (มือใหม่ครับ)

พอจะจับใจความได้ว่า
ให้ตัวนึงเป็น AP Mode
อีกตัวเป็น Static Mode


==================================================
ผมลองตีโจทย์แบ่งเป็น AP Server และ client

Esp8266 AP Server
-AP MODE
-LED

กำหนดให้ AP Server  เป็นโหมด AP สามารถรัน port 80 หรือทำเป็น Http server ควบคุม LED ด้วย API ได้
การทดสอบ http://IP-Address/?stage=1


Esp8266 Client
-Static mode
-API GET

ตัว Client ก็กำหนดให้ connec wifi เหมือนกับทั่วๆไป เป็นโหมด Static จากนั้นก็ให้มันไป get ค่าจาก server ครับ

การ get ข้อมูลบน Protocal TCP port 80 ไม่ใช้เป็นการดึงข้อมูลเพียงอย่างเดียว มันคือการ ส่งค่าขึ้นไปยังปลายทาง และรับค่าตอบกลับมา

=============================
Link Youtube

https://youtu.be/v3O11mppptc

https://youtu.be/DiWlVcmRoJQ
=============================

Code AP Server [Master]

//  http://IP_Address/?state=1

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const int led = 2;

/* Set these to your desired credentials. */
const char *ssidAP = "ESPap";
const char *passwordAP = "esp@thai";

ESP8266WebServer server(80);
//***************************************//
///////////////////////////////////////////
//***************************************//
void setup()
{
  delay(1000);
  Serial.begin(115200);

  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
 
  ConfigAPmode();
  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");
}
//***************************************//
///////////////////////////////////////////
//***************************************//
void loop()
{
  server.handleClient();

}
//***************************************//
///////////////////////////////////////////
//***************************************//
void handleRoot() {
//  server.send(200, "text/html", "<h1>You are connected</h1>");

  int state = server.arg("state").toInt();
  digitalWrite(led, state);
 
  server.send(200, "text/plain", String("LED is now ") + ((state)?"on":"off"));
}
//***************************************//
void ConfigAPmode()
{
  Serial.println();
  Serial.println("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.softAP(ssidAP, passwordAP);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  Serial.println("=======================");
}



Code Client

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = "ESPap";
const char* password = "esp@thai";

ESP8266WebServer server(80);
//***************************************//
///////////////////////////////////////////
//***************************************//
void setup()
{
  delay(1000);
  Serial.begin(115200);

  SetMode();
  Conect_WiFi();
 
}
//***************************************//
///////////////////////////////////////////
//***************************************//
void loop()
{
  httpGET( "0" );
  delay(2000);
  httpGET( "1" );
  delay(2000);
}
//***************************************//
///////////////////////////////////////////
//***************************************//
void SetMode(void)
{
  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  //WiFi.mode =>  WIFI_AP_STA OR  WIFI_STA
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(1000);
 
  Serial.println("Setup Mode done");
  Serial.println("=======================");
}

void Conect_WiFi(void)
{
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("");
  delay(1000);
 
  Serial.println("Esp8266 End Conect WiFi");
  Serial.println("=======================");
}



Funtion API get

void httpGET(String var) {
    static const char* host   = "192.168.4.1";

    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
    }

    // We now create a URI for the request
    String url = "/?state=";
    url += var;

//    Serial.print("Requesting URL: ");
//    Serial.println(url);

    // This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
}

#4
ขอบคุณครับ
#6
ถ้าหากหมายถึงตอนไฟตก มันรีบูตและ connect  wifi เองครับใช้งานได้ปกติครับ

และผมลองทดสอบ สั่ง reboot router ตัวมันก็กลับมา Connect ได้ครับ
แต่ในส่วนนี้ยังไม่ 100% ครับ

#7
ตอนนี้เชื่อว่าหลายคนคงไม่มีใครไม่รู้จักเจ้า ESP8266
แต่ถ้าถามกลับว่ารู้แค่ไหน ก็จะบอกไม่ได้
ส่วนตัวผมเองเริ่มศึกษามันก็ปีกว่าๆ ลองผิดบ้างถูกบ้าง
ตั้งแต่ V01 ,V12 ,V13

V01 ถ้าไม่รู้จักมันได้ จะดียิ่งนัก



ปัญหาที่เจอล่าสุดและเจ็บที่สุด คือ โปรแกรมให้มัน คอนเน็ต wifi ทั่วๆไป
แต่มันดันรบกวน สัญญาณ โดยที่คอมผมเองไม่สามารถมองเห็น wifi ตัวอื่นๆได้เลย
สงสัยตั้งนานว่า คอมเป็นอะไร หา wifi ไม่เจอ

V12 รุ่นนี้ใช้ดีมาก แต่ต้องใช้ร่วมกับ doggle ของมัน



จากการเขียนโปรแกรม ลองผิดลองถูก ทุกคนจะเจอปัญหา WDT
WDT หากมันเกิดรีบูตตัวเองก็ไม่มีปัญหา แต่หากมันค้างไม่ทำงานเลยหล่ะ
สาเหตุเท่าที่หาข้อมูล เหมือนกับตัวมันเองถูกขัดจังหวะ ผิด
ลองทดสอบสั่ง Serail.print ไม่ต้องมี delay ไม่ถึง 1 นาที ค้างครับ

ถาม:มันเหมาะแล้วหรือที่จะนำมาใช้ในชีวิตประจำวัน
ตอบ:เหมาะครับ เพียงแค่เราควรเลี่ยงการทำให้เกิด WDT โดยการเขียนโปรแกรมให้ clean และให้เหมาะกับคุณภาพของมันครับ

ต้องรู้ว่า ESP8266 มันทำงานได้ระดับไหน
สมมุติว่า สั่งให้ ESP8266 มันรันตลอดเวลา ทุก 10 วินาที มันต้องทำงาน
ไม่เคยสั่งให้มันพัก ไม่มีคำสั่งให้มันพักผ่อน แล้วจะเหลือหรือครับ
เหมือนสั่งให้คนไปวิ่งตลอดเวลา ไม่ให้พัก ไม่ให้หยุด หากคนที่ไม่พร้อม ก็ทำไม่ได้



มาดูวิธีใช้งานเบื้องต้น ตามหัวข้อกันครับ



ผมใช้บอร์ด Arduino UNO ในการ Flash Program ให้กับ ESP8266
"แต่ผมไม่ได้เขียนโปรแกรมลงไปใน ATmega328 น่ะครับ"
บอร์ด Arduino UNO มันจะมี IC ATmega16U4 ทำหน้าที่ในการ  Flash Program ก็ใช้ประโยชน์จากมันเลย
เมื่อต่อวงจรเรียบร้อยแล้ว โปรแกรมแรกที่ Flash Program คือ Blink ขา 13 เทสได้เลยครับ



รูปนี้เป็นการจับจองการใช้งานขา ESP8266 สำหรับวิธีผมเองครับ




ใครที่ใช้ โฟโต้บอร์ด ลองต่อตามวงจรนี้ได้ครับ




รูปนี้ทดสอบรัน 30 ชั่วโมง ถ้าหาก ESP8266 รีบูต Conectoin ก็จะกลายเป็น 0 นับใหม่
อยากทดสอบนานกว่านี้แต่ หอพัก ไฟตกบ่อย
ESP8266 ไม่ได้รัน หน้าเว็บตัวนี้น่ะครับ ผมใช้ Linkit เป็น Server และให้ ESP8266 เป็น Client


ผมเขียนโปรแกรมด้วย Arduino IDE 1.6.5


จากข้อมูลข้างต้น เป็นความเห็นส่วนตัวน่ะครับ หากผิดพลาดอะไรก็ขออภัยด้วยครับ



#8
ขอบคุณครับ

;D ;D ;D