วันพุธที่ 1 มิถุนายน พ.ศ. 2559

แนะนำตัว

ผมนายพงศ์ศาสตร์  ผาดไธสง B5601639 กำลังศึกษาอยู่ชั้นปริญาตรี สาขาวิศวกรรมคอมพิวเตอร์ มหาวิทยาลัยเทคโนโลยีสุรนารี



วันอังคารที่ 31 พฤษภาคม พ.ศ. 2559

Week01 Arduino Basic

Week01 Arduino Basic

 

 

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

 

อุปกรณ์ที่ต้องใช้ 
1. Arduino Board รุ่นใดก็ได้    1    ea
2. NoteBook หรือ Pc 1 เครื่อง
3. Jump Wire (สายไฟ แบบมีขาและรูเสียบ)  10  ea
4. สายจ่ายไฟเลี้ยงให้กับ Board Arduino
5. สวิทซ์แบบ Pulse   1  ea



มาเริ่มทำความรู้จักกับ Arduino ดีกว่า

Arduino คืออะไร
             Arduino อ่านว่า (อา-ดู-อิ-โน่ หรือ อาดุยโน่) เป็นบอร์ดไมโครคอนโทรเลอร์ตระกูล AVR ที่มีการพัฒนาแบบ Open Source คือมีการเปิดเผยข้อมูลทั้งด้าน Hardware และ Software ตัว บอร์ด Arduino ถูกออกแบบมาให้ใช้งานได้ง่าย ดังนั้นจึงเหมาะสำหรับผู้เริ่มต้นศึกษา ทั้งนี้ผู้ใช้งานยังสามารถดัดแปลง เพิ่มเติม พัฒนาต่อยอดทั้งตัวบอร์ด หรือโปรแกรมต่อได้อีกด้วย
             ความง่ายของบอร์ด Arduino ในการต่ออุปกรณ์เสริมต่างๆ คือผู้ใช้งานสามารถต่อวงจรอิเล็กทรอนิคส์จากภายนอกแล้วเชื่อมต่อเข้ามาที่ขา I/O ของบอร์ด (ดูตัวอย่างรูปที่ 1) หรือเพื่อความสะดวกสามารถเลือกต่อกับบอร์ดเสริม (Arduino Shield) ประเภทต่างๆ (ดูตัวอย่างรูปที่ 2) เช่น Arduino XBee Shield, Arduino Music Shield, Arduino Relay Shield, Arduino Wireless Shield, Arduino GPRS Shield เป็นต้น มาเสียบกับบอร์ดบนบอร์ด Arduino แล้วเขียนโปรแกรมพัฒนาต่อได้เลย

จุดเด่นที่ทำให้บอร์ด Arduino เป็นที่นิยม
-  ง่ายต่อการพัฒนา มีรูปแบบคำสั่งพื้นฐาน ไม่ซับซ้อนเหมาะสำหรับผู้เริ่มต้น
-  มี Arduino Community กลุ่มคนที่ร่วมกันพัฒนาที่แข็งแรง
-  Open Hardware ทำให้ผู้ใช้สามารถนำบอร์ดไปต่อยอดใช้งานได้หลายด้าน
-  ราคาไม่แพง
-  Cross Platform สามารถพัฒนาโปรแกรมบน OS ใดก็ได้  



ส่วนประกอบของ Board Arduino (UNO)




1.USBPort: ใช้สำหรับต่อกับ Computer เพื่ออับโหลดโปรแกรมเข้า MCU และจ่ายไฟให้กับบอร์ด
2.Reset Button: เป็นปุ่ม Reset ใช้กดเมื่อต้องการให้ MCU เริ่มการทำงานใหม่
3.ICSP Port ของ Atmega16U2 เป็นพอร์ตที่ใช้โปรแกรม Visual Com port บน Atmega16U2
4. I/OPort:Digital I/O ตั้งแต่ขา D0 ถึง D13 นอกจากนี้ บาง Pin จะทำหน้าที่อื่นๆ เพิ่มเติมด้วย เช่น Pin0,1 เป็นขา Tx,Rx Serial, Pin3,5,6,9,10 และ 11 เป็นขา PWM 
5.ICSP Port: Atmega328 เป็นพอร์ตที่ใช้โปรแกรม Bootloader
6. MCU: Atmega328 เป็น MCU ที่ใช้บนบอร์ด Arduino
7. I/OPort: นอกจากจะเป็น Digital I/O แล้ว ยังเปลี่ยนเป็น ช่องรับสัญญาณอนาล็อก ตั้งแต่ขา A0-A5
8.Power Port: ไฟเลี้ยงของบอร์ดเมื่อต้องการจ่ายไฟให้กับวงจรภายนอก ประกอบด้วยขาไฟเลี้ยง +3.3 V, +5V, GND, Vin
9. Power Jack: รับไฟจาก Adapter โดยที่แรงดันอยู่ระหว่าง 7-12 V
10. MCU ของ Atmega16U2 เป็น MCU ที่ทำหน้าที่เป็น USB to Serial โดย Atmega328 จะติดต่อกับ Computer ผ่าน Atmega16U2





