NODE MCU ESP 8266 + AP CONFIG แบบกดปุ่มตั้งค่า + Blynk SERVER

ไฟล์ 3D ก็สามารถนำมาใส่ได้เหมือนกันครับ เวลาเราคุยปัญหาเรื่อง ใดๆ จะทำให้เห็นภาพมากขึ้น

แม้แต่ ซิมวงจร ก็เอามาวางแล้วซิมดูค่าได้เลย ตอนนี้กำลังดีลอยู่ครับ

every2

อธิบายการทำงาน
อธิบายการทำงาน 4 สถานะด้วยกันดังนี้

  1. Modem Router ทำงาน Node MCU esp 8266 ทำงาน
    image
    สำหรับกรณีนี้จะเป็นกรณีแรกสุดที่จะต้องเป็นไปได้เสมอคือ Modem Router ทำงาน และ Node MCU esp 8266 ทำงาน

  2. Modem Router ทำงาน Node MCU esp 8266 ไม่ทำงาน
    image
    ในกรณีนี้ Node MCU esp 8266 ไม่ทำงาน หมายถึง
    2.1 การถอดปลั๊กจ่ายไฟเลี้ยง Node MCU esp 8266 ออก และเสียบปลั๊กจ่ายไฟเข้าไปใหม่
    2.2 การถอดปลั๊กจ่ายไฟเลี้ยง Node MCU esp 8266 ออกจากที่เดิม และย้ายไปเสียบปลั๊กในที่ใหม่ แต่ยังอยู่ในรัศมีการจ่ายของ WiFi (Modem Router) ตัวเดิม
    การทำงาน เมื่อเสียบปลั๊กจ่ายไฟเลี้ยง เข้าไปใหม่ Node MCU esp 8266 ค้นหา WiFi และนำค่า ssid และ password ที่ได้รับจากการ Auto Config ครั้งแรก นำมาใช้ในการเชื่อมต่อ WiFi และถ้าเชื่อมต่อสำเร็จก็จะเข้าสู่สภาวะการทำงานปกติ แต่ถ้าเชื่อมต่อไม่สำเร็จ ก็จะทำการวนการเชื่อมต่อไปเรื่อยๆ จนกว่าจะสำเร็จ

  3. Modem Router ไม่ทำงาน Node MCU esp 8266 ทำงาน
    image

ในกรณีนี้ Modem Router ไม่ทำงาน หมายถึง

3.1 การถอดปลั๊กจ่ายไฟเลี้ยง Modem Router ออก และเสียบปลั๊กจ่ายไฟเข้าไปใหม่

3.2 การถอดปลั๊กจ่ายไฟเลี้ยง Modem Router ออกจากที่เดิม และย้ายไปเสียบปลั๊กในที่ใหม่ แต่ Node MCU esp 8266 ยังอยู่ในรัศมีการจ่ายของ WiFi (Modem Router) ตัวเดิม

การทำงาน เมื่อเสียบปลั๊กจ่ายไฟเลี้ยง เข้าไปใหม่ Modem Router จะเริ่มทำงานและจ่าย WiFi ออกมา ในขณะที่ Node MCU esp 8266 จะทำการวน การเชื่อมต่อ WiFi (Modem Router) ตัวเดิม ต่อไปเรื่อยๆ จนกว่าจะสำเร็จ

  1. Modem Router ไม่ทำงาน Node MCU esp 8266 ไม่ทำงาน

