Lab 4
การติดต่อ Analog Input
VDO Link : https://www.youtube.com/watch?v=WbEH5shWm88
ระดับความยากง่าย
● ปานกลาง
ประมาณเวลาที่ใช้เรียนรู้ + ลงมือปฏิบัติตาม
● 1 ชั่วโมง – 1 ชั่วโมง 30 นาที
Prerequisite ต้องผ่านหัวข้อหรือใบงานกิจกรรมใดมาก่อน
● Module NETPIE on NodeMCU/ESP8266 Lab 1 การติดตั้ง Arduino IDE และทดสอบการทำงานเบื้องต้นของ NodeMCU/ESP8266 (https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/chapter1.html)
วัตถุประสงค์
เพื่อให้เข้าใจการใช้งานและสามารถประยุกต์ใช้งาน Analog-to-Digital Convertor (ADC) ได้
อุปกรณ์ที่ใช้ในการทดลอง
1.บอร์ด NodeMCU/ESP8266 (ESP-12E)
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.1.png)
2.ตัวต้านทานปรับค่าได้ (Volume Resistor หรือ Potentiometer) 10 KΩ
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.2.png)
3.Breadboard
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.3.png)
4.สายไฟเชื่อมต่อ (Male to Female)
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.4.png)
เนื้อหาเชิงทฤษฎี
การทดลองนี้ เป็นการอ่านค่าตัวตรวจจับแบบแอนะล็อก และแปลงสัญญาณแอนะล็อกเป็นดิจิทัล ด้วย Analog to Digital Convertor (ADC) สัญญาณแอนะล็อกคือสัญญาณที่มีการเปลี่ยนแปลง แบบต่อเนื่องทั้งขนาดของค่าสัญญาณและเวลา (Continuous in value and time) ดังนั้นเมื่อพล็อตสัญญารแอนะล็อกออกมาเป็นกราฟ จะมีลักษณะเป็นเส้นต่อเนื่องกัน ในขณะที่สัญญาณดิจิทัลคือสัญญาณที่มีการเปลี่ยนแปลงแบบขั้นทั้งขนาดของค่าสัญญาณและเวลา (Discrete in value and time) โดยมากแล้วสัญญาณดิจิทัลได้มาจากสัญญาณแอนะล็อกที่ผ่านกระบวนการชักตัวอย่าง (Sampling) และการแบ่งนับ (Quantization) ในการทดลองนี้เราจะจำลองสัญญาณแอนะล็อกด้วยแรงดันไฟฟ้าจากตัวต้านทานปรับค่าได้ (Volume Resistor หรือ Potentiometer) จากทางขา ADC (A0 หรือ ขา 6) ของบอร์ด NodeMCU/ESP8266 โดยที่ความละเอียดของ ADC อยู่ที่ 10 บิต (1024 ค่า, 0-1023) หมายความว่าหากอ่านค่าแรงดันไฟฟ้าเป็นสัญญาณแอนะล็อกได้ 3.3 V (เทียบเท่าไฟเลี้ยง ESP8266) แปลงมาเป็นค่าเป็นดิจิทัลแล้วบอร์ด NodeMCU/ESP8266 จะเห็นเป็นค่า 1023 และในลักษณะเดียวกัน เมื่ออ่านค่าแรงดันไฟฟ้าแอนะล็อกได้ 0 V ค่าดิจิทัลที่บอร์ดเห็นจะเป็น 0
Analog to Digital Convertor (ADC) คือตัวแปลงสัญญาณแอนะล็อกให้เป็นสัญญาณดิจิทัล NodeMCU/ESP8266 มี ADC อยู่ 1 ช่องทางผ่านขา A0 โดยมีค่าความละเอียด (Resolution) 10 บิต ในการทดลอง ผู้ศึกษาจะเขียนโปรแกรมเพื่ออ่านค่าสัญญาณแอนะล็อก ซึ่งเป็นแรงดันไฟฟ้าคร่อมตัวต้านทานปรับค่าได้ การปรับค่าความต้านทานของตัวต้านทานจะเปลี่ยนค่าแรงดันไฟฟ้า ทำให้เกิดการเปลี่ยนแปลงค่าแรงดันได้แบบต่อเนื่อง ก่อให้เกิดสัญญาณแอนะล็อก
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.5.png)
ฟังก์ชั่นของโปรแกรมที่ควรทราบ
● analogRead
ฟังก์ชั่น analogRead เป็นฟังก์ชั่นที่ใช้ในการอ่านค่าสัญญาณแอนะล็อกของขาที่ต้องการ สำหรับบอร์ด NodeMCU/ESP8266 คือขา A0 ผลลัพธ์ที่อ่านได้หลังจากสัญญาณแอนะล็อกถูกแปลงด้วย ADC จะเป็นตัวเลขจำนวนเต็ม 0-1023
Syntax:
digitalRead(pin)
Syntax:
analogRead(pin)
Parameter:
pin: หมายเลขขาที่ต้องการอ่านค่าแอนะล็อก
Return:
int (0 to 1023) 10 bits
ขั้นตอนการทดลอง
1.ทำการต่อวงจรตามภาพ สังเกตว่าขา ADC ของบอร์ดถูกต่อเข้ากับขา Slider ของตัวต้านทาน
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.6.png)
2.เปิดโปรแกรม Arduino IDE และคลิกไปที่เมนู File -> New File
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.7.png)
3.เขียนโค้ดลงในโปรแกรมดังนี้
void setup()
{
Serial.begin(115200);
}
void loop()
{
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
Serial.print("ADC 10 bit = ");
Serial.print(sensorValue); // print out the value you read:
float volts = 3.30*(float)sensorValue/1023.00;
Serial.print(" , Voltage = ");
Serial.print(volts,2);
Serial.println(" V");
delay(1); // delay in between reads for stability
}
คำอธิบายโปรแกรม
ส่วนภายในฟังก์ชั่น setup() เป็นการตั้งค่าความเร็วการรับส่งข้อมูลของพอร์ต Serial ที่ 115,200 บิตต่อวินาที
ส่วนภายในฟังก์ชั่น loop() จะทำงานวนลูปไปเรื่อยๆ ตามลำดับไม่สิ้นสุด โดยในการทดลองนี้ โดยในการทดลองนี้เราจะวนลูปเพื่ออ่านค่าแอนะล็อกด้วยคำสั่ง analogRead จากขา A0 มาเก็บไว้ในตัวแปลแบบ integer ชื่อ sensorValue และสั่งให้พิมพ์ค่าดิบที่อ่านมาได้ออกไปยังพอร์ต Serial ซึ่งจะไปแสดงยังหน้าจอคอมพิวเตอร์ จากนั้นนำค่าตัวแปร sensorValue มาคำนวณเทียบบัญญัติไตรยางค์เพื่อแปลงเป็นค่าแรงดันไฟฟ้า (ทศนิยม 2 ตำแหน่ง) และพิมพ์แสดงออกยังหน้าจอคอมพิวเตอร์
4.คลิกที่ปุ่ม
เพื่อคอมไพล์โค้ด แล้วทำการบันทึกไฟล์เป็น “DigitalInput” ไว้ที่ Desktop ดังภาพตัวอย่างด้านล่าง เมื่อคอมไพล์เสร็จสิ้นและไม่มีข้อผิดพลาด ทำการอัพโหลดโดยคลิกปุ่ม![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/a2.jpg)
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/a1.jpg)
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/a2.jpg)
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.8.png)
5.คลิกที่ปุ่ม
(Serial monitor) และทำการกดสวิตช์ค้างไว้ สังเกตผลลัพธ์บนจอดังภาพ
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/a3.jpg)
![](https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/assets/54.9.png)
สรุปผล
การทดลองนี้ ผู้ศึกษาได้เรียนรู้วิธีการอ่านค่าสัญญาณอินพุตชนิดแอนะล็อกด้วยบอร์ด NodeMCU/ESP8266 รวมไปถึงวิธีการคำนวณเพื่อแปลงค่าเอาท์พุตดิบของ ADC กลับเป็นค่าจริงที่ต้องการ
แบบฝึกหัดทดสอบความเข้าใจ
- ADC ย่อมาจากอะไรและคืออะไร อธิบายพอสังเขป
- เขียนคำสั่งให้อ่านค่าจากขา ADC ของ NodeMCU/ESP8266
- แก้ไขโค้ดด้านล่าง ให้พิมพ์คำว่า “Good” ไปยังหน้าจอเมื่อเอาท์พุตของ ADC มากกว่า 200 แต่น้อยกว่า 500
void setup()
{
Serial.begin(115200);
}
void loop()
{
// read the input on analog pin 0:
int ADC_Value = analogRead(A0);
if(ADC_Value >= 1000)
{
Serial.println("Dangerous!");
}
else if(ADC_Value >= 500)
{
Serial.println("Careful.");
}
else
{
Serial.println("Safe.");
}
}
เฉลย-แบบฝึกหัดทดสอบความเข้าใจ
- Analog-to-Digital Convertor คือตัวแปลงสัญญาณจากแอนะล็อกเป็นดิจิทัล โดยมากมีความละเอียดเป็นบิต เช่น 10 บิต หมายถึงช่วงค่าแอนะล็อกถูกแบ่งเป็น 210= 1024 ขั้น
- analogRead(A0); 3.
void setup()
{
Serial.begin(115200);
}
void loop()
{
// read the input on analog pin 0:
int ADC_Value = analogRead(A0);
if(ADC_Value >= 1000)
{
Serial.println("Dangerous!");
}
else if(ADC_Value >= 500)
{
Serial.println("Careful.");
}
else if(ADC_Value > 200)
{
Serial.println("Good.");
}
else
{
Serial.println("Safe.");
}
}