GlobalByte / Arduino / Sensor / Smart Garden
Arduino MKR WiFi 1010 วัดความชื้นดินด้วย Capacitive Sensor
หน้าดินดูแห้งไม่ได้แปลว่าดินข้างในแห้งเสมอ ถ้าอยากให้ Arduino ช่วยเช็กแทนสายตา วิธีเริ่มต้นง่าย ๆ คือใช้ Capacitive Soil Moisture Sensor อ่านค่า Analog แล้วดูการเปลี่ยนแปลงผ่าน Serial Monitor
โปรเจกต์นี้ใช้
Arduino MKR WiFi 1010
ต่อกับ Capacitive Soil Moisture Sensor
โดยนำสัญญาณ
AOUT เข้าขา A6
แล้วอ่านค่าด้วย
analogRead()
จากนั้นจึง Calibrate Sensor ด้วยการเก็บค่าตอนแห้งและตอนดินเปียก เพื่อหา Threshold ที่เหมาะกับ Sensor และดินที่ใช้งานจริง
- Sensor ส่งสัญญาณ Analog ออกทาง AOUT และ Tutorial ใช้ A6 ของ MKR WiFi 1010 รับค่า
- สำหรับ Sensor ใน Source: ดินแห้งให้ค่าขา AOUT สูงกว่า ส่วนดินเปียกให้ค่าต่ำกว่า
- Code ตัวอย่างอ่านค่าทุก 500 ms และแสดงผ่าน Serial Monitor
- ค่า Threshold ไม่ควร Copy จากคนอื่น ต้อง Calibrate จาก Sensor และดินที่ใช้งานจริง
- Arduino MKR WiFi 1010 ใช้ I/O ระดับ 3.3V และไม่รองรับสัญญาณ 5V โดยตรง
- ค่า Default ของ analogRead() คือ 10-bit หรือ 0–1023 ส่วน MKR Family สามารถตั้ง 12-bit เป็น 0–4095 ได้
- Code ต้นฉบับใน Tutorial ไม่ได้ตั้ง analogReadResolution(12) จึงไม่ควรตีความว่ากำลังอ่านแบบ 12-bit อยู่โดยอัตโนมัติ
- แม้บอร์ดมี Wi-Fi แต่ Build นี้ยังอ่านค่าแบบ Local ผ่าน Serial Monitor ไม่ได้ส่งข้อมูลขึ้น Cloud
โปรเจกต์นี้ทำอะไร?
Flow ของ Tutorial นี้ไม่ซับซ้อน: Sensor ตรวจการเปลี่ยนแปลงของดิน แล้วส่งสัญญาณ Analog ออกทาง AOUT ให้ MKR WiFi 1010 อ่านผ่าน ADC
↓
AOUT
↓
A6 บน MKR WiFi 1010
↓
analogRead()
↓
Serial Monitor
↓
Dry / Wet Calibration
ดังนั้นเป้าหมายของ Build แรก ไม่ใช่การสร้างระบบรดน้ำอัตโนมัติเต็มรูปแบบ แต่คือการทำให้เราอ่านและตีความค่าความชื้นจาก Sensor ได้ก่อน
ทำไมเลือก Capacitive Soil Moisture Sensor?
Soil Moisture Sensor ที่พบทั่วไป มีทั้งแบบ Resistive และ Capacitive โดย Source เลือกใช้แบบ Capacitive เพื่อหลีกเลี่ยงปัญหา Corrosion ที่พบได้กับ Probe แบบ Resistive
| หัวข้อ | Resistive Sensor | Capacitive Sensor |
|---|---|---|
| แนวคิดการวัด | อาศัย Electrical Conductivity ระหว่าง Probe | อาศัยการเปลี่ยนแปลงทาง Capacitive |
| การสัมผัสดิน | มี Electrode ใช้กระแสผ่านบริเวณดิน | ไม่ใช้โลหะสองขั้วส่งกระแสผ่านดินแบบ Resistive Probe |
| ปัญหาที่ Source เน้น | Electrolysis และ Corrosion ของ Probe | ลดปัญหาการกัดกร่อนแบบเดียวกับ Resistive Probe |
อย่าจุ่มส่วน Connector หรือ Electronics ด้านบนของ Sensor ลงในน้ำหรือดินเปียกเกินบริเวณ Probe ที่ออกแบบไว้ Tutorial ต้นฉบับเตือนเรื่องนี้โดยตรง
อุปกรณ์ที่ใช้ใน Tutorial
| อุปกรณ์ | หน้าที่ |
|---|---|
| Arduino MKR WiFi 1010 | อ่านค่า Analog จาก Sensor และแสดงผลผ่าน Serial |
| Capacitive Soil Moisture Sensor | ตรวจการเปลี่ยนแปลงที่สัมพันธ์กับความชื้นของดิน |
| Micro USB Cable | จ่ายไฟให้ Board และใช้ Upload / Serial Monitor |
| Breadboard | ช่วยจัดวงจรทดลอง |
| Jumper Wires | เชื่อม Sensor กับ MKR WiFi 1010 |
Source ยัง List DC Power Jack และ DIYables Sensor Kit ไว้ใน Supplies แต่สำหรับ Build หลัก Tutorial จ่ายไฟผ่าน USB จึงไม่จำเป็นต้องมอง DC Power Jack เป็นส่วนประกอบบังคับของวงจรพื้นฐานนี้
Wiring: ต่อ Soil Moisture Sensor กับ MKR WiFi 1010
| Soil Moisture Sensor | MKR WiFi 1010 | หน้าที่ |
|---|---|---|
| VCC | 3.3V สำหรับแนวทางที่ปลอดภัยกับ MKR I/O | จ่ายไฟให้ Sensor |
| GND | GND | Ground ร่วมกัน |
| AOUT | A6 | Analog Signal |
Official Pinout ของ MKR WiFi 1010 ยืนยันว่า A6 เป็น Analog Input จึงตรงกับ Pin ที่ Tutorial ใช้ใน Code
ระวัง 5V: MKR WiFi 1010 เป็นบอร์ด 3.3V I/O
Tutorial ต้นฉบับระบุว่า Sensor VCC สามารถเป็น 3.3V หรือ 5V แต่ Official Datasheet ของ Arduino MKR WiFi 1010 ระบุชัดว่า I/O ของบอร์ดทำงานที่ 3.3V และไม่รองรับ 5V Signal โดยตรง
ดังนั้นก่อนจ่าย Sensor ที่ 5V ต้องตรวจ Datasheet ของ Sensor รุ่นจริงก่อนว่า AOUT สูงสุดจะไม่เกินระดับที่ MKR WiFi 1010 รับได้
สำหรับการทดลองตามบทความนี้ แนวทางที่ระมัดระวังกว่าคือ เริ่มจาก 3.3V เมื่อ Sensor รุ่นที่ใช้งานรองรับ และตรวจ Signal Level ก่อนนำ AOUT เข้าขา A6
อย่าตีความคำว่า “Sensor ใช้ไฟ 5V ได้” ว่า “สามารถส่ง 5V เข้า Analog Input ของ MKR ได้” เพราะสองเรื่องนี้ไม่ใช่สิ่งเดียวกัน
Sensor อ่านความชื้นอย่างไร?
สำหรับ Capacitive Soil Moisture Sensor ใน Tutorial นี้ Source อธิบายความสัมพันธ์ของ AOUT แบบกลับทิศ:
→ AOUT สูงกว่า
ดินเปียก
→ AOUT ต่ำกว่า
Arduino อ่าน Voltage ที่ A6 แล้ว ADC จะแปลงค่าเป็นตัวเลข จากนั้นเราจึงดูว่าค่าเปลี่ยนไปอย่างไร เมื่อ Sensor อยู่ในอากาศ, ดินแห้ง หรือดินเปียก
บทความนี้ยึดพฤติกรรมของ Sensor ที่ Source ใช้ หากเปลี่ยน Sensor รุ่นอื่น ควรทดสอบ Dry / Wet Reading ใหม่ก่อนกำหนด Logic
analogRead() ได้ค่า 0–1023 หรือ 0–4095?
Arduino API กำหนดค่า Default ของ
analogRead()
ไว้ที่ 10-bit
เพื่อความเข้ากันได้กับ Board รุ่นเดิม
ดังนั้นค่าที่ได้โดย Default จะอยู่ในช่วง:
MKR Family มี ADC ที่สามารถตั้ง Resolution เป็น 12-bit ได้ด้วย:
แต่ Code ของ Tutorial นี้
ไม่ได้เรียก
analogReadResolution(12)
ดังนั้นไม่ควรเห็นคำว่า
“0–4095”
แล้วสรุปว่า Sketch ตัวอย่างกำลังอ่านแบบ 12-bit อยู่
ถ้าจะเปลี่ยน ADC Resolution ควรทำอย่างตั้งใจและต้อง Calibrate Threshold ใหม่ เพราะ Scale ของ Raw Value เปลี่ยนตาม Resolution
Code อ่านค่า Soil Moisture แบบ Raw Value
Code แรกทำหน้าที่เพียงอ่าน A6 แล้ว Print ค่าออก Serial Monitor ทุก 500 ms ซึ่งเหมาะที่สุดสำหรับขั้น Calibration
#define AOUT_PIN A6
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(AOUT_PIN);
Serial.print("Moisture value: ");
Serial.println(value);
delay(500);
}
Comment ใน Source เดิมมีข้อความว่า “Arduino Nano 33 IoT pin A6” แม้ Tutorial นี้ใช้ MKR WiFi 1010 จึงตัด Comment ชื่อ Board ที่ผิดออก แต่ไม่ได้เปลี่ยน Logic หรือ Pin A6 ของ Code
อย่าเพิ่งตั้ง Threshold จนกว่าจะ Calibrate Sensor
Soil Moisture Sensor แต่ละตัว และดินแต่ละแบบ สามารถให้ Raw Value ต่างกัน ดังนั้น Source จึงแนะนำให้หา Dry / Wet Reference จาก Hardware จริงก่อน
ถือ Sensor ไว้ในอากาศให้แห้ง แล้วบันทึกค่าจาก Serial Monitor
นำส่วน Probe ไปอยู่ในดินที่เปียกมาก แล้วบันทึกค่าที่ได้
สำหรับ Sensor ใน Source Dry Value จะสูงกว่า Wet Value
เลือกค่าที่อยู่ระหว่าง Dry กับ Wet ให้เหมาะกับระดับที่ต้องการใช้เป็นจุดแบ่ง
เช็กว่า Threshold ที่ตั้ง ให้ผล Wet / Dry ตรงกับสภาพดินที่ต้องการจริงหรือไม่
อย่า Copy ค่า Threshold จาก Tutorial แล้วถือว่าใช้ได้กับต้นไม้, ดิน และ Sensor ทุกตัว เพราะ Source ระบุให้ Calibration จาก Hardware จริงก่อน
เปลี่ยน Raw Value ให้ Arduino บอกว่า Wet หรือ Dry
หลังได้ Threshold แล้ว Source ใช้ Logic ง่าย ๆ: ถ้าค่าสูงกว่า Threshold ให้รายงานว่า DRY ถ้าต่ำกว่าหรือเท่ากับ Threshold ให้รายงานว่า WET
ตัวอย่าง Source ใช้
1500
แต่ค่านี้เป็นเพียง Example
และต้องเปลี่ยนตาม Calibration ของ Sensor จริง
#define AOUT_PIN A6
#define THRESHOLD 1500
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(AOUT_PIN);
if (value > THRESHOLD)
Serial.print("The soil is DRY (");
else
Serial.print("The soil is WET (");
Serial.print(value);
Serial.println(")");
delay(500);
}
ต้องเปลี่ยนตาม Dry / Wet Reading ของ Sensor, ADC Resolution และดินที่ใช้งานจริง
Things That Go Wrong — ปัญหาที่เจอบ่อย
| อาการ | สิ่งที่ควรตรวจ |
|---|---|
| Serial Monitor แสดงค่าเดิมตลอด | ตรวจสาย AOUT และการเชื่อมต่อกับ A6 |
| Probe เกิดสนิมหรือกัดกร่อนเร็ว | ตรวจว่าใช้ Capacitive Sensor หรือ Resistive Probe |
| Reading แกว่งผิดปกติ | ตรวจ Power Supply และการเชื่อมต่อ Ground |
| Threshold ใช้กับต้นอื่นแล้วไม่ตรง | Calibrate Dry / Wet ใหม่กับ Sensor และดินนั้น |
| เปลี่ยน ADC เป็น 12-bit แล้ว Threshold เดิมใช้ไม่ได้ | Calibrate ใหม่ เพราะ Scale เปลี่ยนจาก 0–1023 เป็น 0–4095 |
MKR WiFi 1010 ไม่ใช่บอร์ด 5V-tolerant ดังนั้นถ้าใช้ Sensor ที่จ่ายไฟ 5V ต้องตรวจว่า AOUT ไม่ส่งแรงดันเกินระดับ I/O ที่บอร์ดรองรับ
ชื่อบอร์ดมี WiFi แล้วทำไม Tutorial นี้ยังไม่ต่อ Internet?
MKR WiFi 1010 มีความสามารถด้าน Wi-Fi แต่ Sketch ใน Tutorial นี้ ยังไม่ได้ใช้ Wi-Fi Library, Cloud Service, MQTT หรือ Network Connection ใด ๆ
สิ่งที่เกิดขึ้นจริงมีเพียง:
↓
ประมวลผลบน MKR WiFi 1010
↓
แสดงค่าผ่าน USB Serial Monitor
ดังนั้นควรเรียก Build นี้ว่า พื้นฐานของ Plant Monitoring มากกว่าระบบ IoT Farm Monitor ที่เสร็จสมบูรณ์แล้ว
อ่านความชื้นได้แล้ว ต่อไปทำอะไรได้?
Source เสนอแนวทางต่อยอดหลายแบบ หลังจากอ่าน Sensor ได้เสถียรแล้ว เช่น:
- ทำ Visual Alert เมื่อดินแห้ง
- ส่งค่าผ่าน Wi-Fi ไปยัง Cloud Dashboard
- ใช้ Soil Moisture Sensor หลายตัวกับหลาย Analog Input
- พัฒนาเป็น Automated Irrigation หรือ Smart Garden ในขั้นต่อไป
Source ชุดนี้ไม่ได้ให้ Wiring หรือ Code สำหรับ Pump, Relay, Solenoid, MQTT หรือ Cloud Dashboard ดังนั้นบทความนี้จะไม่สร้างวงจรหรือ Code เหล่านั้นเพิ่มเอง
ถ้า Sensor ยังอ่านค่าไม่เสถียร หรือ Threshold ยังไม่สัมพันธ์กับสภาพดินจริง การเพิ่ม Automation จะเพียงนำ Reading ที่ผิดไปใช้ตัดสินใจต่อ
FAQ — คำถามที่พบบ่อยเกี่ยวกับ Arduino Soil Moisture Sensor
1. Arduino MKR WiFi 1010 ใช้กับ Soil Moisture Sensor ได้หรือไม่?
ได้ Tutorial ใช้ Capacitive Soil Moisture Sensor ต่อสัญญาณ AOUT เข้าขา Analog A6
2. Sensor ต่อ Signal เข้าขาไหน?
Tutorial ใช้ขา A6 และ Official Pinout ยืนยันว่า A6 เป็น Analog Input ของ MKR WiFi 1010
3. Sensor ควรใช้ไฟ 3.3V หรือ 5V?
Tutorial ระบุ 3.3V หรือ 5V แต่ MKR WiFi 1010 ใช้ 3.3V I/O และไม่ 5V-tolerant จึงควรตรวจ Sensor Datasheet และระดับ AOUT ก่อนใช้ไฟ 5V
4. ดินแห้งค่าจะสูงหรือต่ำ?
สำหรับ Sensor ใน Source ดินแห้งให้ AOUT สูงกว่า และดินเปียกให้ค่าต่ำกว่า
5. analogRead() ของ MKR WiFi 1010 ได้ค่าเท่าไร?
Default 10-bit ให้ค่า 0–1023 และสามารถตั้ง 12-bit เป็น 0–4095 ด้วย analogReadResolution(12)
6. Code ใน Tutorial ใช้ 10-bit หรือ 12-bit?
Sketch ที่ Source ให้มาไม่ได้เรียก analogReadResolution(12) จึงใช้ Default Resolution เว้นแต่มีการตั้งค่าเพิ่มเติมนอก Code ที่แสดง
7. Threshold 1500 ใช้ได้กับทุก Sensor หรือไม่?
ไม่ได้ 1500 เป็นค่า Example จาก Source ต้องหา Threshold ใหม่จาก Dry / Wet Calibration ของ Sensor จริง
8. แปลง Raw Value เป็นเปอร์เซ็นต์ความชื้นได้เลยหรือไม่?
Source ไม่ได้ให้ Calibration Equation สำหรับแปลงเป็นเปอร์เซ็นต์ความชื้นหรือ Volumetric Water Content
9. ทำไม Capacitive Sensor ดีกว่า Resistive Probe?
Source เน้นว่า Resistive Probe มีปัญหา Electrolysis และ Corrosion ขณะที่ Capacitive Sensor ไม่วัดด้วยกระแสผ่านดินระหว่าง Probe แบบเดียวกัน
10. จุ่ม Sensor ลงน้ำทั้งแผ่นได้หรือไม่?
ไม่ควร Tutorial เตือนว่าอย่าจุ่มส่วนด้านบนที่มี Connector และ Electronics ลงน้ำ
11. โปรเจกต์นี้ใช้ Wi-Fi หรือไม่?
ยังไม่ใช้ Code ปัจจุบันอ่าน Sensor และแสดงผลผ่าน Serial Monitor เท่านั้น
12. โปรเจกต์นี้ควบคุมปั๊มน้ำได้เลยหรือไม่?
ไม่ได้ใน Build ที่ Source ให้มา ไม่มี Pump, Relay หรือ Auto-watering Code ใน Tutorial ชุดนี้
13. Sensor ใช้กระแสเท่าไร?
Source ไม่ได้ระบุ Current Consumption ของ Sensor รุ่นจริง
14. Sensor แม่นยำกี่เปอร์เซ็นต์?
Source ไม่ได้ระบุ Accuracy เป็นเปอร์เซ็นต์
15. Capacitive Sensor ใช้งานได้นานแค่ไหน?
Source อธิบายว่าเหมาะกับการใช้งานระยะยาวกว่า Resistive Probe ในด้านปัญหา Corrosion แต่ไม่ได้ระบุอายุการใช้งานเป็นวัน เดือน หรือปี
สรุป: อย่าเริ่ม Smart Garden จาก Pump ให้เริ่มจาก Sensor ที่อ่านค่าได้ก่อน
โปรเจกต์นี้เป็นพื้นฐานที่ดี สำหรับเข้าใจว่าการวัดความชื้นดินด้วย Arduino ไม่ได้จบแค่เสียบ Sensor แล้วได้คำตอบว่า “เปียกกี่เปอร์เซ็นต์”
ขั้นแรกคืออ่าน Raw Analog Value ให้ถูกต้อง จากนั้นดูพฤติกรรมของ Sensor จริง แล้ว Calibrate ค่า Dry และ Wet ก่อนกำหนด Threshold
จุดที่ต้องระวังกับ MKR WiFi 1010 คือบอร์ดใช้ I/O ระดับ 3.3V และไม่รองรับ 5V Signal โดยตรง ดังนั้น Sensor ที่ต้องการจ่าย 5V ควรถูกตรวจระดับ AOUT ก่อนนำเข้าขา Analog
เมื่อ Sensor Reading และ Threshold เชื่อถือได้แล้ว ค่อยนำ Wi-Fi ของ MKR WiFi 1010 ไปต่อยอดเป็น Dashboard, Data Logging หรือระบบรดน้ำอัตโนมัติใน Project ขั้นถัดไป จะเป็นลำดับที่ควบคุมปัญหาได้ง่ายกว่า
References / แหล่งข้อมูลต้นฉบับ
กำลังทำ Smart Garden หรือ Sensor Project?
ถ้ากำลังทดลอง Plant Monitoring, Smart Garden, IoT Sensor หรือ Arduino Project สามารถสอบถามทีม GlobalByte เรื่อง Development Board, Sensor, Breadboard, Jumper Wire หรือ Module ที่เหมาะกับ Requirement ของงานได้
เริ่มจากเลือก Sensor และ Signal Level ให้เข้ากับ Board ก่อน แล้วค่อยต่อยอดไปยัง Wi-Fi, Dashboard หรือ Automation จะช่วยลดปัญหาในขั้นทดลองได้มากกว่า
บทความนี้เป็นการสรุปและเรียบเรียงจากแหล่งข้อมูลภาษาอังกฤษ อาจมีความคลาดเคลื่อน กรุณาตรวจสอบ Source ต้นฉบับก่อนลงมือทำ
Tutorial ต้นฉบับระบุว่าสามารถจ่าย Soil Moisture Sensor ด้วย 3.3V หรือ 5V แต่ Official Arduino Documentation ระบุว่า MKR WiFi 1010 รองรับ I/O เพียง 3.3V และไม่ 5V-tolerant จึงต้องตรวจระดับ AOUT ของ Sensor รุ่นจริง ก่อนนำ Signal เข้าขา Analog โดยเฉพาะเมื่อ Sensor ถูกจ่ายด้วย 5V
ค่า Dry, Wet และ Threshold แตกต่างกันตาม Sensor, ดิน, สภาพความชื้น และ ADC Resolution ตัวเลข 1500 ที่อยู่ใน Example จึงไม่ใช่ Universal Threshold
Code ต้นฉบับมี Comment ที่เรียก A6 ว่าเป็น Pin ของ Arduino Nano 33 IoT แม้ Tutorial นี้ใช้ MKR WiFi 1010 บทความนี้จึงตัด Comment ที่ผิดออก โดยคง Pin A6 และ Logic ของ Code ตาม Source
Sketch ใน Tutorial ไม่ได้เรียก analogReadResolution(12) ดังนั้นค่า 0–4095 เป็นความสามารถเมื่อผู้ใช้ตั้ง ADC เป็น 12-bit ไม่ใช่ Resolution ที่ Sketch ตัวอย่างเปิดใช้งานโดยอัตโนมัติ
Source ไม่ได้ให้ข้อมูล Sensor Model ที่ชัดเจนเพียงพอสำหรับกำหนด Current Consumption, Maximum AOUT Voltage, Accuracy, Waterproof Rating, Moisture Percentage Formula หรืออายุการใช้งานเป็นตัวเลข จึงไม่มีการสร้างค่าเหล่านี้เพิ่มในบทความ
Build นี้ไม่ได้ควบคุม Pump, Relay, Valve, Cloud Dashboard หรือ MQTT แม้ Source จะยกแนวคิดเหล่านี้เป็นการต่อยอดในอนาคต จึงไม่มีการสร้าง Wiring หรือ Code สำหรับระบบดังกล่าวขึ้นเอง