รูปแบบการเขียนโปรแกรมบน Arduino




1. เขียนโปรแกรมบนคอมพิวเตอร์ ผ่านทางโปรแกรม ArduinoIDE
2. หลังจากที่เขียนโค้ดโปรแกรมเรียบร้อยแล้ว ให้ผู้ใช้งานเลือกรุ่นบอร์ด Arduino ที่ใช้และหมายเลข Com port






3. กดปุ่ม Verify เพื่อตรวจสอบความถูกต้องและ Compile โค้ดโปรแกรม จากนั้นกดปุ่ม Upload โค้ด โปรแกรมไปยังบอร์ด Arduino ผ่านทางสาย USB เมื่ออับโหลดเรียบร้อยแล้ว จะแสดงข้อความแถบข้างล่าง “Done uploading” และบอร์ดจะเริ่มทำงานตามที่เขียนโปรแกรมไว้ได้ทันที



นี่คือตัวอย่างโค๊ดทำการ Blink LED บน บอร์ด ARDUINO


// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}




วิดีโอตัวอย่าง อ้างอิงจาก https://www.youtube.com/watch?v=dnPPoetX0uw






ต่อไปเป็นตัวอย่างการควบคุมการใช้ GPIO ของ Arduino ทดสอบค่า INPUT ด้วยสวิทซ์


