[TH] The dCore-espWST

บทความนี้แนะนำการใช้ esp8266 เพื่ออ่านอุณหภูมิความชื้นจากเซ็นเซอร์ DHT11 ค่าแรงดันจากเซ็นเซอร์ LDR รับค่าจากสวิตช์ และแสดงผลผ่านทาง OLED ด้วยภาษาไพธอนของ MicroPython โดยคุณสมบัตินี้เป็นบอร์ด dCore-espWST ที่พวกเราใช้งาน (ซึ่งบทความก่อนหน้านี้เราก็ใช้ตัว dCore-esp32WST ที่มีการออกแบบเหมือนกันแต่ใช้ esp32 แต่โค้ดโปรแกรมยังคงใช้กับบอร์ดรุ่นได้ด้วยเช่นกัน) และเป็นบอร์ดสำหรับใช้ในการเรียนการสอนวิชา IoT โดยโครงสร้างต้นแบบของบอร์ดเป็นดังภาพที่ 1 ซึ่งปกติจะใช้กับชุดจ่ายไฟจากระบบแบตเตอรีพร้อมวงจรชาร์จจากแผงโซลาเซลล์

ภาพที่ 1 ต้นแบบของบอร์ด dCore-espWST

ผังวงจร

จากบอร์ดต้นแบบ dCore-espWST มีการต่อวงจรดังภาพที่ 2 ซึ่งอุปกรณ์ที่ต้องใช้ ได้แก่

  1. บอร์ด esp8266
  2. โมดูล DHT11 หรือ DHT22 สำเร็จหรือใช้แบบประกอบเอง (เป็นตัวโมดูลแบบ 4 ขา) โดยต่อ R-Pull up ขนาด 10K
  3. โมดูล OLED แบบ I2C
  4. โมดูล LDR หรือใช้ LDR กับ R ที่มีความต้านทาน 10K
  5. สวิตช์กดติดปล่อยดับและตัวต้านทาน 10K เพื่อทำ R-pull up
ภาพที่ 2 ผังวงจรของ dCore-espWST

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

ตัวอย่างโปรแกรมเป็นการทดสอบการทำงานของบอร์ด โดยมีหลักการทำงานดังนี้

  1. กำหนดค่าเริ่มต้นการทำงาน
  2. แสดงข้อมูลจากเซ็นเซอร์ไปที่จอแสดงผล OLED
    1. ถ้าระยะห่างของเวลาจากการกดอยู่ในช่วง 2 วินาที จะแสดงอุณหภูมิและความชื้อนเป็น n/a
    2. ถ้าเกินกว่า 2 วินาที ให้อ่านค่าจาก DHT11 และแสดงค่าอุณหภูมิและความชื้นที่อ่านได้
  3. ถ้าผู้ใช้กด SW โดยก่อนหน้านี้ยังไม่ได้กด จะเรียกขั้นตอนที่ 2

โค้ดโปรแกรมเป็นต่อไปนี้

##################################################################################
# dCore-espWST-test
# (C) 2021, JarutEx
##################################################################################
import gc
import os
import sys
import time
import math
import machine as mc
from machine import Pin,I2C,ADC
import ssd1306
import dht

##################################################################################
gc.enable()
gc.collect()
mc.freq(160000000)

sclPin = Pin(5)
sdaPin = Pin(4)
dValue = ADC(0)
dht11 = dht.DHT11(Pin(13))
sw = Pin(12, Pin.IN, Pin.PULL_UP)
i2c = I2C(scl=sclPin, sda=sdaPin, freq=1000000)

oled_addr = const(0x3c)
oled = ssd1306.SSD1306_I2C(128,64,i2c,oled_addr)
oled.poweron()
t0 = time.ticks_ms()
t1 = time.ticks_ms()

##################################################################################
def showData():
    global t0,t1
    oled.fill(0)
    oled.fill_rect(0,0,128,18,1)
    oled.text("dCore",8,4,0)
    oled.text("dCore",9,4,0)
    oled.text("espWST1",64,4,0)
    oled.text("LDR :{}".format(dValue.read()),12,28,1)
    t1 = time.ticks_ms()
    if (math.fabs(t0-t1)>2000):
        dht11.measure()
        t0 = time.ticks_ms()
        oled.text("Tem.:{}C".format(dht11.temperature()),12,36,1)
        oled.text("Hum.:{}%".format(dht11.humidity()),12,44,1)
    else:
        oled.text("Tem.:n/a",12,36,1)
        oled.text("Hum.:n/a",12,44,1)
    oled.show()

##################################################################################
# main program
##################################################################################
try:
    oldSwValue = 1
    showData()
    while True:
        swValue = sw.value()
        if ((swValue==0) and (oldSwValue != swValue)):
            showData()
        oldSwValue = swValue
        time.sleep_ms(25) # ป้องกันการกระเพื่อมของสัญญาณจากสวิตช์ (debounce)
except KeyboardInterrupt:
    pass
oled.poweroff()
print("end of program")

ตัวอย่างผลลัพธ์จากการทำงานเป็นดังภาพที่ 3

ภาพที่ 3 ตัวอย่างผลลัพธ์การทำงานของโปรแกรม

สรุป

จากตัวอย่างในบทความจะสามารถนำไปปรับปรุงให้จัดเก็บข้อมูลลงไฟล์เหมือนกับบทความก่อนหน้านี้ (The MicroPython Internal File System.)ได้ นอกจากนี้สามารถนำไปประยุกต์กับการใช้เป็นเว็บเพื่อให้บริการแก่ลูกข่ายเหมือนกับบทความ ESP8266/ESP32 WiFi หรือใช้เป็นเครื่องให้บริการที่รอลูกข่ายร้องขอแล้วส่งข้อมูลกลับไปเหมือนกับบทความการเขียนโปรแกรมไคลเอนต์/เซิร์ฟเวอร์สำหรับสถานีอากาศผ่านระบบเครือข่ายไร้สาย เป็นต้น ซึ่งจะเห็นว่าการเขียนด้วยภาษาไพธอนยังคงมีข้อดีเรื่องของการย้ายโค้ดไปมาระหว่างแพล็ตฟอร์ม ดังนั้น ขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ

(C) 2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ

ปรับปรุงเมื่อ 2021-09-16, 2021-12-02