วันพฤหัสบดีที่ 16 กุมภาพันธ์ พ.ศ. 2560

[Arduino] Basic Task#11 การใช้งาน Moisture Sensor

สวัสดีครับ วันนี้ผมจะมาสอนใช้งาน Moisture Sensor หรือเซนเซอร์ตรวจจับความชื้นในดิน ตัวเซนเซอร์ที่ว่านี้ก็มีหลายแบบเลยทีเดียว แต่ตัวที่นำเอามาพูดวันนี้จะเป็นตัวที่ใช้ Output ได้ทั้งค่า Digital และ Analog 
บางคนอาจจะสงสัยว่าเอามาสอนทำไมเพราะใครๆก็น่าจะใช้เป็นกันอยู่แล้ว อย่างไรก็ตาม ตอนนี้เป็นช่วงเปิดเทอมใหม่ของมหาวิทยาลัยหลายแห่ง ซึ่งเด็กปี 4 หลายๆคนคงเพิ่งหัดเริ่มใช้ Arduino เพื่อไว้ทำโปรเจ็ค โปรเจ็คที่เห็นบ่อยมากก็คงหนีไม่พ้นระบบรดน้ำต้นไม้อัจฉริยะ ระบบที่ว่านี่ก็ประกอบไปด้วยเซนเซอร์วัดความชื้น เซนเซอร์วัดแสง โมดูลส่งข้อมูลไร้สาย(อาจจะเป็น RF หรือ Wi-Fi) รีเลย์ โซลีนอยด์วาวล์ และ จอแสดงผล เอามายำผสมกัน 
--------------------------------------------------
กลับมาที่เรื่องของเซนเซอร์ เราจะมาดูวิธีการใช้งานเบื้องต้นกันครับ ในบทความนี้จะสอนแต่ analog แต่เดี๋ยวจะบอกวิธีใช้ค่า digital ให้ทีหลังครับ
หน้าตาเซนเซอร์ก็เป็นแบบนี้ มีสองส่วน ส่วนแรกจะเป็นวงจร Digital/Analog ส่วนที่สองจะเป็นแผ่นไว้จิ้มลงดิน(probe) และจะมีสายไฟมาให้ 5 เส้น
ป.ล. มีคนถามว่าสายหายไปไหน 1 เส้น คือมันมี 5 เส้นอยู่แล้วครับ เพราะขา A0 กับ D0 เขาไม่ใช้พร้อมกัน
เอาล่ะ เริ่มจากต่อสายระหว่างตัววงจรกับ probe ใช้สายไฟ 2 เส้น ต่อสายสลับกันได้

จากนั้นต่อสายโยงจากโมดูลเข้าตัวบอร์ด Arduino ตามรูปเลยครับ