// the setup function runs once when you press reset or power the board
void setup() {

Serial.begin(9600);
  // initialize digital pin 13 as an output.
  pinMode(2, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {

  if(digitalRead(2)== HIGH){
    Serial.println("1");
  }else{
    Serial.println("0");
  }
}



ลองดูที่ผลลัพท์ ที่รูปแว่นขยาย  แล้วปรับ 9600 baud  จากนั้นลอง กด สวิชท์ดู

จะเห็นว่ามีการเปลี่ยนค่าจาก 0 --> 1 เพราะมีการ รับข้อมูลเข้ามา



แบบทดสอบสำหรับผู้มีความสงสัย + ท้าทาย  

แบบทดสอบ

ลองทำการ เปิด-ปิด LED (PIN 13) ด้วย สวิทซ์ 


     

วันจันทร์ที่ 30 พฤษภาคม พ.ศ. 2559

Week02 Arduino Shield

Week02 Arduino Shield

 

เป้าหมาย
ทำให้เข้าใจเรื่อง ของ Shield มากขึ้นสามารถนำ Shield มาใช้ประโยชน์กับ Arduino ได้อย่างหลากหลาย 


อุปกรณ์
- Arduino Board รุ่น UNO หรือ Duemilanove
- Tick Tock Shield



มาทำความรู้จักกับ Shield กันก่อน

Shield นี้มีความหมายมาจากคำว่า "โล่" ซึ่งเป็นสิ่งที่เป็นฉากหน้าไว้กันสิ่งต่างๆ และ Shield ในที่นี้ก็มีความหมายคล้ายกัน แต่จะมีความสามารถมากว่านั้น มันสามารถ เสริมความสามารถให้กับสิ่งที่ใช้งานมันได้ เช่น Tick Tock Shield,Adafruit Shield,Sparkfun Shield,Maker Shed เป็นต้น


มาลองลุยกันเลยดีกว่า 

เป้าหมาย
1. ทำให้ไฟวิ่งจากซ้ายไปขวา(d4 -> d1) และจากขวาไปซ้าย (d1 -> d4)
2. ทำให้สามารถควบคุมไฟ ได้จากสวิทซ์ on Board
3. สั่งให้ นับ เลข

ขั้นตอน 
1. นำ Tick Tock Shield มาประกอบเข้ากับ Arduino Board
2. เสียบสายอัพโหลดข้อมูล เข้ากับ Arduino และ Computer
3. เขียนและอัพโหลดโค๊ด


ข้อ 1.



ผลการทดสอบ










ข้อ 2.


ผลการทดสอบ






ข้อ 3.

  

ผลการทดสอบ

วันอาทิตย์ที่ 29 พฤษภาคม พ.ศ. 2559

Week03 LabView Interface from Arduino via VISA

ทำไฟ LED 8 ดวงแบบมีการควบคุม ON/OFF

JOB 1/3: Relay Control 2 Relay

 

 

เป้าหมาย
ให้ใช้โปรแกรม Labview เปิด/ปิด LED ได้

 

อุปกรณ์
บอร์ด Arduino V.Duemilanove  1  ea
LED  8  ea
สายไฟ  10  ea

 

 

ขั้นตอน
 1. เขียนโปรแกรมอัพโหลดลงบอร์ด Arduion ver.Duemilanove เพื่อควบคุมการรับข้อมมูลจาก INPUT

กดดูซอสโค๊ด (Click to see Source Code)




2. จากนั้นก็เปิด Labview 2010 เพื่อสร้าง UI ในการทดสอบ





3.  กำหนดเงื่อนไขการรับข้อมูลต่างๆในแต่ละดวง LED



 

4.  หลังจากนั้นก็ต่อ วงจร ตามที่ได้กำหนดไว้ในข้อ 1.







5. ทำการทดสอบด้วยโปรแกรม LabView 2010 


 


วิดีโอ

MISSION COMPLETE LOL

 

  #########################################

 

 

   การบันทึกข้อมูลการนับ ด้วย EEPROM

JOB 2/3: Counter Display on LabVIEW



  
เป้าหมาย
ทำให้ตัวนับ สามารถเก็บค่าล่าสุดไว้ได้แม้ยามไฟดับ และ สามารถแสดงค่าที่นับได้บน Labview ด้วย

 

อุปกรณ์
บอร์ด Arduino V.Duemilanove  1  ea
Tick-Tock shield   1  ea



 1. ทำการเขียนโปรแกรมอัพโหลดลงบอร์ด Arduion ver.Duemilanove เพื่อทำให้ EEPROM บันทึกข้อมูล INPUT ได้  

 กดดูซอสโค๊ด (Click to see Source Code)

 

 

 

2. ทดสอบด้วย Tick-Tock shield และ Arduion ver.Duemilanove ประกอบเข้าด้วยกัน เมื่อกดปุ่ม K3,K2,K1 จะให้ทำในกรณีที่แตกต่างกัน K3 คือ รีเซตค่าตั้งต้นในที่นี้คือ 1639  K2 คือ เพิ่มค่าไป 1 และ K1 คือ ลดค่าลง 1

 

 

3. ลองทดสอบการบันทึกข้อมูลด้วย EEPROM ตอนนี้ค่าอยู่ที่ 1595 ลองถอดสายไฟเลี้ยงออก และเสียบเข้าใหม่


มันใช้ได้ 5555+ 

 

 

4. ลองทดสอบให้โปรแกรม LabView 2010 รับค่าจากบอร์ดดู และ ทดสอบจากปุ่มกดดู

 

 วิดีโอ

MISSION COMPELETE

 

  #########################################

 

  การบันทึกอุณหภูมิ

Job 3/3: Temperature and Save to Excel

 

 

เป้าหมาย
ทำให้สามารถเก็บอุณหภูมิที่วัดได้ลงไฟล์ Exel แบบ Real-Time และสามารถแสดงค่าได้บน Labview

 

อุปกรณ์
บอร์ด Arduino V.Duemilanove  1  ea
DS18B20   1  ea
Bread Board  1  ea
Resistor 10 Ohm  1  ea
สายไฟ  10  ea

 

1. ทำการวงจร DS1820 Sensor เข้า กับ Arduino ver.Duemilanove และติดตั้ง OneWire Library

 

 

2. เขียนและอัพโหลดโปรแกรมลงบอร์ด Arduino

  กดดูซอสโค๊ด (Click to see Source Code)

 

 

3.  จากนั้นทำการทดสอบอุณหภูมิด้วย Labview 2010




4. กำหนดพาร์ทให้กับโปรแกรมเพื่อสร้างไฟล์ xcel ที่ใช้เก็บค่าของอุณหภูมิ,วันเวลา และ กำหนดให้โปรแกรมทำการตั้งชื่อและสร้างไฟล์ใหม่ขึ้นทุกครั้งที่ทดสอบ

 

 

5. เข้าไปดูไฟล์ใน ไดเรกทอรี่ที่กำหนดไว้ จะเห็นได้ว่าไฟล์ถูกสร้างขึ้นใหม่ทุกครั้งที่มีการทดสอบด้วย Labview

 

 

  6. ในรายละเลียดของไฟล์จะบอก วัน เวลา อุณหภูมิ และ หน่วงของการวัด



7. ทำการสร้างตัว Installer เพื่อใช้ในการติดตั้งบนเครื่องอื่นๆ

  แบบทดสอบ

  MISSION COMPELETE

วันเสาร์ที่ 28 พฤษภาคม พ.ศ. 2559

Week04 LabView Interface from Arduino via LIFA

  TPIC6B595 + Switch Control Led 8 ea

 

เป้าหมาย
ทำให้ LED แต่ละดวงติดดับจากการควบคุมจากสวิชต์แต่ละตัว โดยกด เป็นติด ปล่อยเป็นดับ  

 

อุปกรณ์
บอร์ด Arduino V.Duemilanove  1  ea
TPIC6B595   1  ea
Push Button Switch  8  ea
LED  8  ea
สายไฟ  10  ea

 


ขั้นตอน
1.  ต่อ TPIC6B595 เข้ากับ LED 8 ea ,ต่อบอร์ด Arduino เข้ากับสวิชต์และ TPIC6B595

 

 

 2.  อัพโหลดโปรแกรมลงบอร์ด Arduino 
 



3.  ได้เวลาทดสอบ 

 

 

วิดีโอการทดสอบ
 

MISSION COMPELETE

วันศุกร์ที่ 27 พฤษภาคม พ.ศ. 2559

Week05 NodeMCU

Week05 NodeMCU

 

เป้าหมาย
ทำความเข้าใจว่า Node MCU คืออะไรและสามารถ นำ Node MCU ไปประยุกต์ใช้ในงานต่างๆได้



อุปกรณ์ที่ต้องใช้ 
1. Arduino Board รุ่นใดก็ได้    1    ea
2. NoteBook หรือ Pc 1 เครื่อง
3. Jump Wire (สายไฟ แบบมีขาและรูเสียบ)  10  ea
4. สายจ่ายไฟเลี้ยงให้กับ Board Arduino
5. สวิทซ์แบบ Pulse   1  ea
6. หลอด LED 8  ea
7. Node MCU ESP8266  1  ea






มาทำความรู้จักกับ Node MCU ESP8266 


NodeMCU คืออะไร ?
NodeMCU คือ แพลตฟอร์มหนึ่งที่ใช้ช่วยในการสร้างโปรเจค Internet of Things (IoT) ที่ประกอบไปด้วย Development Kit (ตัวบอร์ด) และ Firmware (Software บนบอร์ด) ที่เป็น open source สามารถเขียนโปรแกรมด้วยภาษา Lau ได้ ทำให้ใช้งานได้ง่ายขึ้น มาพร้อมกับโมดูล WiFi (ESP8266) ซึ่งเป็นหัวใจสำคัญในการใช้เชื่อมต่อกับอินเตอร์เน็ตนั่นเอง ตัวโมดูลESP8266นั้นมีอยู่ด้วยกันหลายรุ่นมาก ตั้งแต่เวอร์ชันแรกที่เป็น ESP-01 ไล่ไปเรื่อยๆจนปัจจุบันมีถึง ESP-12 แล้ว และที่ฝังอยู่ในNodeMCU version แรกนั้นก็เป็น ESP-12 แต่ใน version2 นั้นจะใช้เป็น ESP-12E แทน ซึ่งการใช้งานโดยรวมก็ไม่แตกต่างกันมากนัก NodeMCUนั้นมีลักษณะคล้ายกับ Arduino ตรงที่มีพอร์ต Input Output  buil inมาในตัว  สามารถเขียนโปรแกรมคอนโทรลอุปกรณ์ I/O ได้โดยไม่ต้องผ่านอุปกรณ์อื่นๆ และเมื่อไม่นานมานี้ก็มีนักพัฒนาที่สามารถทำให้ Arduino IDE ใช้งานร่วมกับ Node MCU ได้ จึงทำให้ใช้ภาษา C/C++ ในการเขียนโปรแกรมได้ ทำให้เราสามารถใช้งานมันได้หลากหลายมากยิ่งขึ้น  NodeMCUตัวนี้สามารถทำอะไรได้หลายอย่างมากโดยเฉพาะเรื่องที่เกี่ยวข้องกับ IoT ไม่ว่าจะเป็นการทำ Web Server ขนาดเล็ก การควบคุมการเปิดปิดไฟผ่านWiFi และอื่นๆอีกมากมาย ซึ่งจะสอนในบทความต่อๆไป
อ้างอิงจาก : http://www.sat2you.com/site/?p=2136



ข้อดีของบอร์ด Arduino ESP8266
- เป็นแบบ Open Source Project มี Source code ให้ได้เรียนรู้อยู่บน Github ตามลิงค์  https://github.com/esp8266/Arduino
- สามารถกด upload sketch ได้ เชื่อมต่อบอร์ด USB กับคอมพิวเตอร์ใช้งานง่าย ขนาดของบอร์ดต่อลง Protoboard ได้
- ชิบภายใน ESP 8266 มี CPU ขนาด 32 bit แตกต่างจาก Arduino ที่เป็น CPU 8 bit
- ถึงแม้ขา I/O จะไม่มากเท่าของ Arduino แต่เราสามารถเขียนโปรแกรมลงบนขา GPIO ได้ทุกขาพอๆกัน เป็นข้อดีที่เพิ่มมาจากความต้องการใช้ WIFI เชื่อมต่อเมื่อต้องการเล่น Arduino ทำให้ต้องซื้อ Module wifi เพิ่ม นั่นคือ NodeMCU (ESP8266) มีต้นทุนต่ำกว่ามาก
-มีอุปกรณ์หลายอย่างที่ใช้งานที่แรงดัน +3.3 V เป็นส่วนใหญ่ ดังนั้นเราสามารถนำ NodeMCU (ESP8266) มาใช้เชื่อมต่อได้โดยตรง
อ้างอิงจาก : http://www.ayarafun.com/2015/08/introduction-arduino-esp8266-nodemcu/




ขั้นตอนการติดตั้ง Library ของ ESP8266 ให้กับ Arduino IDE

1. ไปที่ Menu File >> Preferences
2. ใส่ URL >>ลงใน Addition Board Manager URLs:
 >> http://arduino.esp8266.com/stable/package_esp8266com_index.json <<


3. จากนั้นไปที่ Menu Tools >> Boar:”xxxxxx” >> Board Manager...


4. เลือก Type เป็น Contributed ไปที่ ESP8266 และกด Install


5. เมื่อทำการติดตั้งเสร็จเราจะต้องปิดและเปิด Arduino Ide ใหม่ แล้วเข้าไปที่ Menu Tools >> Board ...
จะมี board ESP 8266 ให้เลือกใช้ การติดตั้งเป็นอันเสร็จพิธี






มาทดสอบว่ามันสามารถใช้งานได้จริงๆแล้วกันดีกว่า
Source Code ที่ใช้ในการทดสอบ (Blink LED on Board)


int LED_X = 2; // GPIO2
int LED_Y = 16; //  GPIO16 or BUILTIN_LED
void setup() {
pinMode(LED_X, OUTPUT);
pinMode(LED_Y, OUTPUT);
}
void loop() {
digitalWrite(LED_X, LOW);
digitalWrite(LED_Y, HIGH);
delay(200);
digitalWrite(LED_X, HIGH);
digitalWrite(LED_Y, LOW);
delay(200);
}



ผลการทดสอบ






ขั้นตอนการเชื่อมต่อ Node MCU เข้ากับระบบ Network
ตัวอย่าง Source Code การแสดงหมายเลข MAC ADDRESS

#include <ESP8266WiFi.h>
uint8_t MAC_array[6];
char MAC_char[18];
void setup() {
    Serial.begin(115200);
    Serial.println();
    WiFi.macAddress(MAC_array); 
    for (int i = 0; i < sizeof(MAC_array); ++i) {
        sprintf(MAC_char, "%s%02x:", MAC_char, MAC_array[i]);
    }
    Serial.println(MAC_char);
}
void loop() {
    Serial.println(MAC_char);
    Serial.println();
    delay(5000);
}



ผลการทดสอบ





ขั้นตอนการทำให้ Node MCU ของเราสามารถเชื่อมต่อกับ AP แบบ DHCP
1. เขียนโค๊ดลง Arduino IDE และระบุ ssid กับ password ของ internet ที่เราต้องการให้เชื่อมต่อเป็น Access point

ตัวอย่าง Source Code การเชื่อมต่อกับ AP แบบ DHCP
 
#include <ESP8266WiFi.h>
const char* ssid= "Your-ssid";
const char* password = "Your-pass"; 
void setup()
{
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
Serial.print("Connecting to "); 
Serial.println(ssid);
WiFi.begin(ssid, password); 
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected"); 
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
}






2. กดอัพโหลดโค๊ดเข้า ESP8266 แล้วกดดูผลลัพที่ รูปแว่นขยายมุมขวาบนของ โปรแกรม จะได้ผลลัพท์ดังนี้ถ้ามีการเชื่อมต่อกันกับตัว ESP8266

ผลการทดสอบ






ขั้นตอนการทำให้ Node MCU เป็น TCP Client
1. เขียนโค๊ดลง Arduino IDE

ตัวอย่าง Source Code (TCP Client)

#include <ESP8266WiFi.h>
#define SERVER_PORT 8888 //ค่า port ที่ต้องการเชื่อมต่อ
IPAddress server_ip = {192, 168, 0, 0}; //ค่า ip ของ Server (อย่าลืมแก้เป็น IP ของตัวเอง)
const char* ssid = "Your-ssid"; //ค่าของ SSID (อย่าลืมแก้เป็น ชื่อ SSID ของตัวเอง)
const char* password = "Your-pass"; //ค่าของ SSID (อย่าลืมแก้เป็น password ของตัวเอง)
WiFiServer server(SERVER_PORT);
WiFiClient client; //สร้าง object client
void setup()
{
Serial.begin(115200); //เปิดใช้ Serial
WiFi.begin(ssid, password); //เชื่อมต่อกับ AP
while (WiFi.status() != WL_CONNECTED) //รอการเชื่อมต่อ
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); //แสดงหมายเลข IP
Serial.println("Connect TCP Server");
while (!client.connect(server_ip, SERVER_PORT)) //เชื่อมต่อกับ Server
{
Serial.print(".");
delay(100);
}
Serial.println("Success");
ESP.wdtDisable(); //ปิด watch dog Timer
}
void loop()
{
while (client.available()) //ตรวจเช็ตว่ามี Data ส่งมาจาก Server หรือไม่
{
uint8_t data = client.read(); //อ่าน Data จาก Buffer
Serial.write(data); //แสดงผล Data ทาง Serial
}
client.println("B5601639 Phongsart Phatthaisong"); //ส่งค่าที่ได้รับกลับไปยัง Server
delay(1000);
}




2. กดอัพโหลดโค๊ดเข้า ESP8266 แล้วกดดูผลลัพที่ รูปแว่นขยายมุมขวาบนของ โปรแกรม จะได้ผลลัพท์ดังนี้ถ้ามีการเชื่อมต่อกันกับตัว ESP8266


3. ดาวน์โหลด โปรแกรม hercules จากนั้นเปิดโปรแกรมขึ้นมาเข้ามา tab TCP SERVER ใส่หมายเลขพอร์ทในการเชื่อต่อให้ตรงกับที่ใส่ในข้อ 1. แล้วกด เพื่อดูผลลัพท์ได้ที่นี่ >>คลิ๊ก<< 



ผลการทดสอบ








ขั้นตอนการทำให้ Node MCU เป็น TCP Server
1. เขียนโค๊ดลง Arduino IDE

ตัวอย่าง Source Code (TCP Server)

#include <ESP8266WiFi.h>
#define SERVER_PORT 8000 //กำหนด Port ใช้งาน
const char* ssid = "Your-ssid"; //กำหนด SSID
const char* password = "Your-pass"; //กำหนด Password
WiFiServer server(SERVER_PORT); 
void setup()
{ Serial.begin(115200); //เปิดใช้ Serial
Serial.println("");
Serial.println("");
WiFi.begin(ssid, password); //เชื่อมต่อกับ AP
while (WiFi.status() != WL_CONNECTED) //รอการเชื่อมต่อ
{ delay(500);
Serial.print(".");
}
Serial.println("WiFi connected"); //แสดงข้อความเชื่อมต่อสำเร็จ
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); //แสดงหมายเลข IP
server.begin(); //เริ่มต้นทำงาน TCP Server
Serial.println("Server started"); 
ESP.wdtDisable(); //ปิด watch dog Timer
}
void loop()
{ WiFiClient client = server.available(); 
if (client) //ตรวจเช็คว่ามี Client เชื่อมต่อเข้ามาหรือไม่
{
Serial.println("new client");
while (1) //วนรอบตลอด
{ while (client.available()) 
{ uint8_t data = client.read(); //อ่าน Data จาก Buffer
Serial.write(data); //แสดงผล Data ทาง Serial
}
if (server.hasClient()) //ตรวจเช็คว่ายังมี Client เชื่อมต่ออยู่หรือไม่
{ return; //ถ้าไม่มีให้ออกจาก ลูป ไปเริ่มต้นรอรับ Client ใหม่
}}}}





