Lab 2
การติดต่อ Digital Input
VDO Link : https://www.youtube.com/watch?v=6swPWVwEKjE&t=3s
ระดับความยากง่าย
● ปานกลาง
ประมาณเวลาที่ใช้เรียนรู้ + ลงมือทำตาม
● 30 นาที - 1 ชั่วโมง
Prerequisite ต้องผ่านหัวข้อหรือใบงานกิจกรรมใดมาก่อน
● Module Arduino on NETPIE Lab 1 การติดตั้ง Arduino IDE และทดสอบการทำงานเบื้องต้นของ Arduino Mega 2560 (https://netpie.gitbooks.io/netpie-lab-4-arduino-on-netpie/content/introduction.html)
วัตถุประสงค์
- เพื่อให้เข้าใจการใช้งานและสามารถประยุกต์ใช้งาน Digital Input ได้
- เพื่อให้เข้าใจการใช้งานและสามารถประยุกต์ใช้งานเซ็นเซอร์ความชื้นและอุณหภูมิ DHT11 ได้
อุปกรณ์ที่ใช้ในการทดลอง
1.บอร์ด Arduino Mega 2560
2.สวิตช์กดติดปล่อยดับ (Tact Switch)
3.เซนเซอร์วัดความชื้นและอุณหภูมิ DHT11
4.Breadboard
5.สายไฟเชื่อมต่อ (Male to Female)
เนื้อหาเชิงทฤษฎี
ในการทดลองนี้ เราจะทดลองใช้งานอินพุตแบบดิจิทัล (Digital Input) ของบอร์ด Arduino Mega 2560 โดยแบ่งออกเป็นสองส่วน ในส่วนแรกผู้ศึกษาจะได้เรียนรู้วิธีการใช้งานสวิตช์กดติดปล่อยดับ (Tact switch) ซึ่งสามารถหาซื้อได้ง่ายตามร้านค้าอุปกรณ์อิเล็กทรอนิกส์ทั่วไป ว่ามีการต่อวงจรอย่างไร จากนั้นเขียนโปรแกรมเพื่อให้บอร์ด Arduino Mega 2560 อ่านค่าสถานะการกดปุ่มของสวิตช์
การต่อวงจรอินพุตแบบดิจิทัล (Digital Input) มีสองแบบ แบบแรกคือการต่อแบบ Pull Up กล่าวคือในขณะที่ไม่ได้กดสวิตช์บอร์ด Arduino Mega 2560 จะอ่านแรงดันไฟฟ้าได้ 5 V หรือที่เรียกว่า ลอจิก HIGH (‘1’) แต่เมื่อมีการกดสวิตช์แรงดันไฟฟ้าจะลงมาที่ 0V ซึ่งเรียกว่าลอจิก LOW (‘0’) ดังนั้นการทำงานภายใต้การต่อแบบ Pull up จึงถูกเรียกว่า Active Low นั่นคือลอจิก LOW ในขณะทำงาน แบบที่สองคือการต่อแบบ Pull Down ซึ่งจะได้ผลลัพธ์กลับกัน คือหากไม่ได้กดสวิตช์ จะได้ลอจิก LOW ‘0’ แต่เมื่อกดสวิตซ์จะได้ลอจิก HIGH ‘1’ ทำให้การต่อแบบ Pull Down ถูกเรียกว่า Active High นั่นคือเกิดการสั่งการในขณะลอจิก HIGH นั่นเอง ในการต่อสวิตช์เรานิยมและแนะนำให้ต่อแบบแรกมากกว่าแบบที่สองในขณะที่ถ้าต่อกับเซนเซอร์เพื่ออ่านค่า มักนิยมแบบที่สองมากกว่าแบบแรก
เนื่องจากใน Atmega Chip บนบอร์ด Arduino มีตัวต้านทาน Pull Up (R1 ในรูป) ภายในอยู่แล้ว ดังนั้นการต่อสวิตช์เข้ากับบอร์ดจึงไม่จำเป็นต้องต่อความต้านทานภายนอกเพิ่มเติมอีก ต่อเพียงสวิตช์อย่างเดียวเท่านั้น
การทดลองส่วนที่สองจะเป็นการอ่านค่าจากเซนเซอร์ความชื้นและอุณหภูมิ DHT11 โดยในกรณีนี้ค่าที่อ่านจะเป็นสัญญาณแอนะล็อก ซึ่งเซนเซอร์จะแปลงเป็นสัญญาณดิจิทัลให้ ผู้ใช้งานจึงสามารถเขียนโปรแกรมรับค่าที่เป็นดิจิทัลได้เลยโดยไม่ต้องแปลงสัญญาณใดๆ ในการทดลองนี้เราจะบอกวิธีที่ใช้ Library ของ Arduino ในการติดต่อกับเซ็นเซอร์ตัวนี้ โดยสิ่งที่ผู้ศึกษาต้องปฏิบัติคือต่อวงจรให้ถูกต้องเท่านั้นก็จะสามารถติดต่อกับเซนเซอร์ DHT11 ได้ในทันที เซนเซอร์ DHT11 มีคุณสมบัติมีดังนี้
- ใช้แรงดันไฟเลี้ยง +3 V ถึง +5.5 V และกระแสไฟฟ้า 2.5 mA
- วัดความชื้นสัมพัทธ์ได้ 20 ถึง 80% RH ความผิดพลาด ±5% RH และมีความละเอียดในการวัด 1% ขนาดของข้อมูล 8 บิต
- วัดอุณหภูมิได้ 0 ถึง 50 องศาเซลเซียส ความผิดพลาด ±2 องศาเซลเซียส ความละเอียดในการวัด 1 องศาเซลเซียส ขนาดของข้อมูล 8 บิต
- อัตราการสุ่มวัด 1 ครั้งต่อวินาที
- ความเร็วในการตอบสนองต่อการเปลี่ยนแปลงในการวัด 6 ถึง 30 วินาที
ฟังก์ชั่นของโปรแกรมที่ควรทราบ
● pinMode
ฟังก์ชั่น pinMode เป็นฟังก์ชั่นในการตั้งค่าโหมดการทำงานให้กับขาต่างๆ ของ Arduino Mega 2560เช่น Input, Output หรือ Input_Pullup
Syntax:
pinMode\(pin, mode\)
Parameter:
pin: หมายเลขขาที่ต้องการตั้งค่าใช้งาน
mode: INPUT : ตั้งขาเป็นอินพุต โดยต่อแบบ Pull Down
INPUT_PULLUP : ตั้งขาเป็นอินพุตที่ต่อแบบ Pull Up ใช้ตัวต้านทาน Pull Up ภายในของบอร์ด
OUTPUT : ตั้งขาเป็นเอาท์พุต
● digitalRead
ฟังก์ชั่น digitalRead เป็นฟังก์ชั่นที่ใช้ในการอ่านค่าลอจิกของขาที่ต้องการ ซึ่งจะต้องถูกตั้งโหมดให้เป็น INPUT หรือ INPUT_PULLUP
Syntax:
digitalRead\(pin\)
Parameter:
pin: หมายเลขขาที่ต้องการใช้งานอ่านค่าสถานะ
Return:
HIGH: เมื่ออ่านค่าลอจิกได้เป็น ‘1’ หรือ HIGH
LOW: เมื่ออ่านค่าลอจิกได้เป็น ‘0’ หรือ LOW
● isnan
ฟังก์ชั่น isnan เป็นฟังก์ชั่นตรวจสอบว่าค่าของตัวแปรเป็นตัวเลขตัวเลขหรือไม่ โดยจะให้ผลลัพธ์เป็นค่า Integer “1” เมื่อตัวแปรไม่เป็นตัวเลข (Not-a-Number: NaN) และ “0” เมื่อเป็นตัวเลข
Syntax:
isnan\(var\)
การทดลองที่ 1
การทดลองการใช้งาน Digital Input
1.1 ต่อสวิตช์ ดังภาพ
1.2 เปิดโปรแกรม Arduino IDE แล้วคลิกที่เมนู File -> New File
1.3 เขียนโค้ดลงไปในโปรแกรมดังนี้
#define button 2 // switch input Active Low
#define pressed LOW
voidsetup()
{
Serial.begin(9600);
pinMode(button,INPUT_PULLUP);
}
voidloop()
{
boolReadSwitch= digitalRead(button);
if(ReadSwitch== pressed)
{
Serial.println("Pressed Switch.");
delay(500);
}
}
คำอธิบายโปรแกรม
การกำหนด #defineใน 2 บรรทัดแรก กำหนดให้ขาหมายเลข 2 ของบอร์ดต่อกับสวิตช์ปุ่มกด (button) และกำหนดให้คำว่า pressed แทนลอจิก LOW เนื่องจากในการทดลองนี้เราต่อสวิตช์แบบ Input Pullup ซึ่งทำงานแบบ Active Low นั่นคือสถานะลอจิกเป็น LOW ขณะกดปุ่ม
ส่วนที่อยู่ในฟังก์ชั่นหลัก setup() คือการเริ่มต้นตั้งค่าต่างๆ ได้แก่ความเร็วในการเชื่อมต่อผ่านสาย Serial ที่ความเร็ว 9,600 บิตต่อวินาที และการกำหนดให้ขา button หรือขาหมายเลข 2 ตามที่กำหนดใน #define ให้เป็นแบบ Input Pullupในส่วนภายใน setup() นี้ จะทำงานจากบรรทัดบนไปสู่บรรทัดล่างโดยไม่มีการวนลูป
ส่วนที่อยู่ภายในฟังก์ชั่นหลัก loop() จะทำงานวนลูปไปเรื่อยๆตามลำดับไม่สิ้นสุด โดยในการทดลองนี้ เราจะวนลูปเพื่ออ่านค่าลอจิกจากขา button ด้วยคำสั่ง digitalRead มาเก็บไว้ในตัวแปลแบบ Boolean ชื่อ ReadSwitch แล้วทำการตรวจสอบเงื่อนไขของค่าลอจิกที่อ่านได้ด้วยคำสั่งควบคุม if หากมีการกดปุ่ม (pressed = LOW) จะทำงานในคำสั่ง Serial.print เพื่อส่งข้อความ "Pressed Switch." ไปแสดงผลที่หน้าจอจากนั้นจะหน่วงเวลาไว้ 500 ms ก่อนจะวนลูปซ้ำ
1.4 คลิกที่ปุ่มเพื่อคอมไพล์โค้ด แล้วทำการบันทึกไฟล์เป็น “DigitalInput” ไว้ที่ Desktop ดังภาพตัวอย่างด้านล่าง เมื่อคอมไพล์เสร็จสิ้นและไม่มีข้อผิดพลาด ทำการอัพโหลดโดยคลิกปุ่ม
1.5 จากนั้นให้คลิกที่ปุ่ม (Serial monitor) และทำการกดสวิตช์ค้างไว้สังเกตผลลัพธ์บนจอดังภาพ
การทดลองที่ 2
การใช้งานเซนเซอร์ DHT11
2.1 ต่อเซนเซอร์ DHT11 เข้ากับบอร์ด ดังแสดงในภาพ
2.2 เปิดโปรแกรม Arduino IDE เพื่อติดตั้ง Library ของ DHT11 โดยไปที่เมนู Sketch -> Include Library -> Manage Libraries
2.3 พิมพ์ DHT11 ในช่องค้นหา แล้วคลิกที่ผลลัพธ์ DHT sensor library by Adafruit จากนั้นคลิก Install
2.4 เขียนโปรแกรมใหม่โดยไปที่เมนู File -> New File
2.5 เขียนโค้ดลงไปในสเก็ตช์ดังต่อไปนี้
#include"DHT.h"
#define DHTPIN 3 // what digital pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHTdht(DHTPIN, DHTTYPE);
voidsetup()
{
Serial.begin(115200);
dht.begin(); // ทำการเริ่มต้นเรียกใช้งานLibrary DHT11 โดยจะเป็นLibrary สำเร็จรูปมีฟังชั่นสำหรับการใช้งานได้ง่าย
}
voidloop()
{
// Wait a few seconds between measurements.
delay(2000);
float Humidity =dht.readHumidity();
// Read temperature as Celsius (the default)
float Temp =dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(Humidity) ||isnan(Temp))
{
Serial.println("Failed to read from DHT sensor!"); // หากเกิดการผิดพลาดในการอ่านข้อมูลอาจจะด้วยจากสัญญาณรบกวนหรือการเชื่อมต่อที่ไม่สมบรูณ์
return;
}
else
{
Serial.print("Humidity: ");
Serial.print(Humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(Temp);
Serial.println(" *C ");
}
}
คำอธิบายโปรแกรม
การกำหนด #include เรียกใช้ Library ของ DHT(DHT.h)
#include"DHT.h"
การกำหนด #define กำหนดให้เรียกขาหมายเลข3 ของบอร์ดว่า DHTPIN และให้ DHTTYPE เรียกแทนคำว่า DHT11 แล้วประกาศ Object ของ DHT ด้วย dht(DHTPIN, DHTTYPE)
#define DHTPIN 3
#define DHTTYPE DHT11
DHTdht(DHTPIN, DHTTYPE);
ส่วนภายในฟังก์ชั่นหลัก setup() เป็นการเริ่มต้นตั้งค่าความเร็วในการเชื่อมต่อผ่าน Serial ที่ 115200 บิตต่อวินาที และเริ่มต้นเรียกใช้งาน Library DHT11 ด้วยคำสั่ง
voidsetup()
{
Serial.begin(115200);
dht.begin();
}
ส่วนภายในฟังก์ชั่นหลักloop() เริ่มจากคำสั่งหน่วงเวลา 2000 ms เพื่อเว้นระยะระหว่างการอ่านค่าแต่ละครั้ง จากนั้นสั่งอ่านค่าความชื้นจากเซนเซอร์ด้วยคำสั่ง dht.readHumidity() เก็บไว้ในตัวแปร Humidity และอ่านค่าอุณหภูมิด้วยคำสั่ง dht.readTemperature() เก็บค่าไว้ในตัวแปร Temp จากนั้นจะเข้าสู่คำสั่งควบคุม if, else เพื่อตรวจสอบเงื่อนไขว่าค่าความชื้นหรืออุณหภูมิที่ได้เป็นตัวเลขที่สามารถอ่านค่าได้หรือไม่ หากไม่เป็นให้พิมพ์ข้อความ Failed to read from DHT sensor! ไปยังหน้าจอ หากเป็นให้พิมพ์ค่าของความชื้นและอุณหภูมิออกมาและทำกระบวนการที่กล่าวมาวนซ้ำตามลำดับไปเรื่อยๆ
voidloop()
{
delay(2000);
float Humidity =dht.readHumidity();
float Temp =dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(Humidity) ||isnan(Temp))
{
Serial.println("Failed to read from DHT sensor!"); // หากเกิดการผิดพลาดในการอ่านข้อมูลอาจจะด้วยจากสัญญาณรบกวนหรือการเชื่อมต่อที่ไม่สมบรูณ์
return;
}
else
{
Serial.print("Humidity: ");
Serial.print(Humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(Temp);
Serial.println(" *C ");
}
}
2.6 คอมไพล์โค้ดและบันทึกไฟล์ไว้บน Desktop โดยในตัวอย่างที่แสดงตั้งชื่อไฟล์เป็น “DHT11” หากไม่มีข้อผิดพลาดอัพโหลดไฟล์โปรแกรมลงบนบอร์ด
2.7 คลิกปุ่ม (Serial monitor) จะได้ผลลัพธ์บนหน้าจอดังภาพ
สรุปผล
ในการทดลองนี้เราทดลองใช้งาน Digital Input ของบอร์ด Arduino Mega 2560 โดยในส่วนแรกอ่านค่าสถานะของสวิตช์และในส่วนที่สอง อ่านค่าอุณหภูมิกับความชื้นจากเซนเซอร์ DHT11 โดยนอกจากผู้ศึกษาจะได้เรียนรู้วิธีการต่อวงจรแล้ว ยังได้ทดลองเรียกใช้ Library ของ DHT11 มาใช้งานเพื่อให้เขียนโปรแกรมได้สั้นและง่ายยิ่งขึ้น
แบบฝึกหัดทดสอบความเข้าใจ
- คำสั่งอะไรที่ใช้ในการอ่านค่าจากสวิตช์
- หากแก้ไขโค้ดจาก #define pressed LOW ให้เป็น #define pressed HIGH จะเกิดอะไรขึ้น
- คำสั่งอะไรในการทดลองที่ใช้ในการอ่านค่าอุณหภูมิกับความชื้นของ DHT11
- เขียนโค้ดโดยประยุกต์จากโค้ดในการทดลองโดยให้กดปุ่มสวิตช์แล้วแสดงผลค่าอุณหภูมิและความชื้น
เฉลย - แบบฝึกหัดทดสอบความเข้าใจ
- digitalRead(button);
- เมื่อไม่ได้กดปุ่มสวิตช์หน้าจอจะแสดงข้อความ Pressed Switch แต่เมื่อกดปุ่มแล้วจะไม่มีข้อความใดปรากฏ
- float Humidity =dht.readHumidity(); อ่านค่าความชื้นและ float Temp =dht.readTemperature(); อ่านค่าอุณหภูมิ
- เขียนโค้ดได้ดังนี้
#include"DHT.h"
#define button 2 // switch input Active Low
#define DHTPIN 3 // what digital pin we're connected to
#define DHTTYPE DHT11 // DHT 11
#define pressed LOW
DHTdht(DHTPIN, DHTTYPE);
voidsetup()
{
Serial.begin(115200);
dht.begin();
pinMode(button,INPUT_PULLUP);
}
voidloop()
{
boolReadSwitch=digitalRead(button);
if(ReadSwitch== pressed)
{
Serial.println("Pressed Switch.");
// Wait a few seconds between measurements.
delay(2000);
float Humidity =dht.readHumidity();
// Read temperature as Celsius (the default
float Temp =dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(Humidity) ||isnan(Temp))
{
Serial.println("Failed to read from DHT sensor!");
return;
}
else
{
Serial.print("Humidity: ");
Serial.print(Humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(Temp);
Serial.println(" *C ");
}
}
}
VDO Link : https://www.youtube.com/watch?v=6swPWVwEKjE&t=3s