image
ในความหมายคือ
4.1 มีการถอดปลั๊กจ่ายไฟเลี้ยงออกทั้ง 2 อุปกรณ์ เพื่อย้ายตำแหน่งหรือถอดแล้วเสียบใหม่
4.2 ไฟดับและติดขึ้นมาใหม่
การทำงาน
สำหรับกรณีนี้ เมื่อไฟมา Modem Router จะทำงานก่อน โดยวินาทีที่ XX จะเริ่มปล่อยสัญญาณ WiFi ออกมา ในขณะเดียวกัน Node MCU esp 8266 จะหน่วงเวลาไว้ XX (ตามเวลาที่กำหนดใน code) วินาทีเช่นกัน เพื่อให้ Modem Router ทำงานและปล่อยสัญญาณ WiFi ออกมา และก่อนเมื่อครบ XX วินาที จึงเริ่มทำงานโดยการค้นหาตัว WiFi โดยดึงค่า ssid และ password ที่ได้รับจากการทำ Auto Config ครั้งแรก นำมาเชื่อมต่อวนซ้ำๆกัน จนกว่าจะเชื่อมต่อสำเร็จ ถ้าเชื่อมต่อไม่สำเร็จก็จะมีการวนซ้ำไปเรื่อยๆ จนกว่าจะมีการเชื่อมต่อสำเร็จ

1 Likes

3D บอร์ด ในกระทู้นี้ใช้อะไรเขียนครับ

ผมใช้โปรแกรม sketchup ในการออกแบบครับ เหตุผลที่ใช้ก็คือเราสามารถที่จะรู้จำนวนอุปกรณ์ที่เราต้องใช้พร้อมทั้งขนาดในการที่จะนำไป หาขนาดของเคสที่จะมาใส่อุปกรณ์ใน Project เรา ได้อย่างถูกต้องมีความคลาดเคลื่อนน้อยที่สุด ผมจะทำในลักษณะที่คล้ายๆกับ กระทู้ การใช้ SketchUp ในการออกแบบอุปกรณ์ +ตู้Control +ดึงราคาอุปกรณ์ลง Excel เพื่อทำใบขอราคา เพียงแต่เปลี่ยนลักษณะรูปแบบงานเท่านั้นเอง อ้อ ลืมไปครับในส่วนโปรแกรม sketchup จะมี component ให้เราเก็บอุปกรณ์ที่เราต้องใช้งานบ่อยๆเอาไว้ และสามารถดึงเอามาใช้ได้เลย ซึ่งตอนนี้ผมเก็บรวบรวมเอาไว้ได้ในระดับนึงถ้าสนใจผมจะทำลิ้งโหลดให้นะครับ



สำหรับในความคิดผมเองก็คือการพัฒนาในเรื่องของ Product โดยเฉพาะงาน Micro Controller ที่ทำให้เป็นรูปธรรมจริงๆนั้นหาค่อนข้างที่จะยากเนื่องจากว่าเทคโนโลยีในการผลิตภายในประเทศของเรายังไม่หลากหลายจึงทำให้ต้นทุนในการผลิตค่อนข้างมีราคาสูง ดังนั้นทำให้โอกาสในการประกอบธุรกิจเองจึงเป็นไปด้วยความยุ่งยากและล่าช้า ทำให้บริษัทที่มีทุนมากกว่านำไอเดียที่ได้ไปผลิตและจำหน่ายในราคาทุนที่ต่ำกว่าเรา

1 Likes

โอโห้ ช่วงนี้ผมกำลังจะจับ ซอฟแวร์สักตัวเพื่อทำโปรเจค แล้วก็เอาไว้ทำรีวิวในเว็บให้เห็นภาพมากขึ้น มีเวลาผมรออ่าน กระทู้แนะนำเกี่ยวกับการใช้งาน โปรแกรม sketchup นะครับ ขอบคุณครับ :smiley:

1 Likes


เพราะโดยส่วนใหญ่ผมจะเขียนงาน Stage เป็นหลัก

1 Likes

เอาตามที่พี่รู้เลยครับ เน้นไปทางการทำตู้ควบคุม และการจัดการ ไมโครคอนโทรลเลอร์อย่างที่พี่ได้เกรินไว้ข้างต้น อย่างเช่น ทริกในการบริหารจัดการอุปกรณ์ พอผมได้คอนเซบ ผมจะเอามาต่อยอด ออกเป็นเนื้อหาอื่นๆ ต่อไปครับ ผิด ถูก ไม่ได้ซีเรียสนะครับ เน้นลงมือทำ ช่วยๆ กันครับ 55

1 Likes