2. กดอัพโหลดโค๊ดเข้า ESP8266 แล้วกดดูผลลัพที่ รูปแว่นขยายมุมขวาบนของ โปรแกรม จะได้ผลลัพท์ดังนี้ถ้ามีการเชื่อมต่อกันกับตัว ESP8266



3. เปิดโปรแกรม hercules ที่โหลด จากลิ้งในข้อ 2. ขึ้นมาจากนั้นทำการ เลือก tab TCP Client กรอก  ipaddress และ port ของ ESP8266 ลงไป จากนั้นกด Conect



4. ทดสอบส่งข้อความ จากนั้นดูผลลัพท์






ขั้นตอนการทำให้ Node MCU เป็น Web server input
1. เขียนโค๊ดลง Arduino IDE

ตัวอย่าง Source Code (Web Server input)

#include <ESP8266WiFi.h>
#define SW D2 //กำหนดรับ input จาก Switch ที่ Pin D2
#define LED D0
const char* ssid = "CPE@SUT"; //กำหนด SSID (อย่าลืมเปลี่ยนเป็นของตัวเอง)
const char* password = "computer555"; //กำหนด password (อย่าลืมเปลี่ยนเป็นของตัวเอง)
WiFiServer server(80); //กำหนดใช้งาน TCP Server ที่ Port 80
void control_led(int pin);
void open_and_send_file(WiFiClient client_in,const char* path);
void setup() {
Serial.begin(115200);
pinMode(SW, INPUT_PULLUP); //กำหนดให้ pin D2 เป็น input
pinMode(LED, OUTPUT);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); // เชื่อมต่อกับ AP
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
server.begin(); //เริ่มใช้งาน TCP Server
Serial.println("Server started");
Serial.println(WiFi.localIP()); //แสดง IP
}
void loop() {
WiFiClient client = server.available(); //รอรับ การเชื่อมต่อจาก Client
if (!client) { //ถ้าไม่มี Client เข้ามาให้เริ่มกับไปวน loop รอรับใหม่
return;
}
Serial.println("new client");
while (!client.available())
{
delay(1);
}
String req = client.readStringUntil('\r'); //อ่านค่าที่ได้รับจากclient จากข้อมูลแรกถึง ‘\r’
Serial.println(req);
client.flush();
// เก็บ HTML Code ลงในตัวแปร String web
String web = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
web += "<html>\r\n";
web += "<body>\r\n";
web += "<head>Read Switch\r\n";
web += "<style>\r\n";
web += ".circle-blue,.circle-red\r\n";
web += "{width: 100px;\r\n";
web += "height: 100px;\r\n";
web += "border-radius: 50%;}\r\n";
web += ".circle-blue\r\n";
web += "{background-color: blue}\r\n";
web += ".circle-red\r\n";
web += "{background-color: red}\r\n";
web += "</style>\r\n";
web += "</head>\r\n";
web += "<meta http-equiv=\"refresh\" content=\"1\">";
web += "<p>\r\n";
unsigned char sw_input = digitalRead(SW); //อ่านค่าจาก Switch
if (sw_input == 1)
{
  digitalWrite(LED,HIGH);
web += "<div class=\"circle-blue\"></div>\r\n"; //ถ้าเป็น 1 ให้แสดงวงกลมสีเทา
web += "<p>SW = 1</p>\r\n";
}
else
{
  digitalWrite(LED,LOW);
web += "<div class=\"circle-red\"></div>\r\n"; //ถ้าเป็น 0 ให้แสดงวงกลมสีเหลือง
web += "<p>SW = 0</p>\r\n";
}
web += "</p>\r\n";
web += "</body>\r\n";
web += "</html>\r\n";
client.print(web); //ส่ง HTML ไปยัง Client
}




