บทความนี้แนะนำการใช้ esp8266 เพื่ออ่านอุณหภูมิความชื้นจากเซ็นเซอร์ DHT11 ค่าแรงดันจากเซ็นเซอร์ LDR รับค่าจากสวิตช์ และแสดงผลผ่านทาง OLED ด้วยภาษาไพธอนของ MicroPython โดยคุณสมบัตินี้เป็นบอร์ด dCore-espWST ที่พวกเราใช้งาน (ซึ่งบทความก่อนหน้านี้เราก็ใช้ตัว dCore-esp32WST ที่มีการออกแบบเหมือนกันแต่ใช้ esp32 แต่โค้ดโปรแกรมยังคงใช้กับบอร์ดรุ่นได้ด้วยเช่นกัน) และเป็นบอร์ดสำหรับใช้ในการเรียนการสอนวิชา IoT โดยโครงสร้างต้นแบบของบอร์ดเป็นดังภาพที่ 1 ซึ่งปกติจะใช้กับชุดจ่ายไฟจากระบบแบตเตอรีพร้อมวงจรชาร์จจากแผงโซลาเซลล์
ผังวงจร
จากบอร์ดต้นแบบ dCore-espWST มีการต่อวงจรดังภาพที่ 2 ซึ่งอุปกรณ์ที่ต้องใช้ ได้แก่
- บอร์ด esp8266
- โมดูล DHT11 หรือ DHT22 สำเร็จหรือใช้แบบประกอบเอง (เป็นตัวโมดูลแบบ 4 ขา) โดยต่อ R-Pull up ขนาด 10K
- โมดูล OLED แบบ I2C
- โมดูล LDR หรือใช้ LDR กับ R ที่มีความต้านทาน 10K
- สวิตช์กดติดปล่อยดับและตัวต้านทาน 10K เพื่อทำ R-pull up
ตัวอย่างโปรแกรม
ตัวอย่างโปรแกรมเป็นการทดสอบการทำงานของบอร์ด โดยมีหลักการทำงานดังนี้
- กำหนดค่าเริ่มต้นการทำงาน
- แสดงข้อมูลจากเซ็นเซอร์ไปที่จอแสดงผล OLED
- ถ้าระยะห่างของเวลาจากการกดอยู่ในช่วง 2 วินาที จะแสดงอุณหภูมิและความชื้อนเป็น n/a
- ถ้าเกินกว่า 2 วินาที ให้อ่านค่าจาก DHT11 และแสดงค่าอุณหภูมิและความชื้นที่อ่านได้
- ถ้าผู้ใช้กด 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
สรุป
จากตัวอย่างในบทความจะสามารถนำไปปรับปรุงให้จัดเก็บข้อมูลลงไฟล์เหมือนกับบทความก่อนหน้านี้ (The MicroPython Internal File System.)ได้ นอกจากนี้สามารถนำไปประยุกต์กับการใช้เป็นเว็บเพื่อให้บริการแก่ลูกข่ายเหมือนกับบทความ ESP8266/ESP32 WiFi หรือใช้เป็นเครื่องให้บริการที่รอลูกข่ายร้องขอแล้วส่งข้อมูลกลับไปเหมือนกับบทความการเขียนโปรแกรมไคลเอนต์/เซิร์ฟเวอร์สำหรับสถานีอากาศผ่านระบบเครือข่ายไร้สาย เป็นต้น ซึ่งจะเห็นว่าการเขียนด้วยภาษาไพธอนยังคงมีข้อดีเรื่องของการย้ายโค้ดไปมาระหว่างแพล็ตฟอร์ม ดังนั้น ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ
(C) 2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-09-16, 2021-12-02