ได้ครับ https://eleceasy.com นี่ OK จริงๆ ยังไงผิดถูกก็ช่วยกันแก้ไข นะครับ ในเรื่องของงาน มีแค่ รู้ กับไม่รู้ เท่านั้นครับ

UPDATE Wiring diagram NODE MCU ESP 8266 + AP CONFIG แบบกดปุ่มตั้งค่า + Blynk SERVER
ประกอบด้วย

  1. แสดงสถานะ ระดับสัญญาณ WiFi
  2. แสดงสถานะ inter net ว่า ON หรือ OFF แบบง่าย
  3. แสดงสถานะการเชื่อมต่อ Blynk Server
  4. ปุ่มกด AP Config ตั้งค่า การเชื่อมต่อ WiFi
  5. ปุ่มกด Reset MCU เพื่อเริ่มทำงานใหม่
1 Likes
//*********************************************************************************************
//NodeMCU V2 จะมี LED อยู่ 2 ตัวคือบนชิพ ESP8266 (D4) และบนบอร์ด (D0)
//NodeMCU V3 จะมี LED อยู่ 1 ตัวคือบนชิพ ESP8266 (D4) ซึ่งไม่มีบนบอร์ดเหมือน V2
//เลือกบอร์ดเป็น NodeMCU 1.0 ความเร็วอัพโหลดจะเป็น 115200 และ LED_BUILTIN จะเป็น D0
//*********************************************************************************************


#include <ESP8266WiFi.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/esp8266/Arduino
#include <ESP8266WebServer.h>             //โหลดไลบารี่ ..มาใช้งาน
#include <WiFiManager.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/tzapu/WiFiManager
#include <FS.h>                           //โหลดไลบารี่ ..มาใช้งาน                        //this needs to be first, or it all crashes and burns...
#include <DNSServer.h>                    //โหลดไลบารี่ ..มาใช้งาน
#include <ArduinoJson.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/bblanchon/ArduinoJson
#include <BlynkSimpleEsp8266.h>           //โหลดไลบรารี่ของ BLYNK ..มาใช้งาน



//------------------------------------------------------------------------------------------------

#define BLYNK_DEBUG
#define BLYNK_PRINT Serial        // Comment this out to disable prints and save space
#define D0 16                     // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน
#define D3 0                     // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้

#define D7 13                     //เชคสัญญาณ Internet เชคระดับสัญญาณ WiFi

#define D4 2                     //เชคระดับสัญญาณ WiFi 0-30%
#define D5 14                    //เชคระดับสัญญาณ WiFi >=50%
#define D6 12                    //เชคระดับสัญญาณ WiFi >=60%


//------------------------------------------------------------------------------------------------
long rssi;
int rssiled;
//------------------------------------------------------------------------------------------------


//LED แสดงสถานะ Internet โดยแนวคิดคือ วนลูป loop ให้ ESP8266 ติดต่อ www.google.co.th ไปเรื่อยๆ LED ก็จะติด แสดงว่า Internet มา
const char* host = "www.google.co.th";    //ต้องการให้ส่งการติดต่อไปยัง Website นี้


//-------------------------------------------------------------------------------------------------------------------------------------------

int blynkIsDownCount = 0;                                     //Integer Variable ตัวแปรชื่อ blynkIsDownCount ใช้เก็บเลขจำนวนเต็ม โดยเริ่มต้นให้มีค่า = 0
char blynk_token[34] = "4562002066be4943xxx9f7exxx6d27a4";    //ใส่ Blynk token ของเราที่ Blynk ส่งมาทาง Email ตอนที่เรา Create Project ใหม่
//Character Variable ตัวแปรที่ใช้เก็บอักขระ
bool shouldSaveConfig = false;

//-------------------------------------------------------------------------------------------------------------------------------------------