2. ต่อสวิทซ์เข้ากับ board และทำการรันโค๊ด แล้วดูที่ serial monitor หากได้ผลลัพท์ดังภาพจังไปขั้นต่อไป





3. นำ ipaddress ไปใส่ที่ช่อง url ของ browser  แล้วกดค้นหา จะได้


4. และเมื่อทำการกดสวิทซ์ จะได้ผลลัพท์ดังนี้

ผลการทดสอบ : วงกลมสีน้ำเงินจะเปลี่ยนเป็นวงกลมสีแดงเมื่อมีการ กดสวิทซ์












ขั้นตอนการทำให้ Node MCU เป็น Web Server Ajax
1. เขียนโค๊ดลง Arduino IDE

ตัวอย่าง Source Code (Web Server Ajax)

#include <ESP8266WiFi.h>
#include <OneWire.h>
const char* ssid = "Dok";
const char* password = "123456789";
#define Relay1 D1
#define Relay2 D2
OneWire  ds(D4);
float celsius, fahrenheit;
WiFiServer server(5678);
void setup() {
  Serial.begin(115200);
  delay(10);
  //dht.begin();
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  digitalWrite(Relay1, LOW);
  digitalWrite(Relay2, LOW);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  server.begin();
  Serial.println("Server started");
  Serial.println(WiFi.localIP());
}
void loop() {
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println("new client");
  while (!client.available()) {
    delay(1);
  }
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  if (req.indexOf("/r1off.html") != -1)
  {
    digitalWrite(Relay1, HIGH);
  }
  else if (req.indexOf("/r1on.html") != -1)
  {
    digitalWrite(Relay1, LOW);
  }
  else if (req.indexOf("/r2on.html") != -1)
  {
    digitalWrite(Relay2, LOW);
  }
  else if (req.indexOf("/r2off.html") != -1)
  {
    digitalWrite(Relay2, HIGH);
  }
  else if (req.indexOf("/Temp_.html") != -1)
  {
    float h = TempDS18B20();
    if (h < 90000.0) {
      float t = h * 1.8 + 32.0;
      client.flush();
      String humi = "<h3>Temp = ";
      humi += String(h) + " C</h3>\r\n";
      humi += "<h3>Temp = ";
      humi += String(t) + " F</h3>\r\n";
      Serial.println(h);
      Serial.println(t);
      client.print(humi);
    }

  }
  else if (req.indexOf("/") != -1)
  {
    client.flush();
    String web = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
    web += "<html>\r\n";
    web += "<head>\r\n";
    web += "<style>\r\n";
    web += ".button-red,.button-blue\r\n";
    web += "{color: white;\r\n";
    web += "border-radius: 9px;\r\n";
    web += "font-family:Arial;\r\n";
    web += "font-size:25px;\r\n";
    web += "padding:50px 80px;\r\n";
    web += "}\r\n";
    web += ".button-red:hover:active,.button-blue:hover:active\r\n";
    web += "{position:relative;top:3px;color: yellow;}\r\n";
    web += ".button-red {background: rgb(202, 60, 60);}\r\n";
    web += ".button-blue {background: rgb(100,116,255);}\r\n";
    web += "h1{color:black;font-family:Arial;font-size:40px;text-align:center;}\r\n";
    web += "</style>\r\n";
    web += "<script>\r\n";
    web += "var ajax = null;\r\n";
    web += "if (window.XMLHttpRequest)\r\n";
    web += "{ajax =new XMLHttpRequest();}\r\n";
    web += "else\r\n";
    web += "{ajax=new ActiveXObject(\"Microsoft.XMLHTTP\");}\r\n";
    web += "function ajaxLoad(method ,URL,displayElementId,sendData)\r\n";
    web += "{\r\n";
    web += "if(!ajax){alert(\"not support\");return;}\r\n";
    web += "ajax.open(method,URL,true);\r\n";
    web += "ajax.onreadystatechange = function()\r\n";
    web += "{\r\n";
    web += "if(ajax.readyState == 4 && ajax.status==200)\r\n";
    web += "{\r\n";
    web += "var ajax_result = ajax.responseText;\r\n";
    web += "var el = document.getElementById(displayElementId);\r\n";
    web += "el.innerHTML = ajax_result;\r\n";
    web += "}\r\n";
    web += "}\r\n";
    web += "ajax.send(sendData);\r\n";
    web += "}\r\n";
    web += "function update_temp_humi()\r\n";
    web += "{\r\n";
    web += "var rand = Math.random();\r\n";
    web += "var URL = \"/Temp_.html\";\r\n";
    web += "ajaxLoad(\"GET\",URL,\'temp_humi\',null);\r\n";
    web += "}\r\n";
    web += "</script>\r\n";
    web += "</head>";
    web += "<body>";
    web += "<h1>Demo Web Server Ajax</h1>";
    web += "<h2>Temp C and F</h2>";
    web += "<div id=\"temp_humi\">";
    web += "<h3>Temp = xx C</h3>";
    web += "<h3>Temp = xx F</h3>";
    web += "</div>";
    web += "<div><p><input class=\"button-red\" type=\"button\" value=\"Relay 1 On\" onclick=\"Relay(\'r1on\')\">";
    web += "<input class=\"button-blue\" type=\"button\" value=\"Relay 1 Off\" onclick=\"Relay(\'r1off\')\"></P>";
    web += "<p><input class=\"button-red\" type=\"button\" value=\"Relay 2 On\" onclick=\"Relay(\'r2on\')\">";
    web += "<input class=\"button-blue\" type=\"button\" value=\"Relay 2 Off\" onclick=\"Relay(\'r2off\')\"></P>";
    web += "</div>";
    web += "<script>";
    web += "function Relay(state){ajaxLoad(\"GET\",state+\'.html\',null,null);}";
    web += "setInterval(\"update_temp_humi()\",2000);";
    web += "</script>";
    web += "</body>";
    web += "</html>";
    client.print(web);
    return;
  }
}

