เราซื้อที่ดินมาแปลงนึง เป้าหมายคือทำเกษตรถาวร (permaculture) และระบบอัตโนมัติ เพื่อสร้างและดูแลระบบนิเวศที่เรา "เอา" จากดินให้น้อยที่สุด และ "เพิ่ม" เข้าไปก็น้อยที่สุดเหมือนกัน
เราใช้ Arduino มาช่วยอัตโนมัติและเพิ่มประสิทธิภาพงานประจำบางอย่าง และเพราะเราอยู่ห่างจากที่ดิน 16 ไมล์ การทำให้งานพวกนี้อัตโนมัติจึงมีค่ามาก ทั้งประหยัดเวลาเราเอง และช่วยสิ่งแวดล้อมด้วย — ยิ่งอัตโนมัติมากเท่าไหร่ เราก็ยิ่งไม่ต้องขับรถ 16 ไมล์ไปทำงานซ้ำๆ น้อยลงเท่านั้น
ที่ดินของเราเอียงประมาณ 15 องศา ลาดจากทิศตะวันออกไปตะวันตก (เรื่องนี้สำคัญสำหรับโปรเจคโซลาร์เซลล์ที่ยังไม่พูดถึงตอนนี้!)
เราอยากทำระบบน้ำหยดทั่วทั้ง 6 แปลง (octant) โดย 2 แปลงสุดท้ายจะไว้เลี้ยงผึ้งกับไก่ ก่อนอื่นต้องสร้างอุปกรณ์วัดความชื้นในดินก่อน ซึ่งนี่คือสิ่งที่โปรเจคนี้ทำ — วัดความชื้นด้วยเซ็นเซอร์แบบ capacitive ตัวเดียว (ในแบบสุดท้ายจะใช้ 6 ตัว)
เป้าหมายสุดท้ายคือจะมีถังน้ำหลายใบวางอยู่บนจุดสูงสุด มีสายยางต่อลงไปยังแต่ละแปลง และลงไปสิ้นสุดที่ถังรองรับน้ำที่จุดต่ำสุด (เพื่อไม่ให้น้ำไหลทิ้งเปล่า) สายยางแต่ละเส้นจะติดวาล์วโซลินอยด์ที่ต่อกับ Arduino ที่เรากำลังพัฒนาอยู่
โปรเจคนี้คือพื้นฐานของเป้าหมายใหญ่ เซ็นเซอร์วัดความชื้นจะตัดสินใจเมื่อไหร่ที่จะส่งสัญญาณไปเปิดวาล์วโซลินอยด์ เพื่อให้น้ำไหลลงด้วยแรงโน้มถ่วงไปยังแปลงที่ต้องการ สมมติว่าแปลงที่ 1 ต้องการความชื้น维持在 40% เราก็ใช้คำสั่ง if เปิดสายน้ำเมื่อความชื้นต่ำกว่า 40% จนกว่าค่าจะกลับมาที่ 40% แล้วค่อยสั่งปิดวาล์ว
จริงๆ เราทำโปรเจคนี้ได้โดยไม่ต้องมีหน้าจอ LCD ก็ได้ และนั่นก็คือจุดที่เราเจอปัญหามากที่สุด (จะบอกว่าเซ็งสุดๆ เพราะพิมพ์ค่าอะไรใน void loop() ไม่ได้เลย มีแต่ใน void setup() เท่านั้นที่แสดงผล!)
น้องคงรู้แล้วว่าเราเพิ่งเริ่มเล่น Arduino ไม่นาน แม้จะเคยลองอิเล็กทรอนิกส์แบบอื่นมาบ้าง แต่เรายังเป็นมือใหม่ในทุกด้าน ไม่ต้องสงสัย! นั่นแหละที่เราตัดใจเผยแพร่โปรเจคนี้ไปเรื่อยๆ เพราะหนึ่ง — เราได้ความรู้จากชุมชน maker (และเพื่อนที่เก่งกว่าเรามาก อย่างเอ็ดเวิร์ด! ถ้าไม่มีเขา เราคงไม่แม้แต่จะมองการเขียนโปรแกรม) การได้คืนความรู้ให้ชุมชนจึงเป็นเรื่องที่ควรทำ และสอง — มันอาจช่วยให้คนอื่นไม่ต้องเจอปัญหาแบบที่เราเจอ!
เราไม่เสแสร้งว่าเข้าใจโค้ดทุกบรรทัด โค้ดส่วนใหญ่คือการผสมผสานจากโปรเจคอื่นๆ (ดูผู้มีส่วนร่วมได้ด้านล่าง) เอาล่ะ พูดมายืดยาว พร้อมลุยแล้วใช่ไหม? จัดไปวัยรุ่น!
คำแนะนำ
ก่อนอื่น น้องต้องไปลองดูตัวอย่าง "Hello World" ให้เข้าใจก่อนนะ เพราะนั่นคือพื้นฐานของโปรเจคนี้เลย ส่วนหนึ่งของการเซ็ตอัพก็มีโพเทนชิโอมิเตอร์ (Potentiometer) ด้วย ซึ่งพี่ว่ามันไม่ค่อยจำเป็นเท่าไหร่ แต่ก็ใส่ไว้ตามตัวอย่างแหละ
พอได้ฮาร์ดแวร์แล้ว น้องต้องเซ็ตอัพหน้าจอ LCD และต่อเข้ากับ Arduino โดยเชื่อมขาต่อไปนี้กับขาที่ตรงกันบน Arduino ส่วนขาที่ต้องต่อกับกราวด์หรือไฟเลี้ยง ก็ให้ต่อเข้ากับรางไฟบนเบรดบอร์ด แล้วค่อยต่อรางไฟนั้นไปที่ขา 5V กับ GND บน Arduino อีกที
ให้เซ็ตอัพขาของ LCD ดังนี้ (ข้อมูลนี้เอามาจากตัวอย่าง "Hello World" ของ Arduino นะ):
- ขา LCD RS ไปที่ Digital Pin 12
- ขา LCD Enable ไปที่ Digital Pin 11
- ขา LCD D4 ไปที่ Digital Pin 5
- ขา LCD D5 ไปที่ Digital Pin 4
- ขา LCD D6 ไปที่ Digital Pin 3
- ขา LCD D7 ไปที่ Digital Pin 2
- ขา LCD R/W ไปที่ GND
- ขา LCD VSS ไปที่ GND
- ขา LCD VCC ไปที่ 5V
- ขา LCD LED+ ไปที่ 5V ผ่านตัวต้านทาน (Resistor) 220 โอห์ม
- ขา LCD LED- ไปที่ GND
ส่วนขา VO บนหน้าจอ LCD ใช้ปรับคอนทราสต์นะ มันสามารถต่อเข้ากับขากลางของโพเทนชิโอมิเตอร์ได้ จริงๆ มันก็แค่ลูกเล่นน่ะ – ถ้ามันปรับความสว่างได้จะใช้ง่ายกว่านี้เยอะเลยในแง่การประหยัดพลังงาน น้องอาจจะลองรันไฟเลี้ยง LCD+ กับ LCD- ผ่านโพเทนชิโอมิเตอร์ดูก็ได้ แต่พี่ยังไม่เคยลองนะ อย่าลืมว่าพี่ก็ยังมือใหม่อยู่! หรืออีกทางนึง น้องอาจจะข้ามขา VO ไปเลยไม่ต้องต่อโพเทนชิโอมิเตอร์ก็ได้ แต่เพราะเราทำตามการต่อวงจร Hello World สำหรับ LCD พี่เลยตัดสินใจใส่ไว้
ต่อไป น้องต้องต่อเซ็นเซอร์วัดความชื้นแบบ capacitive (Capacitive Moisture Sensor) ให้เรียบร้อย อันที่แสดงในไดอะแกรมเบรดบอร์ดมันคนละแบบกับที่พี่ใช้นะ โปรแกรม Fritzing มันไม่มีโมเดลเดียวกันกับของพี่ ที่มีแค่ 3 ขาแทนที่จะเป็น 6 ขา แต่ว่าการทำงานของขาที่ใช้มันเหมือนกันแหละ
การตรวจจับแบบ Capacitive vs Resistive ไม่เหมือนกับโพรบแบบ resistive ราคาถูก เซ็นเซอร์วัดความชื้นแบบ capacitive (Capacitive Moisture Sensors) จะไม่มีขั้วไฟฟ้าโลหะโผล่ออกมา ทำให้มันไม่เกิดปัญหา electrolysis และการกัดกร่อน
- หลักการทำงาน: โพรบทำหน้าที่เป็นแผ่นหนึ่งของตัวเก็บประจุ (capacitor) โดยมีดินเป็นไดอิเล็กตริก (dielectric) เมื่อปริมาณน้ำเพิ่มขึ้น ค่าคงที่ไดอิเล็กตริกจะเปลี่ยนไป ส่งผลให้ความถี่ของวงจรออสซิลเลเตอร์ (oscillator circuit) บนบอร์ดเปลี่ยนไป
- แรงดันเอาต์พุต: Arduino จะอ่านค่าแรงดันอนาล็อกที่ได้ (ปกติจะอยู่ที่ 1.5V ถึง 3.0V)
ให้ต่อเซ็นเซอร์วัดความชื้นแบบ capacitive ดังนี้:
- GND ไปที่ GND
- VCC ไปที่ 5V
- AOUT ไปที่ A0
หมายเหตุสั้นๆ เกี่ยวกับขาอนาล็อกและดิจิตอล: จริงๆ แล้วน้องจะใช้ขาไหนก็ได้ ขอแค่น้องแก้โค้ดให้ตรงกับขาที่เลือกใช้ สำหรับโปรเจคนี้ คำแนะนำมันตรงกับโค้ดอยู่แล้ว แต่ก็ลองเล่นดูได้นะ! ตัวอย่างเช่น พี่ใช้ A0 กับตัวเก็บประจุตัวนี้ แต่ถ้าพี่เพิ่มจำนวนเซ็นเซอร์ พี่ก็ต้องใช้ A1, A2 ไปเรื่อยๆ แล้วพี่ก็จะแค่ก๊อปปี้โค้ดบล็อกมาแล้วแก้ไขให้ตรงกับขาที่ใช้
ตอนนี้น้องก็ต่อหน้าจอ LCD และเซ็นเซอร์วัดความชื้นเสร็จแล้ว พร้อมที่จะต่อเข้ากับ PC เปิด Arduino IDE ขึ้นมา แล้วก็ก๊อปปี้โค้ดไปรันได้เลย จัดไปวัยรุ่น! น้องอาจจะพบว่า ตอนพยายามอัพโหลดโค้ด มันบอกว่าไลบรารี่สำหรับ LCD ยังไม่ได้ติดตั้ง ถ้าเป็นแบบนั้น น้องต้องไปติดตั้งไลบรารี่ LiquidCrystal ให้เรียบร้อยก่อนนะ สู้งานนะน้อง
การทดสอบ
ตอนนี้น้องอัปโหลดโค้ดลงบอร์ดแล้ว น่าจะเห็นค่าความชื้นแสดงผลเป็นเปอร์เซ็นต์แล้วเนอะ
การปรับเทียบ & หน้าจอ
- ตั้งศูนย์: ผู้ใช้บันทึกค่าแรงดันตอน "แห้งสนิท" (0%) กับตอน "จุ่มน้ำ" (100%)
- ฟังก์ชัน Map: Arduino ใช้ฟังก์ชัน
map()เพื่อแปลงค่าอนาล็อกดิบให้เป็นเปอร์เซ็นต์ที่มนุษย์อ่านเข้าใจได้ จากนั้นก็ส่งไปแสดงผลที่ LCD เป็นการจบงานแบบชิลๆ แต่แม่นยำ
จัดไปวัยรุ่น ลองเอามือจับรอบๆ ตัวเซนเซอร์ดูซิ ค่าควรจะขึ้นไปสูงสุดที่ประมาณ 100% ถึง 107%
ถ้าน้องลองจุ่มมันลงแก้วน้ำ (แค่ส่วนที่เป็นโลหะนะ ห้ามช็อตนะตัวนี้) เรตติ้งอาจจะโชว์ประมาณ 130% อ่ะ (อย่าจุ่มส่วนอิเล็กทรอนิกส์ด้านบนของเซนเซอร์ล่ะ เดี๋ยวเป็นสนิมแล้วเจ๊งเอาได้ ถ้าอยากกันน้ำจริงจังต้องหาพวก Heat Shrink Tube มาครอบกัน)
ผมเองก็ไม่แน่ใจเหมือนกันว่าทำไมค่ามันเกินสเกลแบบนี้ บางทีอาจเป็นเพราะค่าจำนวนเต็มสูงสุดเกินขอบเขตของสเกลเปอร์เซ็นต์ (0% ถึง 100%) — พูดตรงๆ คือผมก็มึนเหมือนกันว่ะ 555+ ถ้าใครรู้วิธีแก้ รีบมาบอกกันหน่อย เดี๋ยวรุ่นพี่อัปเดตโปรเจกต์ให้เลย! สู้งานนะน้อง