BlynkTimer timer;  //เรียกใช้การตั้งเวลาของ Blynk
//ฟังชั่นเปิดใช้งาน BlynkTimer ซึ่งทำหน้าที่คล้าย ๆ interrupt timer หมายถึงเมื่อครบเวลาตามที่กำหนดไว้โปรแกรมหลักจะกระโดด
//ไปทำงานในโปรแกรมตอบสนองที่กำหนดไว้
//กรณีนี้จะนำฟังชั่นที่เปิดใช้งาน BlynkTimer ไปใช้ในการ เชื่อมต่อซ้ำ (reconnecting)
//โดยรูปแบบคำสั่ง คือ timer.setInterval(30000L, reconnecting); อยู่ใน void setup

//-------------------------------------------------------------------------------------------------------------------------------------------


//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
//-------------------------------------------------------------------------------------------------------------------------------------------


//***********สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้
char server[] = "oasiskit.com";
int port = 8080;
//***************************************************************



//*****************************************************************************************************
//*******************************       void setup        *********************************************
//*****************************************************************************************************

void setup() {

  //****************************************************************************************************

  pinMode(D0, OUTPUT);//กำหนดโหมดใช้งานให้กับขา D0 เป็นขา สัญญาณไฟ ในสภาวะต่างๆ
  pinMode(D3, INPUT_PULLUP);//กำหนดโหมดใช้งานให้กับขา D3 เป็นขา กดปุ่ม ค้าง เพื่อตั้งค่า AP config
  pinMode(D4, OUTPUT);
  pinMode(D5, OUTPUT);
  pinMode(D6, OUTPUT);
  pinMode(D7, OUTPUT);

  // ให้ LED ทั้งหมดดับก่อน
  digitalWrite(D0, LOW);//ให้หลอด LED สีฟ้าดับก่อน
  digitalWrite(D4, LOW);
  digitalWrite(D5, LOW);
  digitalWrite(D6, LOW);
  digitalWrite(D7, LOW);

  //***************************************************************************************************

  Serial.begin(115200);

  //*************************    การ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP8266   ************

  //read configuration from FS json
  Serial.println("mounting FS...");//แสดงข้อความใน Serial Monitor

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");//แสดงข้อความใน Serial Monitor

    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");//แสดงข้อความใน Serial Monitor
      File configFile = SPIFFS.open("/config.json", "r");

      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");//แสดงข้อความใน Serial Monitor
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");//แสดงข้อความใน Serial Monitor
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");//แสดงข้อความใน Serial Monitor
  }
  //end read

  //*************************   จบการ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP8266   ***************









  //**************************        AP AUTO CONNECT   **************************************************

  WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 34);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  wifiManager.addParameter(&custom_blynk_token);

  for (int i = 5; i > 0; i--) {
    digitalWrite(D0, HIGH);
    delay(500);
    digitalWrite(D0, LOW);
    delay(500);
    Serial.print (String(i) + " ");//แสดงข้อความใน Serial Monitor



  }


  if (digitalRead(D3) == LOW) {
    digitalWrite(D0, LOW);
    Serial.println("Button Pressed");//แสดงข้อความใน Serial Monitor
    wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้


    // wifiManager.autoConnect(); ใช้สร้างชื่อแอคเซสพอยต์อันโนมัติจาก ESP + ChipID

    if (!wifiManager.autoConnect("PUYIOT AP CONFIG")) {
      Serial.println("failed to connect and hit timeout");//แสดงข้อความใน Serial Monitor
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.reset();
      delay(5000);

    }
  }



  Serial.println("connected........:)");//แสดงข้อความใน Serial Monitor
  strcpy(blynk_token, custom_blynk_token.getValue());


  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");//แสดงข้อความใน Serial Monitor
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["blynk_token"] = blynk_token;
    File configFile = SPIFFS.open("/config.json", "w");

    if (!configFile) {
      Serial.println("failed to open config file for writing");//แสดงข้อความใน Serial Monitor
    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

  //**************************    จบ    AP AUTO CONNECT   **************************************************




  Serial.println("local ip"); //แสดงข้อความใน Serial Monitor
  delay(100);
  Serial.println(WiFi.localIP());//แสดงข้อความใน Serial Monitor
  // Blynk.config(blynk_token);////เริ่มการเชื่อมต่อ Blynk Server แบบปกติ
  Blynk.config(blynk_token, server, port);
  ////เริ่มการเชื่อมต่อ Blynk Server*********สำหรับ Server local ที่แจกให้ เพิ่ม, server, port  แค่นี้จบ



  timer.setInterval(30000L, reconnecting);  //Function reconnect
  //ตั้งเวลาส่งข้อมูลให้ Blynk Server ทุกๆ 30 วินาที
  //มาจากฟังชั่นเปิดใช้งาน BlynkTimer ซึ่งทำหน้าที่คล้าย ๆ interrupt timer หมายถึงเมื่อครบเวลาตามที่กำหนดไว้โปรแกรมหลักจะกระโดดไปทำงานในโปรแกรมตอบสนองที่กำหนดไว้
  // (1) ชื่อออฟเจคไว้อ้างอิง (ผู้ใช้งานตั้งชื่อเองในที่นี้ตั้งคำว่า "timer")
  // (2) กำหนดค่าช่วงเวลาที่ให้บอร์ดกระโดดไปทำงานในโปรแกรมตอบสนอง ในที่นี้กำหนดเป็น 30000L หมายถึงให้บอร์ดมาทำงานในโปรแกรมตอบสนองทุก ๆ 30 วินาที
  // (3) ชื่อโปรแกรมตอบสนอง (ฟังก์ชั่นย่อย)  ในที่นี้ตั้งชื่อว่า reconnecting  ซึ่งบอร์ดจะวนมาทำงานฟังก์ชั่นชื่อนี้ทุก ๆ เวลาที่กำหนด (ทุกๆ 30 วินาที)







}