float TempDS18B20(void)
{
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {
    //Serial.println("No more addresses.");
    //Serial.println();
    ds.reset_search();
    delay(250);
    return 99999.9;
  }

  //Serial.print("ROM =");
  for ( i = 0; i < 8; i++) {
    //Serial.write(' ');
    //Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
    //Serial.println("CRC is not valid!");
    return 99999.9;
  }
  //Serial.println();

  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      //Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      //Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      ////Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      //Serial.println("Device is not a DS18x20 family device.");
      return 99999.9;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);         // Read Scratchpad

  //Serial.print("  Data = ");
  //Serial.print(present,HEX);
  //Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    //Serial.print(data[i], HEX);
    //Serial.print(" ");
  }
  //Serial.print(" CRC=");
  //Serial.print(OneWire::crc8(data, 8), HEX);
  //Serial.println();

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  return  ((float)raw / 16.0);

}



2. ทำการต่อ LED เข้ากับ ESP8266 แลัว อัพโหลดโค๊ด จากนั้นนำไอพี ของ ESP8266 ใส่ค้นหาลงใน Browser เช่นเดียวกับ Web server input ถ้าทำถูกต้องจะได้ผลลัพท์อย่างนี้

3. ทำการทดสอบกดปุ่มเปิดปิดไฟทั้งสองดวงดู

ผลการทดสอบ