ESP32 มักจะถูกใช้ในงาน IoT (Internet of Things) ซึ่งเป็นงานที่จะนำอุปกรณ์อิเล็กทรอนิกส์ไปฝังลงในอุปกรณ์ต่าง ๆ เพื่อทำให้อุปกรณ์เหล่านั้นฉลาดมากยิ่งขึ้น โดยส่วนใหญ่แล้วการจะทำให้อุปกรณ์เหล่านั้นฉลาดมากขึ้นจะต้องใช้งานเซ็นเซอร์ในการตรวจวัดเพื่อประมวลผลการทำงานต่าง ๆ รวมถึงในงาน Smart Farm ที่ต้องใช้เซ็นเซอร์เกี่ยวกับอุณหภูมิและความชื้นเพื่อควบคุมการเจริญเติบโตของพืช ส่วนงานด้านการผลิตในโรงงานมักจะใช้เซ็นเซอร์ในการตรวจจับสี ตรวจจับวัตถุเพื่อประมวลผลแยกสิ่งของออกจากสายพาน หรือตีเป็นสิ่งของชำรุต่าง ๆ
สำหรับในบทนี้ก็จะมากล่าวถึงเซ็นเซอร์ต่าง ๆ ที่ใช้ในงานด้าน IoT และด้าน Smart Home ซึ่งการเรียนรู้ในบทนี้จะปูพื้นฐานการใช้งานเซ็นเซอร์เพื่อนำค่าต่าง ๆ ที่ได้ไปใช้งานในบทถัด ๆ ไป
ภายใน ESP32 เองก็มีเซ็นเซอร์ต่าง ๆ ที่เราสามารถใช้ฟังก์ชั่นเข้าไปเรียกใช้งานตรง ๆ ได้ ข้อดีของการใช้เซ็นเซอร์ที่มีมาภายในทำให้ไม่มีข้อจำกัดเรื่องความเร็วของบัสที่ใช้เชื่อมต่อ เนื่องจากเซ็นเซอร์ที่อยู่ภายในชิปไอซีเดียวกับ CPU จะเชื่อมต่อโดยตรงกับ CPU ทำให้สามารถทำงานได้รวดเร็วมาก
เซ็นเซอร์สัมผัส หรือ Capacitive Touch เป็นเซ็นเซอร์มีมาใน ESP32 อยู่แล้ว มีให้ใช้งานทั้งหมด 10 ช่อง สามารถนำมาใช้งานแทนสวิตซ์ได้ โดยหลักการแล้ว Capacitive Touch จะอาศัยการตรวจจับค่าการเปลี่ยนแปลงของค่าประจุไฟฟ้า เมื่อมีการสัมผัสเกิดขึ้นจะทำให้ค่าประจุไฟฟ้ามีค่าลดลง และด้วยค่าประจุไฟฟ้าที่ลดลงนี้เองทำให้สามารถตรวจจับการสัมผัสได้
การใช้งานสามารถกดไปที่ File > Examples > ESP32 > Touch แล้วเลือก TouchRead
จากนั้นอัพโหลดโค้ดลงบอร์ด NodeMCU-32S ได้เลย แล้วเปิด Serial Monitor ขึ้นมา ปรับเป็น 115200 band จะพบค่าตัวเลขแสดงออกมาอย่างต่อเนื่อง
นำสายจั้มมาต่อที่ขา T0 หรือ GPIO4 (ให้ดูตาม Pinout) จากนั้นลองสัมผัสปลายสาย จะพบว่าค่าได้ลดลง
และโค้ดที่แสดงดังต่อไปนี้ เป็นโค้ดที่ได้ทดลองไปแล้ว โดยตัดส่วนที่ไม่เกี่ยวข้องออกแล้ว
บรรทัดที่ 1 สร้างฟังก์ชั่น setup
บรรทัดที่ 2 เริ่มใช้งาน UART0 โดยกำหนดความเร็วไว้ที่ 115200
บรรทัดที่ 3 หน่วงเวลา 1 วินาที
บรรทัดที่ 4 แสดงผลออกไปที่ Serial Monitor
บรรทัดที่ 5 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 7 สร้างฟังก์ชั่น loop
บรรทัดที่ 8 ใช้ฟังก์ชั่น touchRead() อ่านค่าการสัมผัสจากช่อง T0 แล้วแสดงผลไปที่ Serial Monitor
บรรทัดที่ 9 หน่วงเวลา 1 วินาที
บรรทัดที่ 10 จบคำสั่งในฟังก์ชั่น loop
ทั้งนี้ในการใช้งานจริงจะต้องใช้คำสั่ง if มาตรวจสอบและตัดสินว่าหากค่าน้อยกว่าเท่าใดจึงจะถือเป็นการสัมผัส และสามารถต่อเข้ากับแผ่นโลหะนำไฟฟ้าเพื่อเพิ่มพื้นที่การตรวจวัดได้ นอกจากนี้ยังสามารถนำไปฝังไว้ใต้วัสดุบางอื่น ๆ เพื่อใช้งานจริงได้อีกด้วย
เซ็นเซอร์วัดอุณหภูมิและความชื้นถือเป็นเซ็นเซอร์พื้นฐานที่ผู้เริ่มต้นควรใช้งานให้เป็น จนบางครั้งมักมีการกล่าวเล่น ๆ ว่า “ถ้าวัดอุณหภูมิไม่ได้ ใม่ใช่ IoT”
รูปที่ 7.1 เซ็นเซอร์วัดอุณหภูมิและความชื้นรุ่น DHT11 (รูปซ้าย) และ DHT22 (รูปขวา)
เซ็นเซอร์วัดอุณหภูมิและความชื้นยอดนิยมคือเบอร์ DHT11/DHT22 ด้วยราคาที่ถูก ทำให้สามารถซื้อหามาทดลองได้ง่าย รวมทั้งเซ็นเซอร์ DHT11/DHT22 จะสามารถวัดค่าความชื้นได้ด้วย ทำให้สามารถนำไปใช้งานในด้าน Smart Farm ได้ด้วย
เซ็นเซอร์วัดอุณหภูมิตระกูล DHT จะแบ่งได้หลายรุ่น โดยแต่ละรุ่นจะมีขนาด และความละเอียดในการวัดต่างกัน สำหรับรุ่น DHT11 และ DHT22 ที่ยกมานี้ จะมีความแตกต่างที่ DHT22 จะวัดค่าได้ความละเอียด 0.1 องศาเซลเซียส แต่ DHT11 จะวัดได้ที่ความละเอียด 1 องศาเซลเซียส ทั้งนี้ราคาของ DHT11 และ DHT22 จะห่างกันไม่มากนัก ผู้เขียนแนะนำให้ใช้งาน DHT22 จะทำให้ได้ค่าที่ละเอียดและการนำไปประมวลผลจะแม่นยำมากขึ้น
การใช้งาน DHT11/DHT22 จะใช้สายสัญญาณเพียง 1 เส้นเป็นการสื่อสารแบบอนุกรมใช้โปรโตคอลพิเศษที่เรียกว่า 1-wire โดยจะใช้ความกว้างของสัญญาณพัลส์เป็นตัวตัดสินลอจิก 1 และ 0 มีขาออกให้ใช้งานจำนวน 4 ขา แต่ใช้จริง 3 ขา แบ่งเป็นขา VCC DATA และ GND
รูปที่ 7.2 ขาต่อใช้งานต่าง ๆ ของ DHT22
ในการใช้งาน DHT11/DHT22 จะมีไลบารี่หลายตัวที่ทำออกมารองรับ สำหรับไลบารี่นิยมใช้งานกับมากที่สุดจะเป็นของ Adafruit สามารถดาวน์โหลดมาใช้งานได้ใน Library Manager ที่มีมาในโปรแกรม Arduino เอง
ในการทดลอง ให้ต่อวงจรตามรูปด้านล่างนี้ โดย DHT11 และ DHT22 ตำแหน่งขาที่เหมือนกัน ทำให้ต่อวงจรได้แบบเดียวกัน
จากวงจรจะสังเกตได้ว่าขาริมซ้ายสุดซึ่งนับเป็นขา 1 จะเป็นขา VCC หรือขาจ่ายไฟเลี้ยงโดยรองรับแรงดันตั้งแต่ 3.3V ถึง 6V และใช้กระแสไฟฟ้าประมาณ 1.5mA ส่วนขาที่ 2 เป็นขา DATA ใช้รับ-ส่งข้อมูลมีตัวต้านทานต่อแบบ Pull-up ไว้เพื่อป้องกันการรับ-ส่งข้อมูลผิดพลาด และขาที่ 4 เป็นขากราว์ด
หลังจากต่อวงจรเรียกร้อยแล้ว ที่โปรแกรม Arduino กดไปที่เมนู Sketch > Include Library เลือก Manage Libraries…
จากนั้นรอโปรแกรมอัพเดทรายชื่อไลบารี่ซักครู่หนึ่ง จากนั้นในช่องค้นหา ให้พิมพ์ DHT แล้วเลือกที่จัดทำโดย Adafruit เลือกเวอร์ชั่น 1.2.3 จากนั้นกดปุ่ม Install
หลังจากติดตั้งเสร็จแล้วจะแสดงคำว่า INSTALLED สามารถปิดหน้าต่าง Library Manager ได้เลย
จากนั้นกดไปที่ File > Examples > DHT sensor library เลือก DHTtester
ในบรรทัดที่ 6 แก้หมายเลข 2 เป็นหมายเลข 23 (เนื่องจากในวงจรต่อขา DATA ไว้ที่ขา GPIO23) และในบรรทัดที่ 10 หากใช้ DHT11 ต้องแก้เป็น DHT11 ด้วย
จากนั้นให้อัพโหลดลงบอร์ด NodeMCU-32S แล้วเปิด Serial Monitor ขึ้นมา ปรับเป็น 9600 band จากนั้นจะพบค่าอุณหภูมิที่วัดได้ขึ้นมาแล้ว
ต่อไปเรามาดูกันว่าโค้ดแต่ละบรรทัดคืออะไรกัน โดยโค้ดที่ยกมาด้านล่างนี้ ตัดส่วนคอมเม้นออกทั้งหมดแล้ว
บรรทัดที่ 1 เรียกใช้ไลบารี่ DHT.h
บรรทัดที่ 3 ใช้คำสั่ง #define แทนที่ DHTPIN ด้วย 23 โดยตรงส่วนนี้ใช้กำหนดขาที่ต่อกับ DATA
บรรทัดที่ 4 ใช้คำสั่ง #define แทนที่ DHTTYPE ด้วย DHT22 โดยตรงส่วนนี้ใช้กำหนดรุ่นของ DHT
บรรทัดที่ 6 ประกาศให้ใช้ไลบารี่ DHT ด้วยออปเจค dht และกำหนดขา รุ่น ในบรรทัดนี้
บรรทัดที่ 8 สร้างฟังก์ชั่น setup
บรรทัดที่ 9 เริ่มต้นใช้งาน UART0 โดยใช้ความเร็ว 9600
บรรทัดที่ 10 ส่งข้อความออกไปทาง Serial Monitor
บรรทัดที่ 12 ใช้คำสั่งเริ่มใช้งาน DHT
บรรทัดที่ 13 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 15 สร้างฟังก์ชั่น loop
บรรทัดที่ 16 หน่วงเวลา 2 วินาที
บรรทัดที่ 18 อ่านค่าความชื้นแล้วนำมาเก็บลงตัวแปร h
บรรทัดที่ 19 อ่านค่าอุณหภูมิในหน่วยองศาเซลเซียสแล้วนำมาเก็บลงตัวแปร t
บรรทัดที่ 20 อ่านค่าอุณหภูมิในหน่วยองศาฟาเรนไฮต์แล้วนำมาเก็บลงตัวแปร f
บรรทัดที่ 22 ใช้คำสั่ง if ตรวจสอบค่าว่างในตัวแปร h t และ f ถ้าว่างจะทำในบรรทัดที่ 23 – 24
บรรทัดที่ 23 ส่งข้อความไปที่ Serial Monitor
บรรทัดที่ 24 ยกเลิกลูปรอบนั้นด้วยคำสั่ง return ทำให้คำสั่งที่อยู่ด้านล่างไม่ถูกทำต่อ
บรรทัดที่ 25 จบคำสั่งใน if
บรรทัดที่ 27 ใช้ตัวแปร f และ h แปลงเป็นค่า Heat Index ในหน่วยลงองศาฟาเรนไฮต์
บรรทัดที่ 28 ใช้ตัวแปร t และ h แปลงเป็นค่า Heat Index ในหน่วยลงองศาเซลเซียส
บรรทัดที่ 30 – 42 แสดงผลตัวแปรและข้อความต่าง ๆ ไปยัง Serial Monitor
บรรทัดที่ 43 จบคำสั่งในฟังก์ชั่น loop
เมื่อนำไปใช้งานจริง ท่านสามารถตัดส่วนที่ไม่ใช้งานออกไป ซึ่งจะทำให้โค้ดนั้นสั้นลงได้มาก
รูปที่ 7.3 ไอซีเซ็นเซอร์วัดอุณหภูมิ DS18B20 ตัวถัง TO-92
DS18B20 เป็นไอซีวัดค่าอุณหภูมิที่มีความละเอียดระดับ 0.1 องศาเซลเซียส มีขนาดเล็กมากโดยตัวถังเป็นเป็นแบบ TO-92 รองรับการวัดอุณหภูมิที่ -55 องศาเซลเซียสถึง +125 องศาเซลเซียส รองรับแรงดันไฟฟ้า 3.0V ถึง 5.5V สื่อสารผ่านโปรโตคอล 1-wire มีขาต่อใช้งานทั้งหมด 3 ขา สำหรับขาที่ใช้ส่งข้อมูลจะชื่อว่า DQ และต้องต่อตัวต้านทาน Pull-up ไว้ด้วย ไอซีแต่ละตัวจะมีหมายเลขประจำตัวไม่เหมือนกัน ในการใช้งานสามารถใช้สามารถเส้นเดียวเพื่อสื่อสารหลาย ๆ ตัวได้
ตัววัดอุณหภูมิ DS18B20 อาจจะหมายถึงเฉพาะตัวไอซี หรือหมายถึงสายพร้อมหัววัดในน้ำก็ได้ สำหรับแบบที่เป็นสายวัดมักมีสาย 3 เส้น 3 สี คือ แดง เป็นสายสำหรับจ่ายไฟ สายสีฟ้า หรือสีเหลือง เป็นขา DQ และสายสีดำเป็นกราว์ด
รูปที่ 7.4 เซ็นเซอร์วัดอุณหภูมิ DS18B20 แบบหัววัดกันน้ำ
สำหรับการทดลองครั้งนี้จะเลือกใช้แบบสายพร้อมหัววัด เนื่องจากได้รับความนิยมมากกว่า การต่อใช้งานสามารถต่อได้ตามวงจรต่อไปนี้
จากนั้นให้ติดตั้งไลบารี่ DallasTemperature โดยใช้วิธีการติดตั้งแบบเดียวกับหัวข้อ การใช้งานเซ็นเซอร์วัดอุณหภูมิ DHT11/DHT22 เพียงแต่เปลี่ยนคำค้นหาเป็น DallasTemperature
เมื่อติดตั้งไลบารี่เสร็จแล้ว ให้เข้าไปคัดลอกโค้ดที่เว็บ https://goo.gl/ffoVZr แล้วบันทึกให้เรียบร้อย จากนั้นไปแก้โค้ดในบรรทัดที่ 11 โดยเปลี่ยนเลข 2 เป็นเลข 23 (เนื่องจากต่อขา DQ ไว้ที่ GPIO23) แล้วอัพโหลดโค้ดโปรแกรมลงบอร์ด NodeMCU-32S ให้เรียบร้อย
หลังจากอัพโหลดโค้ดลองบอร์ดเรียบร้อยแล้ว ให้เปิด Serial Monitor ขึ้นมา จากนั้นปรับไปที่ 9600 band จะพบค่าอุณหภูมิที่วัดได้แสดงขึ้นมา
เมื่อนำหัววัดมาจุ่มลงในน้ำเย็น พบว่าสามารถตอบสนองค่าความเปลี่ยนแปลงได้อย่างรวดเร็ว
จากโค้ดที่ได้ทดลอง เมื่อนำมาตัดส่วนคอมเม้นออก จะได้โค้ดดังนี้
บรรทัดที่ 1 เรียกใช้ไลบารี่ OneWire.h
บรรทัดที่ 2 เรียกใช้ไลบารี่ DallasTemperature.h
บรรทัดที่ 4 ประกาศแทนที่ ONE_WIRE_BUS ด้วยเลข 23
บรรทัดที่ 6 เรียกใช้ไลบารี่ OneWire โดยใช้ชื่อออปเจค oneWire
บรรทัดที่ 7 เรียกใช้ไลบารี่ DallasTemperature โดยใช้ชื่อออปเจค sensors
บรรทัดที่ 9 สร้างฟังก์ชั่น setup
บรรทัดที่ 10 ใช้ฟังก์ชั่นเริ่มต้นใช้งาน UART0 โดยใช้ความเร็ว 9600
บรรทัดที่ 11 ส่งข้อความไปที่ Serial Monitor
บรรทัดที่ 12 เริ่มใช้งานสื่อสารกับ DS18B20
บรรทัดที่ 13 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 15 สร้างฟังก์ชั่น loop
บรรทัดที่ 16 ใช้ฟังก์ชั่นอ่านค่าอุณหภูมิจาก DS18B20 ที่ต่ออยู่ทุกตัว
บรรทัดที่ 17 ส่งข้อความไปที่ Serial Monitor
บรรทัดที่ 18 ดึงค่าอุณหภูมิจากที่อ่านได้ตัวแรกขึ้นมาแสดงผลใน Serial Monitor
บรรทัดที่ 19 หน่วงเวลา 1 วินาที
บรรทัดที่ 20 จบคำสั่งในฟังก์ชั่น loop
เซ็นเซอร์วัดแสงสว่าง ถือเป็นเซ็นเซอร์ยอดนิยมที่ใช้งานในด้าน IoT ที่ใช้เป็น Node เซ็นเซอร์ Smart Farm ใช้ร่วมกับการประเมินการเติบโตของพืชจากการคายน้ำ และ Smart Home สำหรับเปิด – ปิดไฟอัตโนมัติ เซ็นเซอร์วัดแสงสว่างมีให้เลือกใช้งานหลายแบบ ซึ่งแต่ละแบบจะมีการเชื่อมต่อกับไมโครคอนโทรลเลอร์ที่แตกต่างกัน และการเขียนโปรแกรมเพื่อใช้งานแตกต่างกัน
รูปที่ 7.5 ตัวต้านทานแปรค่าตามแสง (LDR)
LDR ย่อมาจาก Light Dependent Resistor หรือมักเรียกว่า ตัวต้านทานแปรค่าตามแสง หลักการทำงานคือเมื่อมีแสงมาตกกระทบที่หน้าวัด ค่าความต้านทานของตัวมันจะลดลง เมื่อนำไปต่อใช้งานแบบวงจรแบ่งแรงดันก็จะสามารถใช้วัดค่าความเข้มของแสงได้จากการเปลี่ยนแปลงของแรงดัน
ตัว LDR นั้นมีขาใช้งานจำนวน 2 ขา และมีขนาดให้เลือกใช้ได้หลากหลายแต่ที่สามารถพบเห็นได้บ่อย ๆ คือขนาด 5 มิลิเมตร และ 12 มิลิเมตร โดยการใช้งานแต่ละขนาดจะเหมือนกัน
เนื่องจากการใช้งานจะตรวจวัดความเปลี่ยนแปลงของแรงดันไฟฟ้า ดังนั้นเมื่อนำมาใช้กับ ESP32 จะต้องต่อเข้ากับขาที่รองรับ ADC ซึ่งข้อดีของการใช้ ADC ของ ESP32 คือมีความละเอียดมากทำให้สามารถวัดได้ค่าที่ละเอียดมากขึ้น
ในการทดลองต่อไปนี้ จะใช้ LDR ขนาด 12 มิลิเมตร สามารถต่อวงจรได้ดังนี้
จากนั้น ให้เปิดที่ตัวอย่าง AnalogReadSerial ขึ้นมา แล้วเพิ่ม analogReadResolution(16); ลงไปในฟังก์ชั่น setup จากนั้นอัพโหลดลงบอร์ด NodeMCU-32S
หลังจากอัพโหลดแล้ว ให้เปิด Serial Plotter ปรับไปที่ 9600 band แล้วเมื่อเปลี่ยนแปลงแสงที่ไปตกกระทบกับ LDR จะพบว่าค่าที่ขึ้นในกราฟเปลี่ยนไป
ทั้งนี้โค้ดที่ใช้ทดลองมีหน้าที่เพียงอ่านค่า ADC ออกมาเท่านั้น สามารถย้อนกลับไปอ่านหัวข้อ การใช้งาน ADC เพื่ออ่านรายละเอียดได้
รูปที่ 7.6 โมดูล GY-302
BH1750 เป็นเซ็นเซอร์วัดแสงสว่างที่ผลิตโดย ROHM Semiconductor ใช้การเชื่อมต่อกับไมโครคอนโทรลเลอร์ผ่าน I2C ให้ผลการวัดในหน่วยลักซ์ (Lux) ทำให้สามารถนำไปใช้งานต่อได้ง่าย ตัวเซ็นเซอร์ภายในใช้โฟโต้ไดโอด และใช้วงจร ADC ค่าความละเอียด 16 บิต สามารถใช้งานได้ที่แรงดันไฟฟ้า 2.4V ถึง 3.6V ใช้กระแสไฟฟ้า 200uA
แต่สำหรับโมดูล GY-302 ที่ใช้ในการทดลองครั้งนี้จะมีไอซีเรกกูเลเตอร์แบบ LDO ที่สามารถแปลงแรงดันในช่วง 3.3V ถึง 5V ให้อยู่ที่ 3.3V ได้ ทำให้สามารถใช้งานกับอุปกรณ์ที่ใช้แรงดันไฟฟ้า 5V ได้ นอกจากนี้ตัวโมดูลยังต่อตัวต้านทาน Pull-up มาให้ที่ชา SCL SDA มาให้แล้ว ทำให้ไม่ต้องต่อสายเพิ่มเติมอีก นอกจากนี้ยังต่อขาสำหรับเลือก Address ออกให้ด้วย ทำให้สามารถใช้งานโมดูล 2 ตัวได้พร้อมกัน
การใช้งาน สามารถต่อใช้งานแบบ I2C ได้เลย โดยเลือกขา SCL และ SDA ที่ต้องการต่อ แต่สำหรับตัวอย่างนี้จะเลือกใช้ขาตาม Pinout ทำให้ไม่ต้องกำหนดขาในโค้ดโปรแกรมอีก จึงสามารถต่อวงจรได้ดังนี้
สำหรับตัว BH1750 จะไม่มีไลบารี่สำเร็จรูปให้ เนื่องจากการใช้งานสามารถทำได้ง่าย เพียงระบุตำแหน่ง Address ของอุปกรณ์ ระบุรีจิสเตอร์ แล้วสามารถอ่านข้อมูลออกมาได้เลย โค้ดตัวอย่างสามารถเข้าไปคัดลอกได้ที่ลิ้ง https://goo.gl/Y6YR9i หากต้องการแก้ไขขา SDA และ SCL สามารถแก้ไขได้ในบรรทัดที่ 15 แล้วอัพโหลดโค้ดลงบอร์ด NodeMCU-32S ได้เลย
หลังจากอัพโหลดโค้ดเรียบร้อยแล้ว ให้เปิด Serial Monitor ขึ้นมา แล้วปรับเป็น 9600 band จะพบค่าแสงที่อ่านได้แสดงขึ้นมาแล้ว
โค้ดที่ได้ใช้ในการทดลองมีดังนี้ การใช้งานหลัก ๆ คือไปเรียกฟังก์ชั่น readBH1750() แล้วเอาค่าที่ได้ไปใช้ต่อได้เลย
บรรทัดที่ 1 เรียกใช้ไลบารี่ Wire.h เพื่อใช้ติดต่อกับอุปกรณ์ผ่าน I2C
บรรทัดที่ 3 ประกาศแทน BH1750_ADDR ด้วย 0x23 ส่วนนี้ใช้กำหนด Address ของ BH1750
บรรทัดที่ 5 สร้างฟังก์ชั่นย่อยที่รับค่าพารามิเตอร์ dev_addr เข้ามา และส่งกลับเป็นข้อมูลชนิด int
บรรทัดที่ 6 ใช้ฟังก์ชั่นเริ่มต้นการสื่อสารกับอุปกรณ์ที่มี Address ตามค่าในตัวแปร dev_addr
บรรทัดที่ 7 ใช้ฟังก์ชั่นส่งข้อมูล 0x10 ออกไป (ข้อมูลเพิ่มเติมจำเป็นต้องอ่านจาก Datasheet ของอุปกรณ์)
บรรทัดที่ 8 ใช้ฟังก์ชั่นจบการรับ-ส่งข้อมูลผ่าน I2C พร้อมใช้ if ตรวจสอบสถานนะว่าสำเร็จหรือไม่ ถ้าไม่สำเร็จ (คือฟังก์ชั่นใช้จบค่าไม่ได้ส่งกลับค่า 0 มา) จะส่งค่า -1 ออกจากฟังก์ชั่นไป
บรรทัดที่ 9 หน่วงเวลา 200 มิลิวินาที เพื่อรอให้อุปกรณ์เริ่มอ่านและประมวลผลค่าแสงเสร็จ
บรรทัดที่ 10 ร้องขอข้อมูลจากอุปกรณ์ที่มี Address ตามตัวแปร dev_addr และขอข้อมูลจำนวน 2 ไบต์
บรรทัดที่ 11 ใช้ Ternary Operators เปรียบเทียบข้อมูลที่ส่งกลับมาว่ามีมากกว่าหรือเท่ากับ 2 ไบต์หรือไม่ ถ้าใช่ จะส่งกลับข้อมูลที่อ่านได้ออกไป แต่ถ้าไม่ใช่ จะถือว่ารับ-ส่งข้อมูลไม่สำเร็จ และส่งค่า -1 กลับไป ซึ่งค่าที่ส่งกลับไปจะใช้คำสั่ง return เพื่อส่งกลับค่าออกจากฟังก์ชั่นไปใช้งานต่อไป
บรรทัดที่ 12 จบคำสั่งในฟังก์ชั่นย่อย
บรรทัดที่ 14 สร้างฟังก์ชั่น setup
บรรทัดที่ 15 ใช้ฟังก์ชั่นเริ่มต้นใช้งานการสื่อสารแบบ I2C
บรรทัดที่ 16 ใช้ฟังก์ชั่นเริ่มต้นใช้งาน UART0 โดยใช้ความเร็ว 9600
บรรทัดที่ 17 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 19 สร้างฟังก์ชั่น loop
บรรทัดที่ 20 ส่งข้อความไปที่ Serial Monitor
บรรทัดที่ 21 ใช้ฟังก์ชั่นย่อย readBH1750() อ่านค่าแสงจาก BH1750 จากนั้นส่งข้อมูลที่ได้ไปที่ Serial Monitor
บรรทัดที่ 22 ส่งข้อความไปที่ Serial Monitor พร้อมขึ้นบรรทัดใหม่
บรรทัดที่ 23 หน่วงเวลา 1 วินาที
บรรทัดที่ 24 จบคำสั่งในฟังก์ชั่น loop
จะเห็นว่าฟังก์ชั่นหลัก ๆ ที่ใช้สื่อสารกับอุปกรณ์ผ่าน I2C เป็นฟังก์ชั่นที่ได้ศึกษากันไปแล้วในหัวข้อ การใช้งาน I2C ดังนั้นหากไม่เข้าใจฟังก์ชั่นใด ๆ ในบรรทัดที่ 6 ถึง 11 สามารถย้อนกลับไปอ่านรายละเอียดได้เลย
สำหรับเซ็นเซอร์วัดระยะห่าง สามารถนำไปใช้ในการวัดขนาดสิ่งของ ตรวจจับสิ่งกีดขวางได้ โดยในด้าน Smart Farm มักนำไปใช้วัดระดับน้ำในถังน้ำ หรือนำไปใช้วัดระดับน้ำในบ่อน้ำ เพื่อให้แจ้งเตือน หรือเติมนำอัตโนมัติ สำหรับเซ็นเซอร์วัดระยะห่างจะมีทั้งแบบใช้แสง และใช้คลื่นเสียง
รูปที่ 7.7 โมดูลวัดระยะห่างด้วยคลื่นอัลตร้าโซนิครุ่น US-100
US-100 เป็นเซ็นเซอร์วัดระยะห่างรุ่นยอดนิยมที่ไม่มีราคาไม่แพงนัก สามารถใช้งานได้ทั้งแรงดัน 3.3V และ 5V สำหรับเซ็นเซอร์วัดระยะห่างที่มีลักษณะใกล้เคียงกันมักจะใช้ได้เฉพาะแรงดันไฟฟ้า 5V ทำให้ไม่เหมาะสำหรับนำมาใช้งานร่วมกับ ESP32
เซ็นเซอร์วัดระยะห่างรุ่น US-100 ใช้คลื่นเสียงในย่านอัลตร้าโซนิคในการทำงาน โดยหลักการคือตัวส่งเมื่อส่งเสียงออกไปแล้วเสียงไปกระทบกับวัตถุแล้วจะทำให้คลื่นนั้นสะท้อนกลับมาแล้วตัวรับทำหน้าที่รับเข้ามา ค่าเวลาที่วัดได้หลังส่งออกไปแล้วรับกลับมาจะถูกนำไปคำนวณโดยเทียบกับความเร็วเสียงทำให้ได้ระยะห่างออกมา นอกจากนี้ความเร็วของเสียงยังขึ้นอยู่กับอุณหภูมิ ณ ขณะนั้นด้วย สำหรับ US-100 มีเซ็นเซอร์วัดอุณหภูมิมาในตัวที่จะมาแก้ไขค่าความผิดพลาดในการวัด ทำให้สามารถวัดค่าได้แม่นยำขึ้น ตัวเซ็นเซอร์สามารถวัดระยะได้ที่ 2 เซนติเมตรถึง 4.5 เมตร
ตัว US-100 สามารถใช้งานได้ 2 แบบ คือการใช้งานแบบ UART และใช้งานแบบทริกสัญญาณ โดยหากเสียบจั้มเปอร์ด้านหลังไว้ จะเป็นการใช้งานในโหมด UART แต่หากถอดออก จะเป็นการใช้งานในโหมดทริกสัญญาณ
รูปที่ 7.7 จั้มเปอร์สำหรับเลือกโหมดบัสสื่อสารของโมดูลวัดระยะห่างด้วยคลื่นอัลตร้าโซนิครุ่น US-100
ในทดลองใช้งาน US-100 ก่อนอื่นให้ถอดจั้มเปอร์บนโมดูล US-100 ออกก่อน จากนั้นต่อวงจรต่อไปนี้
จากนั้นคัดลอกโค้ดจากลิ้ง https://goo.gl/VKNbjD มาอัพโหลดลงบอร์ด NodeMCU-32S จากนั้นเปิด Serial Monitor ขึ้นมา ปรับไปที่ 115200 band จะพบว่าสามารถวัดระยะห่างได้แล้ว
โค้ดที่ใช้ทดลองมีทั้งหมดดังนี้
บรรทัดที่ 1 ประกาศให้แทนที่ US100_Trig_PIN ด้วย 22
บรรทัดที่ 2 ประกาศให้แทนที่ US100_Echo_PIN ด้วย 23
บรรทัดที่ 4 สร้างฟังก์ชั่น setup
บรรทัดที่ 5 กำหนดให้ขาใน US100_Trig_PIN เป็นเอาต์พุตแบบดิจิตอล
บรรทัดที่ 6 กำหนดให้ขาใน US100_Echo_PIN เป็นอินพุตแบบดิจิตอล
บรรทัดที่ 8 เริ่มใช้งาน UART0 ที่ความเร็ว 115200
บรรทัดที่ 9 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 11 สร้างฟังก์ชั่น loop
บรรทัดที่ 12 – 16 ทริกสัญญาณที่ขาใน US100_Trig_PIN เพื่อเริ่มให้ US100 ส่งสัญญาณเสียงออกไป
บรรทัดที่ 17 อ่านค่าความยาวของสัญญาณที่ขา US100_Echo_PIN เมื่อมีสถานะเป็น HIGH ในหน่วยไมโครวินาที แล้วนำไปเก็บลงตัวแปร PulseWidth
บรรทัดที่ 18 นำตัวแปร PulseWidth มาคำนวณเป็นระยะห่างในหน่วยมิลิเมตร แล้วนำค่าที่ได้มาเก็บลงตัวแปร distance
บรรทัดที่ 20 – 22 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 23 หน่วงเวลา 100 มิลิวินาที หรือ 0.1 วินาที
บรรทัดที่ 24 จบคำสั่งในฟังก์ชั่น loop
การวัดระดับน้ำในถังน้ำ ก่อนอื่นต้องวัดระยะห่างจากก้นถังจนถึงตัวเซ็นเซอร์ว่าห่างเท่าไร จากนั้นเมื่อมีน้ำอยู่ในถังระยะที่วัดได้จะลดลง เนื่องจากเซ็นเซอร์จะให้ค่าระยะออกมาเป็นระยะห่างระหว่างตัวเซ็นเซอร์กับระดับน้ำ เมื่อต้องการวัดความสูงของระดับน้ำสามารถทำได้โดยใช้สูตร
ส่วนใหญ่แล้วเซ็นเซอร์ตรวจจับการเคลื่อนไหวมักใช้ในงานด้าน IoT และ Smart Home โดยข้อมูลที่เซ็นเซอร์ได้รับมักนำไปแจ้งเตือน หรือนำไปควบคุมอุปกรณ์ต่าง ๆ ให้ทำงานได้อัตโนมัติ ทั้งนี้เซ็นเซอร์ตรวจจับความเคลื่อนไหวในตลาดมีไม่มากนัก จึงอาจนำเซ็นเซอร์แบบอื่น ๆ มาใช้งานแทน
PIR ย่อมาจาก Passive infrared เป็นการใช้เทคนิคการตรวจจับรังสีอินฟาเรดจากวัตถุต่าง ๆ ที่ปล่อยออกมา ซึ่งวัตถุนั้นจะมีความร้อนที่ต่างกัน จึงมีการนำเทคนิคนี้มาใช้ในการตรวจจับความเคลื่อนไหวของมนุษย์ โดยหากมีการเคลื่อนไหวเกิดขึ้นค่าความร้อนที่วัดได้จะมีการเปลี่ยนแปลงไปมา ตัวไอซีที่อยู่บนแผงเซ็นเซอร์จะทำหน้าที่ตัดสินค่าความร้อนที่เปลี่ยนไปมาเป็นสัญญาณดิจิตอลเพื่อให้สามารถนำไปใช้งานได้ง่ายมากขึ้น
เซ็นเซอร์ PIR มีให้เลือกใช้งานหลายรุ่นด้วยกัน แต่ละรุ่นจะมีความเสถียรและความแม่นยำในการตรวจจับที่แตกต่างกันไป สำหรับชุดบทความนี้จะแนะนำ PIR ที่ผลิตโดย Keyestudio มีความเสถียรภาพในการตรวจจับมา และมีประสิทธิ์ภาพในการทำงานอยู่ในระดับกลาง ๆ การใช้งานสามารถต่อไฟเลี้ยงได้ตั้งแต่ประมาณ 3V ถึง 5V และต่อสัญญาณเอาต์พุตแบบดิจิตอลมาใช้งานได้เลย
รูปที่ 7.8 เซ็นเซอร์ PIR จากผู้ผลิต Keyestudio
สำหรับตัวอย่างการใช้งานให้ต่อวงจรตามรูปนี้
จากนั้นให้เปิดตัวอย่าง DigitalReadSerial ขึ้นมา ในบรรทัดที่ 9 แก้จากเลข 2 เป็น 23 จากนั้นอัพโหลดลงบอร์ด NodeMCU-32S ได้เลย
จากนั้นเมื่อเปิด Serial Monitor ขึ้นมา ปรับไปที่ 9600 band จะพบกับค่าสถานะที่ตรวจจับได้ โดย 1 หมายถึงสามารถตรวจจับความเคลื่อนไหวได้ และ 1 หมายถึงไม่สามารถตรวจจับความเคลื่อนไหวได้
ทั้งนี้จะพบว่าเซ็นเซอร์ PIR จะมีความหน่วงเวลาเล็กน้อย แต่ไม่มากจนส่งผลให้เมื่อนำไปใช้งานจริงทำงานผิดพลาด
โค้ดที่ใช้ในการทดลองนี้เป็นโค้ดเดียวกับหัวข้อ เรียนรู้จากตัวอย่างแสดงผลการอ่านค่าสถานะขา GPIO ดังนั้นสามารถย้อนกลับไปอ่านรายละเอียดของโค้ดได้ที่หัวนี้
เนื่องจากตัว PIR ที่สามารถใช้งานได้ดีมีราคาสูง และมีการหน่วงเวลาตรวจจับอยู่ ในบางครั้งจึงมีการเลือกใช้งานเซ็นเซอร์แบบอื่น ๆ ในการตรวจจับแทนด้วยเหตุผลที่ต้องการความรวดเร็ว เช่น การผ่านทางเข้าออก หากใช้ PIR จะไม่สามารถแยกคนที่ผ่านประตูกับคนที่เดินไปมาข้างนอกได้ ดังนั้นการใช้เซ็นเซอร์วัดระยะห่างจะทำให้สามารถตรวจจับได้ไว และถูกต้องมากขึ้น แต่จะไม่สามารถแยกระหว่างวัตถุกับมนุษย์ได้ จึงควรวิเคราะห์งานให้ดีก่อนการเลือกใช้เซ็นเซอร์ทุกครั้ง
ในบทนี้ได้มีการยกการใช้งานเซ็นเซอร์ต่าง ๆ ที่มีการใช้งานบ่อย ๆ ขึ้นมา โดยเซ็นเซอร์ที่ยกขึ้นมามีทั้งที่มีภายในตัว ESP32 อยู่แล้ว และที่อยู่เป็นอุปกรณ์ภายนอก อย่างไรก็ตามเซ็นเซอร์ที่ไม่ได้ยกมามีอีกหลายแบบหลายชนิด แต่ละชนิดสามารถดูรายละเอียดการใช้งานได้จากผู้จำหน่าย หรือค้นหาไลบารี่ที่ต้องใช้งานได้จากอินเตอร์เน็ต