//*****************************************************************************************************
//*******************************     จบ  void setup        *********************************************
//*****************************************************************************************************









//*****************************************************************************************************
//*******************************     void loop       *************************************************

void loop() {

for (int i = 20; i > 0; i--) {
  //--------------------------------------------------------------------------------------------------------

  rssi = WiFi.RSSI();
  rssiled = ((((rssi * 100) / -127) - 100) * -1);// ทำให้เป็น % ความแรงของ WiFi จะดูง่ายกว่า
  //Blynk.virtualWrite(V5, ( ((rssi * 100) / -127) - 100) * -1);   // ทำให้เป็น % ความแรงของ WiFi จะดูง่ายกว่า

  //เชคระดับสัญญาณ WiFi >= 60%
  if (rssiled >= 60  ) {
    digitalWrite(D6, HIGH);

  } else  {
    digitalWrite(D6, LOW);

  }
  //เชคระดับสัญญาณ WiFi >= 50%
  if (rssiled >= 50  ) {
    digitalWrite(D5, HIGH);

  } else  {
    digitalWrite(D5, LOW);

  }
  //เชคระดับสัญญาณ WiFi 0-30%
  if (rssiled >= 30  ) {
    digitalWrite(D4, HIGH);


  } else  {
    digitalWrite(D4, LOW);
  }


  //delay(50);
  yield();

  //--------------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------------

if (Blynk.connected())
{
  Blynk.run();// ถ้าเชื่อมต่ Blynk Server ได้-----ไฟ LED สีน้ำเงินบนบอร์ด จะติดค้าง

  digitalWrite(D0, HIGH); //หลอด LED สีน้ำเงินที่ บอร์ด MCU esp8266 ติดค้างแสดงว่า WiFi ใช้งานได้



  //-----// ถ้าเชื่อมต่ Blynk Server ไม่ได้-----ไฟ LED สีน้ำเงินบนบอร์ด จะกระพริบ---------------------------------
  //----//หลอด LED สีแดงติดกระพริบแสดงว่ากำลังค้นหา WiFi ----------------------------------------------------

} else {

  digitalWrite(D0, LOW);
  delay(200);
  digitalWrite(D0, HIGH);
  delay(100);

}
//--------------------------------------------------------------------------------------------------------







timer.run();//ให้เวลาของ Blynk ทำงาน

delay(100);
}



//----------------------------------------------------------------------------------------------------------------------------
//เพื่อป้องกันไม่ให้ มีการติดต่อ ถี่เกินไป จะกำหนดให้ วน loop ปกติเป็นจำนวน n ครั้ง ตัวอย่าง i=100 จะวน 100 รอบปกติก่อน แล้วจึงมาที่  WiFiClient client; 1 ครั้ง
//Client เป็นการกำหนดให้ ESP8266 ทำหน้าที่เป็นเครื่องลูกข่าย โดยเชื่อมต่อไปยังเครื่องแม่ข่ายด้วยไอพีแอดเดรสและพอร์ตที่กำหนดไว้เพื่อขอใช้บริการนั้นๆ
//WiFiClient(); คือ การประกาศสร้าง object ของ WifiClient
//เป็นฟังก์ชั่นสำหรับสั่งให้ ESP8266 เชื่อมต่อกับ Server ด้วย URL และ Port
//host = สำหรับกำหนด URL ของ Server ที่ต้องการเชื่อมต่อ host
//port = สำหรับกำหนด Port ที่ Server เปิดรับอยู่ 80

  WiFiClient client;
  if (client.connect(host, 80))
  {
    //Serial.println("connected");
    digitalWrite(D7, HIGH);
    client.stop();
    delay(100);

  }
  else {
    //Serial.println("connection failed!");
    digitalWrite(D7, LOW);
    client.stop();
  }
  
  delay(100);
}

