[TH] ESP8266+Soil Moisture Sensor

บทความนี้เป็นการนำ ESP8266 มาใช้อ่านค่าจากเซ็นเซอร์ความชื้นของดิน ซึ่งหน้าตาของเซ็นเซอร์ที่เลือกใช้เป็นดังภาพที่ 1 โดยวงจรของการทำงานตามภาพที่ 2 จะมีส่วนของการแปลงความต้านทานจากการไหลของกระแสไฟเป็นค่าแบบแอนาล็อกและดิจิทัล ซึ่งในภาคของดิจิทัลนั้นต้องทำการหมุนเพื่อปรับค่าความต้านทานจากตัวต้านทานปรับค่าได้ หลังจากนั้นค่าแรงดันที่ได้จากการปรับค่าความต้านทานจะถูกใช้เป็นตัวเปรียบเทียบแรงดันที่ได้รับจากวงจรเซ็นเซอร์ และนำออกข้อมูลเป็นสัญญาณดิจิทัลเป็นค่า 0 หรือ 1 แต่ในบทความนี้เลือกใช้การอ่านค่าจากสัญญาณแอนาล็อกผ่านเข้าทางขา A0 ซึ่งเป็นภาคแปลงสัญญาณแอนาล็อกเป็นดิจิทัล (ADC: Analog to Digital Converter) ขนาด 10 บิต ทำให้อ่านค่าแรงดันที่ได้รับเป็นค่าจำนวนเต็มในช่วง 0 ถึง 1024 โดยตัวอย่างโปรแกรมเขียนด้วยภาษาไพธอน พร้อมแสดงค่าที่แปลงจาก ADC แสดงผ่านเว็บ

ภาพที่ 1 เซ็นเซอร์วัดความชื้นในดิน
ภาพที่ 2 วงจรสำหรับเซ็นเซอร์วัดความชื้นในดิน

ADC

ADC เป็นวงจรการแปลงค่าแอนาล็อกเป็นค่าดิจิทัล โดยค่าแอนาล็อกจะถูกแทนค่าด้วยตัวเลขจำนวนเต็มในช่วงค่า 0 ถึง ค่าจำนวนเต็มที่มีค่าสูงสุดตามขนาดบิตของวงจร ADC ซึ่ง ESP8266 มี ADC จำนวน 1 ช่อง มีความละเอียด 10 บิต และเรียกขาที่เชื่อมต่อกับวงจรนี้ว่า A0

สิ่งที่ต้องระวังในการใช้ ADC คือ วงจร ADC ถูกออกแบบให้ใช้ได้กับแรงดันที่ไม่เกิน 1VDC แต่ด้วยข้อจำกัดนี้ ผู้ผลิตบอร์ดส่วนใหญ่จะเพิ่มเติมวงจร R2R เพื่อลดแรงดันนำเข้าให้เหลือไม่เกิน 1VDC ดังนั้น การใช้งานขา A0 จะต้องจ่ายแรงดันที่ไม่เกิน 3V3 เนื่องจากแรงดันที่เกิน 3V3 จะทำให้แรงดันที่ส่งเข้า ADC เกิน 1VDC

การสร้างตัวแปรขาอ้างอิงไปยัง ADC ของ ESP8266 ต้องนำเข้าไลบรารี machine และประกาศตัวแปรดังนี้

from machine import ADC
ตัวแปรadc = ADC(0)

การอ่านค่าจากวงจร ADC ของ ESP8266 ใช้คำสั่งรูปแบบต่อไปนี้

ค่าตัวเลขจำนวนเต็ม = ตัวแปรadc.read()

การต่อวงจร

การต่อวงจรเป็นดังภาพที่ 3 โดยการเชื่อมต่อขาสัญญาณจากวงจรของเซ็นเซอร์กับ ESP8266 เป็นดังนี้

วงจรเซ็นเซอร์ –> ESP8266
Vcc –> 3V3
GND –> GND
A0 –> A0

ภาพที่ 3 ตัวอย่างการต่อวงจร

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรม code4-1 เป็นการอ่านค่าจากการแปลงสัญญาแอนาล็อกมาเป็นสัญญาณดิจิทัลแสดงผลผ่าน RS232 ทุก 1 วินาที

import time
from machine import ADC
pinAdc = ADC(0)
while True:
    dValue = pinAdc.read()
    print(dValue)
    time.sleep_ms(1000)

ตัวอย่างโปรแกรมแสดงผลบนเว็บ

ตัวอย่างโปรแกรม code4-2 เป็นการปรับปรุงการทำงานของ code4-1 ให้เปลี่ยนเป็นการแสดงผลผ่านเว็บ

#code4-2
import socket
import network
import esp
from machine import ADC
#---(1)
pinAdc = ADC(0)
ap = network.WLAN(network.AP_IF)
#---(2)
ssid = 'JarutEx-AP'
password = '123456789'
ap.active(True)
ap.config(essid=ssid, password=password)
while ap.active() == False:
  pass
print('Connection successful')
#---(3)
def web_page():
    dValue = pinAdc.read()
    html = """<html><head><meta name="viewport"
      content="width=device-width, initial-scale=1"></head>
      <body><h1>Sensor Value = """
    html += str(dValue)
    html += "</h1></body></html>"
    return html
#---(4)
print(ap.ifconfig())
#---(5)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)
#---(6)
while True:
    conn, addr = s.accept()
    print('conn {} from {}'.format(conn, addr))
    request = conn.recv(1024)
    print('request = {}'.format(request))
    response = web_page()
    conn.send('HTTP/1.1 200 OK\n')
    conn.send('Content-Type: text/html\n')
    conn.send('Connection: close\n\n')
    conn.send(response)
    conn.close()

สรุป

จากบทความนี้เราได้ทำความรู้จักกับ ADC ซึ่งเป็นโมดูลสำคัญที่ทำหน้าที่แปลงสัญญาณดิจิทัลแรงดันไม่เกิน 1VDC และบนบอร์ดมีวงจรทอนแรงดันจาก 3V3 ให้เหลือ 1VDC และเขียนโปรแกรมภาษาไพธอนเพื่ออ่านค่าจากวงจรดังกล่าวมาแสดงผลผ่าน RS232 ในตัวอย่าง code4-1 และแสดงผลผ่านเว็บในโหมด AP ในตัวอย่าง code4-2

สุดท้ายนี้พวกเราทีม JarutEx หวังว่าตัวอย่างจากบทนี้จะเป็นตัวอย่างและแนวทางสำหรับผู้สนใจเขียนโปรแกรมอ่านค่าจากเซ็นเซอร์ความชื้นของดินมาใช้งาน และขอให้สนุกกับการเขียนโปรแกรมครับ


(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุง 2020-10-03