Lab 2
การติดต่อ Digital Output
VDO Link : https://www.youtube.com/watch?v=t-baeubun2E
ระดับความยากง่าย
● ปานกลาง
ประมาณเวลาที่ใช้เรียนรู้ + ลงมือปฏิบัติตาม
● 30 นาที – 1 ชั่วโมง
Prerequisite ต้องผ่านหัวข้อหรือใบงานกิจกรรมใดมาก่อน
● Module NETPIE on NodeMCU/ESP8266 Lab 1 ติดตั้ง Arduino IDE และทดสอบการทำงานเบื้องต้นของ NodeMCUESP8266 (https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/chapter1.html)
วัตถุประสงค์
เพื่อให้เข้าใจการใช้งานและสามารถประยุกต์ใช้งาน Digital Output ได้
อุปกรณ์ที่ใช้ในการทดลอง
1.บอร์ด NodeMCU ESP8266 (ESP-12E)
2.LED
3.ตัวต้านทาน (Resistor) 330 Ω ขนาด ¼ w
4.Breadboard
5.สายไฟเชื่อมต่อ (Male to Female)
เนื้อหาเชิงทฤษฎี
การทดลองนี้เป็นการต่อบอร์ด NodeMCU/ESP8266 กับอุปกรณ์เอาต์พุต (Digital Output) เพื่อขับให้ทำงาน ผู้ศึกษาจะได้ต่อวงจรจากขาต่างๆ ในโหมดการทำงานแบบเอาต์พุต ซึ่งมีด้วยกันสองแบบ แบบแรกจะเกิดการทำงาน (Active) เมื่อส่งแรงดันไฟฟ้าขาออก 3.3 V หรือเรียกว่า ลอจิก HIGH (‘1’) แบบที่สองจะเกิดการทำงานเมื่อส่งแรงดันไฟฟ้าขาออก 0 V หรือเรียกว่า ลอจิก LOW (‘0’)
เบื้องต้นขออธิบายวิธีการต่อวงจรเพื่อใช้งาน Digital Output ในการเปิดปิดหลอดไฟ LED ซึ่งมีอยู่ด้วยกันสองวิธีดังแสดงในภาพ วิธีแรกเรียกว่า Active High กล่าวคือ เมื่อเราส่งลอจิก HIGH จากบอร์ด หลอด LED จะติด และหากบอร์ดส่งลอจิก LOW หลอด LED จะดับ ส่วนวิธีที่สองเรียกว่า Active Low จะได้ผลลัพธ์ที่กลับกัน ทั้งนี้บอร์ด NodeMCU/ESP8266 จะมี LED ติดมาด้วยอยู่แล้ว 2 ดวงที่ขา D0 (GPIO16) และ ขา D4 (GPIO2) โดยต่อแบบ Active Low ทั้งคู่
ฟังก์ชั่นของโปรแกรมที่ควรทราบ
● pinMode
pinMode เป็นฟังก์ชั่นที่ใช้ในการตั้งค่าโหมดการทำงานให้กับขาของบอร์ด Arduino
Syntax:
pinMode(pin, mode)
Parameter:
pin: หมายเลขขาที่ต้องการตั้งค่าใช้งาน
mode: INPUT : ตั้งขาเป็นอินพุต โดยต่อแบบ Pull Down
INPUT_PULLUP : ตั้งขาเป็นอินพุตที่ต่อแบบ Pull Up และใช้ตัวต้านทาน Pull Up ภายในของบอร์ด
OUTPUT : ตั้งขาให้เป็นเอาท์พุต
● digitalWrite
digitalWrite เป็นฟังก์ชั่นที่ใช้ในการเขียนค่าลอจิกไปที่ขาของบอร์ด Arduino
Syntax:
digitalWrite(pin, logic)
Parameter:
pin: หมายเลขขาที่ต้องการเขียนค่า
logic: ลอจิกที่ต้องการส่งออกเป็น HIGH หรือ LOW
ขั้นตอนการทดลอง
1.ต่อตัวต้านทานและหลอด LED ภายนอกเพิ่มเติมเข้ากับบอร์ดให้ทำงานแบบ Active High ดังภาพ
2.เปิดโปรแกรม Arduino IDE แล้วไปที่ File -> New File
3.เขียนโค้ดลงในสเก็ตช์ดังต่อไปนี้
#define D0 16 // เนื่องจากขาของ ESP8266 คือขาที่16 แต่ขาที่โชว์บนบอร์ด NodeMCU คือขา D0
#define LED D0 // ขา D0 ของบอร์ด NodeMCU เป็นขาที่ต่อกับ LED
void setup()
{
pinMode(LED,OUTPUT); // setup output
}
void loop()
{
digitalWrite(LED,HIGH); // Pin D0 is HIGH
delay(250);
digitalWrite(LED,LOW); // Pin D0 is LOW
delay(250);
}
คำอธิบายโปรแกรม
การกำหนด #define เพื่อให้เรียกขาหมายเลข 16 (GPIO16) ของ ESP8266 เป็นขา D0 บน NodeMCU และให้เรียกขา D0 ของ NodeMCU ซึ่งต่อกับทั้ง Built-in LED และ External LED ว่า LED
ส่วนภายในฟังก์ชั่น setup() เป็นการตั้งค่าให้ขา LED เป็น Digital Output
ส่วนภายในฟังก์ชั่น loop() เริ่มจากสั่งให้เขียนลอจิก HIGH ไปยังขา LED และหน่วงเวลา 250 ms จากนั้นสั่งให้เขียนลอจิก LOW ไปที่ขา LED และหน่วงเวลาอีก 250 ms จากนั้นวนซ้ำคำสั่งในลูปไปเรื่อยๆ
4.คอมไพล์โค้ดและบันทึกไฟล์ไว้บน Desktop ในตัวอย่างนี้เราตั้งชื่อไฟล์ว่า “test” จากนั้นอัพโหลดไฟล์ลงในบอร์ด
5.สังเกตผลลัพธ์ที่หลอดไฟ LED บนบอร์ดและที่ต่อจากภายนอก หลอดทั้งสองดวงจะกระพริบติดดับสลับกันด้วยความถี่เท่ากัน เหตุที่เป็นเช่นนี้เพราะหลอดไฟบนบอร์ดต่อแบบ Active Low ในขณะที่หลอดไฟภายนอกต่อแบบ Active High นั่นเอง
สรุปผล
ในการทดลองนี้ ผู้ศึกษาได้ทดลองใช้งาน Digital Output ของบอร์ด NodeMCU/ESP8266 ด้วยการสั่งเปิดปิดหลอดไฟ LED ที่มีการต่อวงจรทั้งสองแบบ คือ Active High และ Active Low และสังเกตผลลัพธ์เมื่อเขียนค่าลอจิก High และ Low ไปยังขาที่ต่อกับหลอด LED
แบบฝึกหัดทดสอบความเข้าใจ
- เขียนคำสั่งที่ทำให้บอร์ดส่งลอจิก ‘1’ ไปที่ขา D4
- เขียนคำสั่งที่ทำให้บอร์ดส่งลอจิก ‘0’ ที่ขา D4
- หากต่อวงจร LED แบบ Active High จะต้องส่งลอจิกอะไรเพื่อให้หลอด LED นั้นติด
- หากต่อวงจร LED แบบ Active Low จะต้องส่งลอจิกอะไรเพื่อให้หลอด LED นั้นติด
- ทำการประยุกต์โค้ดตัวอย่างข้างล่างเพื่อสั่งงานให้ไฟ LED_Red กระพริบสามครั้ง หลังจากนั้นสั่งให้ LED_Green กระพริบห้าครั้ง และให้วนซ้ำสลับกันไปเช่นนี้เรื่อยๆ
#define D1 5
#define D2 4
#define LED_Red D1
#define LED_Green D2
void setup()
{
pinMode(LED_Red,OUTPUT); // setup Red LED is output
pinMode(LED_Green,OUTPUT); // setup Green LED is output
}
void loop()
{
for(int count = 1 ; count <= 3 ; count++)
{
digitalWrite(LED_Red,HIGH); // Turn On Red LED
delay(250);
digitalWrite(LED_Red,LOW); // Turn Off Red LED
delay(250);
}
}
เฉลย-แบบฝึกหัดทดสอบความเข้าใจ
- digitalWrite(D4, HIGH);
- digitalWrite(D4, LOW);
- ลอจิก ‘1’ หรือ ลอจิก HIGH
- ลอจิก ‘0’ หรือ ลอจิก LOW
#define D1 5
#define D2 4
#define LED_Red D1
#define LED_Green D2
void setup()
{
pinMode(LED_Red,OUTPUT); // setup Red LED is output
pinMode(LED_Green,OUTPUT); // setup Green LED is output
}
void loop()
{
for(int count = 1 ; count <= 3 ; count++)
{
digitalWrite(LED_Red,HIGH); // Turn On Red LED
delay(250);
digitalWrite(LED_Red,LOW); // Turn Off Red LED
delay(250);
}
for(int count = 1 ; count <= 5 ; count++)
{
digitalWrite(LED_Green,HIGH); // Turn On Red LED
delay(250);
digitalWrite(LED_Green,LOW); // Turn Off Red LED
delay(250);
}
}
VDO Link : https://www.youtube.com/watch?v=t-baeubun2E