จากนั้นให้เปิดคอม แล้วก็อปโค้ดด้านล่างมาใส่ในโปรแกรม Arduino IDE แล้วทำการอัพโหลดโค้ดและเปิด Serial Monior ไว้เลย
ในโค้ดนี้มีการใช้ map ฟังก์ชันแปลงค่าจาก 1023 - 0 ให้เป็น 0% - 100% เนื่องจากตอนที่ไม่ได้เอา probe ปักดิน (เปรียบได้กับดินแห้ง ความต้านทานสูงมาก ในทางอุดมคติคือ R = infinity แต่ความเป็นจริงเป็นไปไม่ได้) จะได้ค่า analog 1023 เลยทำให้โชว์ 0% แทน ตรงกันข้าม สมมุติดินเปียกมากจนความต้านทานน้อย ค่า analog จะเหลือ 100 กว่าๆ เอาเป็นว่าผมเปลี่ยน analog ให้เป็น 0 ละกันจะได้ไม่งง คือไร้ความต้านทาน R = 0 จะได้ค่า 100% คือชื้นมากสุด (ความเป็นจริงคือยังไงดินเปียกๆก็มีความต้านทาน แค่สมมุติให้ดู และจริงๆแล้วจะได้ความชื้นไม่เกิน 70% แม้จะเอา probe จุ่มน้ำตรงๆ ไม่ผ่านดิน เพราะน้ำก็มีความต้านทานเช่นกัน ยิ่งน้ำบริสุทธิ์ความต้านทานจะสูงมาก
ส่วนเหตุผลที่ทำไมตอนที่ดินแห้งได้ค่า analog เป็น 1023 หรือตอนดินเปียกได้ค่า analog ต่ำๆ รวมถึงทฤษฎีต่างๆ มีอธิบายไว้ที่ท้ายบทความครับ
---------------------------------

กลับมาที่ Serial Monitor จะเห็นว่าโชว์ 0%

เมื่อเอานิ้วสัมผัสระหว่าง probe สองอัน จะเห็นค่าความชื้นเพิ่มเป็น 1% เพราะผิวหนังคนนำกระแสไฟฟ้าได้ กระแสจะไหลข้ามไปถึงกันได้นิดหน่อย

เมื่อเอานิ้วหลายนิ้วมาสัมผัส จะได้ % เพิ่มขึ้นอีก
-----------------------------------
ทีนี้มาลองกับฟองน้ำดูบ้าง (พอดีผมไม่มีกระถางต้นไม้) เมื่อทาบเฉยๆก็ไม่มีอะไร ความชื้น 0% เพราะฟองน้ำเพิ่งซื้อมาเพิ่งแกะ ยังไม่ได้จุ่มน้ำเลย


ต่อมาผมได้เอาฟองน้ำไปจุ่มน้ำ เมื่อเอา probe มาทาบ จะเห็นว่าความชื้นอยู่ที่ 23%

คราวนี้ลองกด probe ลงบนฟองน้ำ จนมีหยดน้ำไหลออกจากฟองน้ำ จะเห็นว่า ความชื้นพุ่งสูงเป็น 46%

ต่อมาลองเอา Probe จุ่มน้ำเลย กระแสไหลได้ดี จะเห็นค่าความชื้นพุ่งเป็น 67% ความจริงถ้ารดน้ำจนดินเปียกขนาดนี้ สงสัยต้นไม้รากเน่าแน่ 555

บางคนอาจจะคิดว่าทำไมจุ่มน้ำแล้วไม่ได้ค่าความชื้น 100% ก็เพราะน้ำมีความต้านทานดังที่บอกไปแล้ว จริงๆแล้วเราควรเรียกเจ้าเซนเซอร์นี้ว่าตัววัดความต้านทานระหว่่าง Probe มากกว่าเซนเซอร์วัดความชื้นนะครับ เพราะจริงๆหลักการก็คือวัดความต้านทานในตัวกลางระหว่าง probe นั่นแหละ แค่เอามาประยุกต์ใช้วัดความชื้นได้
ถ้าอยากให้โชว์ความชื้น 100% ก็บัดกรีลวดระหว่าง probe หรือไม่ก็เอา Probe ออกแล้วเอาสายไฟเชื่อมเข้าด้วยกัน คือ R = 0 Ohm ดังภาพ กระแสไหลถึงกันสบายมาก (จริงๆก็มีความต้านทานในสายไฟอยู่ดีนั่นแหละ แต่น้อยมากๆๆ ว่าแต่ R = pl/A จำกันได้ไหมสูตรนี้)
------------------------------------------

ถ้าหากใครใช้แต่ค่า Analog Output จริงๆสร้างเองได้เลยนะครับ ใช้ตัวต้านทาน 10KOhm กับตะปู 2 ตัว ง่ายดี หรือใครมีไอซี LM393 กับตัวต้านทานปรับค่าได้อยู่แล้ว ก็สร้างวงจร Digital Output เองได้เหมือนกัน ไม่ต้องซื้อเซนเซอร์นี้ให้เสียเงิน
-------------------------------------------
สำหรับการใช้งานแบบ Digital ไม่ยากเลยครับ เอาเป็นว่าย้ายขา A0 เป็น D0 ส่วนขาที่ Arduino ก็ใช้ A0 เหมือนเดิมได้ และกำหนด pinMode ให้ A0 เป็น Input ด้วย เพื่อใช้ A0 เป็นขา digital จากนั้นก็ใช้ digitalRead(A0); อ่านค่าเอา โดยปรับตัวต้านทานให้ได้ค่าตามต้องการ ปกติถ้าไฟ LED ติด 2 ดวงที่เซนเซอร์จะหมายถึงค่าดิจิตอลคือ LOW ถ้าเอา probe ไปปักดินแล้วเทน้ำนิดหน่อย แล้วปรับ R จน LED ดับดวงนึง คือได้ค่า High แล้วเราก็เอามาเขียนโปรแกรมได้ ว่าถ้าค่ามัน LOW ก็คือความชื้นน้อยกว่าที่เราตั้งไว้ให้รีเลย์จ่ายไฟเพื่อเปิดก็อกโชลีนอยด์ที่ไปต่อกับปริงเกอร์ให้มันรดน้ำ เป็นต้น
หากใครงงในส่วนของการใช้ค่าดิจิตอล ถามมาในเพจได้ครับ พอดีติดงาน เลยเขียนบทความนี้แบบรีบๆ
-------------------------------------------
ต่อมาเป็นหลักการทำงานของเซนเซอร์นี้ มันคงน่าอายถ้าเราซื้อของมาใช้ เขียนโปรแกรมเป็น แต่มีคนถามว่ามันทำงานได้ยังไง แล้วเราตอบไม่รู้
ให้ดูในรูปนี้ครับ เป็น Schematic ของคนที่ผลิต
ตรง K1 คือ Probe โดยที่เลข 1 Probe ซ้าย และเลข 2 Probe ขวา เราต่อสลับกันได้
ส่วน P1 คือที่ตัวฟ้าๆจะมี 4 ขาที่เราใช้นั่นแหละ เลข 4 Vcc / เลข 3 GND / เลข 2 OUT คือ D0 / เลข 1 AC คือ A0 
จะเห็นว่าไฟ LED D1 จะติดตลอดเพราะต่อระหว่างไฟ Vcc กับ Gnd และมี R 1KOhm จำกัดกระแสที่ไหลผ่าน LED 
ส่วนไฟ LED D2 จะติดเมื่อ OUT เป็น LOW เพราะ LOW ก็เทียบได้กับ Ground และ LED D2 ดับเมื่อ OUT เป็น HIGH เพราะแรงดันเปรียบได้กับ Vcc จึงไม่มีกระแสไหลผ่าน LED จริงๆ OUT เป็น 3.5V ไฟก็ไม่ติดแล้ว เพราะแรงดันตกคร่อม LED ต้องมี 2V ขั้นต่ำ แต่ Vcc หักกับ OUT เหลือแรงดัน 1.5V ตกคร่อมระหว่าง LED และ R 1K ไฟจึงไม่ติด
ในส่วนของ LM393 จะใช้เป็นวงจร Comparator ได้ 2 ตัว ตามที่เห็นว่ามี A+ A- OUTA  B+ B- OUT B แต่ในที่นี้เราใช้แค่ตัวเดียวคือ A โดยนำค่าแรงดันที่ได้จาก voltage divider ระหว่าง R10K และความต้านทานระหว่าง probe มาใช้เป็น A+ และใช้แรงดันที่ได้จาก Trimpot หรือ R ตัวสีฟ้าๆที่ปรับค่าได้และต่ออยู่ระหว่าง 5V และ GND มาเป็น A- จากนั้นไอซีจะนำ A+ และ A- มาเปรียบเทียบกันและให้เอาพุตเป็น OUTA
ส่วน Capacitor 104 คือ 100nF หรือ 0.1uF (10 x 10^4 x 10^-12 F) นิยมใช้ต่อระหว่าง Vcc และ GND เพื่อลดสัญญาณรบกวน
-------------------------------
กลับมาที่ในส่วนของวงจร analog 
จะเห็นว่ามีคำว่า Soil Resistivity คือความต้านทานจำเพาะดิน มีหน่วยเป็น Ohm-m คือมีพื้นที่มาเกี่ยวข้อง แต่ในบทความนี้ถ้าเห็นคำว่า Soil Resistivity ผมจะให้มันหมายถึง Resistance of soil คือความต้านทานของดินระหว่าง Probe มีหน่วยเป็น Ohm

ต่อมามาดูอันนี้กัน ตัวอย่างถ้าดินแห้งมากๆ มีความต้านทานสูงถึง 20 เมกกะโอห์มในจุดที่วัด จะได้ค่าแรงดันจาก Voltage Divider เป็น 4.998V และถ้าแปลงเป็นค่า analog จะได้ 1022.59 แต่ค่า analog จะเป็นจำนวนเต็มจึงปัดขึ้นได้เป็น 1023 (ภาษาอังกฤษใช้คำว่า round แทนการปัดเลข)

ตัวอย่างต่อมา สมมุติให้ดินเปียกมากๆ ความต้านทานก็เหลือน้อย สักประมาณ 500 โอห์ม จะได้ analog ออกมาเป็น 49 ค่าต่ำมาก 

ต่อมา สุดท้ายแล้ว หากเราใช้จะคำนวณกลับหาความต้านทานดินระหว่าง Probe โดยรู้ analog value จาก Serial Monitor จะทำได้อย่างไร
ก็ง่ายๆคือเรารู้อยู่แล้ว Input Voltage คือ 5V และ R อีกตัวนอกจากความต้านทานดินที่เอามาทำ Voltage Diver คือ 10K Ohm ที่เหลือก็แปลงค่า Analog เป็น Output Voltage และแก้สมการดังภาพล่าง
สมมุติให้ดินค่อนข้างเปียก และค่าที่อ่านได้จาก Serial Monitor เป็น 300 
จะได้ Vout เป็น 1.47V เอาไปแทนในสมการ ย้ายข้างไปมาก็จะได้คำตอบ แต่ถ้าจะง่ายๆเลยก็ใช้ wolfram alpha ช่วยคำนวณ จะได้ว่าความต้านทาน 4.16 KOhm
จบแล้วครบ บทความนี้รีบเขียนเนื่องจากไม่ค่อยว่าง แต่ก็มีคนมาถาม เลยจัดให้ครับ หากงงตรงไหนก็ถามได้ หรือผิดพลาดตรงไหนก็ขออภัยด้วยครับ
----------------------------------
CODE:

นาย สุธรรม แสงทรง

อ้างอิง

https://www.i2book.in.th/article/19/arduino-basic-task11-การใช้งาน-moisture-sensor-2

2 ความคิดเห็น:

  1. เขียนโค้ดตามเหมือนกันทุกอย่าง แต่ทำไมค่าผมขึ้นมา72%ครับ

    ตอบลบ
  2. ทำให้มันแสดงบนจอOLEDยังไงคับ

    ตอบลบ