//*******************************   จบ  void loop     *************************************************
//*****************************************************************************************************









//--------------------------------------------------------------------------------------------------------
void reconnecting()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
  }
}
//--------------------------------------------------------------------------------------------------------


BLYNK_CONNECTED()
{


  Blynk.syncAll();//ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
  //Serial.println(".");//per debug  //แสดงข้อความใน Serial Monitor
}

Code เอาไว้ลองใช้งานดูครับ

ต่อไป ถ้าเราจะเอาอุปกรณ์อะไรมาต่อ ก็เพิ่มลงไปใน Code ได้เลย จะเห็นว่า port GPIO เราใช้ไปเกือบหมดแล้ว ดังนั้น เราต้องใช้ PCF8574 GPIO Extender มาต่อขยาย Port อีกที จากนั้น เอาอุปกรณ์ Module มาลงเพิ่ม เข้าไป

คลิป อธิบาย

1 Likes

พี่ใช้ โปรแกรมอะไร ออกแบบ ภาพครับ ดูโปรดีนะครับ 555

Power Point ครับ อิ…อิ…

ดูไม่ออกว่าเป็น Power Point เลยนะครับ สวยงาม และดูโปร เลยทีเดียว

อย่างนั้นเลยเหรอครับ ผมอยากสื่อให้มันดูง่าย นะครับ โปรแกรมอื่น ดูแล้ววิชาการมาก ผมพอดูออกนะ แต่เวลาผมจะเอามาสื่อ ก็อยากให้มันง่ายๆ ครับ
:grin:

ดูแล้วเข้าใจง่ายดีครับพี่ ผมส่วนมากใช้ไปเรื่อย กำลังมองหาโปรแกรมประจำ อยู่เหมือนกัน เอาไว้ ทำภาพประกอบบทความไว้ลงในเว็บ ครับ

1 Likes

ภาพตรงส่วนนี้ ผมแนะนำพี่นิดนึง พี่จะเห็นว่าภาพที่พี่ลงนั้นตกขอบทางด้านขวาอยู่
พี่สามารถใช้ peview ลดขนาดลง จาก 100% เป็นสัก 75% มันจะดึงภาพให้พอดี ลองดูครับ

ขอบคุณมากครับ :sweat_smile:

บทความดีๆ ผมก็อยากให้มันออกมาสมบูรณ์มากที่สุดครับ :smile:

eleceasy.com web นี้ขอเป็นสมาชิก เจ้าประจำครับ

1 Likes

ยินดีครับพี่ ขับเครื่องมันไปด้วยกันครับ ผมจะพยายามทำให้เว็บมันเกิดประโยชน์กับทุกคนให้ได้มากที่สุดครับ