แนะนำบอร์ด ESP32S
แนะนำบอร์ด ESP32S
แนะนำโปรแกรมและการติดตั้งโปรแกรม
ดาวน์โหลดโปรแกรม Thonny และ คลิกที่ตาม os ของตัวเองที่มุมขวาบน และติดตั้งให้เรียบร้อย
ดาวน์โหลด firmware Micro python เวอร์ชั่นล่าสุด สำหรับ บอร์ดรุ่น ESP32S
ขั้นตอนต่อไปให้ทำการเสียบบอร์ด เข้ากับ Computer แล้วทำตามขั้นตอนต่อไปนี้
ให้เช็ค port ว่าที่เสียบบอร์ดเข้า Computer อยู่ port ที่เท่าไหร่ เช็คโดยการ
คลิกขวาที่ This PC > เลือก Manage > เลือก Device Manager เลื่อนหา Ports (COM & LPT)
2. หากมองไม่เห็น port ให้ดาวน์โหลดและติดตั้งไดร์เวอร์ให้เรียบร้อย
แล้วไปเช็คที่ Ports (COM & LPT) อีกครั้ง
เลือก CP210x VCP Windows หรือ CP210x VCP Mac OSX Driver
วิธีลง firmware ด้วย thonny
ไปที่ Tools >> Options..
2. ที่แถบด้านบนเลือก Interpreter
แล้วเลือกตามรุ่นบอร์ด MicroPython (ESP32)
แล้วคลิก install or update firmware
3. ตรง Port ให้เลือกไปยัง Port ที่เสียบ ESP32 อยู่ และตรง frimware ให้ Browse ไปที่ ไฟล์ Firmware
ที่โหลดมา แล้วกด Install รอจนเสร็จเป็นอันเรียบร้อย
วิธีใช้โปรแกรม Thonny กับบอร์ด ESP32S
ไปที่ Tools > Options > Interpreter
ให้เลือก ตรง ช่องที่ 1 เป็น MicroPython (ชื่อบอร์ดที่เราใช้)
ช่องที่ 2 เป็น Port ของบอร์ดที่เราเสียบ
ตัวอย่างโปรแกรมร่วมกับเซ็นเซอร์ต่าง ๆ
from machine import Pin
import time
led = Pin(2, Pin.OUT)
while True:
led.on()
time.sleep(0.5)
led.off()
time.sleep(0.5)
from machine import Pin
import time
# ---------- กำหนดขา LED ----------
led1 = Pin(15, Pin.OUT)
led2 = Pin(16, Pin.OUT)
led3 = Pin(17, Pin.OUT)
while True:
led1.on()
time.sleep(0.1)
led1.off()
led2.on()
time.sleep(0.1)
led2.off()
led3.on()
time.sleep(0.1)
led3.off()
from machine import Pin, PWM
import time
# ---------- กำหนดขา Servo ----------
servo1 = PWM(Pin(22), freq=50)
# ---------- ฟังก์ชั่นควบคุม Servo ด้วยค่ามุมองศา ----------
def set_angle1(angle):
duty1 = int(26 + (angle / 180) * 102) # Map 0-180° to 26-128 duty
servo1.duty(duty1)
while True:
# ---------- ควบคุม Servo ด้วยค่ามุมองศา ----------
set_angle1(10)
time.sleep(5)
set_angle1(170)
time.sleep(5)
import dht
import machine
import time
# กำหนดขา GPIO ที่เชื่อมต่อกับ DHT11/DHT22
DHT_PIN = 4 # เปลี่ยนเป็นขา GPIO ที่ใช้งานจริง
# สร้างอ็อบเจ็กต์ DHT (ใช้ dht.DHT11 หรือ dht.DHT22 ตามเซ็นเซอร์ที่ใช้)
sensor = dht.DHT22(machine.Pin(DHT_PIN)) # หรือใช้ dht.DHT11 ถ้าใช้ DHT11
def read_dht():
try:
# อ่านข้อมูลจากเซ็นเซอร์
sensor.measure()
temp = sensor.temperature() # อ่านอุณหภูมิ (°C)
hum = sensor.humidity() # อ่านความชื้น (%)
print('Temperature: {}°C Humidity: {}%'.format(temp, hum))
except OSError as e:
print('Failed to read DHT sensor:', e)
# ลูปหลัก
while True:
read_dht()
time.sleep(2) # รอ 2 วินาทีก่อนอ่านครั้งถัดไป
วิธีใช้งาน:
เชื่อมต่อเซ็นเซอร์ DHT11/DHT22 กับ ESP32:
ขา VCC → 3.3V หรือ 5V
ขา GND → GND
ขา Data → GPIO4 (หรือเปลี่ยนตามขาที่กำหนดในโค้ด)
ใส่ตัวต้านทาน pull-up 4.7k-10kΩ ระหว่าง VCC และ Data
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์จะแสดงอุณหภูมิและความชื้นใน Serial Monitor ทุก 2 วินาที
หมายเหตุ:
ใช้ dht.DHT11 แทน dht.DHT22 หากใช้เซ็นเซอร์ DHT11
ตรวจสอบให้แน่ใจว่าได้ติดตั้งไลบรารี dht ใน MicroPython แล้ว
DHT11/DHT22 ควรอ่านข้อมูลทุก 1-2 วินาทีเพื่อป้องกันข้อผิดพลาด
โมดูล dht เป็นส่วนหนึ่งของ MicroPython core library สำหรับบอร์ดอย่าง ESP32 และ ESP8266
ลองรันโค้ดต่อไปนี้ใน REPL เพื่อตรวจสอบ:
import dht
print(dir(dht))
หากไม่มีข้อผิดพลาดและแสดงรายการเมธอดเช่น ['DHT11', 'DHT22'] แปลว่าไลบรารีพร้อมใช้งาน
import machine
import time
# กำหนดขา GPIO สำหรับ Trigger และ Echo
TRIGGER_PIN = 5 # ขา Trigger
ECHO_PIN = 18 # ขา Echo
# สร้างอ็อบเจ็กต์สำหรับขา Trigger และ Echo
trigger = machine.Pin(TRIGGER_PIN, machine.Pin.OUT)
echo = machine.Pin(ECHO_PIN, machine.Pin.IN)
def measure_distance():
# ส่งสัญญาณ Trigger เป็นเวลา 10 ไมโครวินาที
trigger.value(0)
time.sleep_us(2)
trigger.value(1)
time.sleep_us(10)
trigger.value(0)
# รอสัญญาณ Echo เริ่มต้น
while echo.value() == 0:
pass
start = time.ticks_us()
# รอจนกว่าสัญญาณ Echo จะสิ้นสุด
while echo.value() == 1:
pass
end = time.ticks_us()
# คำนวณระยะทาง (ความเร็วเสียง = 343 m/s หรือ 0.0343 cm/us)
duration = time.ticks_diff(end, start)
distance = (duration * 0.0343) / 2 # หาร 2 เพราะไป-กลับ
return distance
# ลูปหลัก
while True:
try:
dist = measure_distance()
print('Distance: {:.2f} cm'.format(dist))
time.sleep(0.1) # รอ 100 มิลลิวินาทีก่อนวัดครั้งถัดไป
except:
print('Error reading ultrasonic sensor')
time.sleep(0.5)
วิธีใช้งาน:
เชื่อมต่อเซ็นเซอร์ HC-SR04 กับ ESP32:
ขา VCC → 5V (หรือ 3.3V ในบางรุ่น)
ขา GND → GND
ขา Trigger → GPIO5 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
ขา Echo → GPIO18 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์จะแสดงระยะทางเป็นเซนติเมตรใน Serial Monitor ทุก 100 มิลลิวินาที
หมายเหตุ:
ตรวจสอบว่าแหล่งจ่ายไฟเหมาะสมกับ HC-SR04 (บางรุ่นต้องการ 5V)
ระยะการวัดของ HC-SR04 อยู่ที่ประมาณ 2 ซม. ถึง 400 ซม.
หากเกิดข้อผิดพลาดบ่อยครั้ง ให้ตรวจสอบการเชื่อมต่อหรือเพิ่มตัวต้านทาน pull-down ที่ขา Echo
ควรเว้นระยะเวลาระหว่างการวัด (เช่น 100 มิลลิวินาที) เพื่อป้องกันสัญญาณรบกวน
import machine
import time
# กำหนดขา GPIO สำหรับ LDR
LDR_PIN = 34 # ขา ADC ที่เชื่อมต่อกับ LDR
# สร้างอ็อบเจ็กต์ ADC สำหรับ LDR
ldr = machine.ADC(machine.Pin(LDR_PIN))
ldr.atten(machine.ADC.ATTN_11DB) # ตั้งค่าให้วัดได้ถึง 3.3V
def read_ldr():
try:
# อ่านค่า ADC (0-4095)
ldr_value = ldr.read()
# แปลงเป็นเปอร์เซ็นต์ความสว่าง (ประมาณการ)
brightness = (ldr_value / 4095) * 100
print('LDR Value: {}, Brightness: {:.2f}%'.format(ldr_value, brightness))
return brightness
except Exception as e:
print('Error reading LDR:', e)
return None
# ลูปหลัก
while True:
read_ldr()
time.sleep(0.5) # รอ 500 มิลลิวินาทีก่อนอ่านครั้งถัดไป
วิธีใช้งาน:
การเชื่อมต่อ LDR กับ ESP32:
ขั้วหนึ่งของ LDR เชื่อมต่อกับ 3.3V
ขั้วอีกหนึ่งของ LDR เชื่อมต่อกับขา GPIO34 (หรือขา ADC อื่นๆ) และต่อตัวต้านทาน (เช่น 10kΩ) ลงสู่ GND เพื่อสร้างวงจรแบ่งแรงดัน
ตรวจสอบว่าใช้ขา ADC1 (เช่น GPIO32-GPIO39) เพราะ ADC2 ไม่สามารถใช้งานได้เมื่อ Wi-Fi เปิดอยู่
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์:
ค่า LDR จะแสดงใน Serial Monitor เป็นทั้งค่า ADC ดิบ (0-4095) และเปอร์เซ็นต์ความสว่างโดยประมาณ ทุก 500 มิลลิวินาที
หมายเหตุ:
ค่า ADC จะเปลี่ยนตามระดับแสง: แสงมาก → ค่า ADC ต่ำ, แสงน้อย → ค่า ADC สูง (ขึ้นอยู่กับการต่อวงจร)
อาจต้องปรับเทียบค่าเปอร์เซ็นต์ความสว่างตามสภาพแวดล้อมและตัวต้านทานที่ใช้
หากต้องการความแม่นยำมากขึ้น ให้ปรับตัวต้านทานหรือเพิ่มการคำนวณเพื่อแปลงค่า ADC เป็นหน่วย Lux
ตรวจสอบการเชื่อมต่อให้แน่นหนาเพื่อลดสัญญาณรบกวน
import machine
import time
# กำหนดขา GPIO สำหรับ PIR Sensor
PIR_PIN = 27 # ขา GPIO ที่เชื่อมต่อกับขา OUT ของ HC-SR501
# สร้างอ็อบเจ็กต์สำหรับขา PIR
pir = machine.Pin(PIR_PIN, machine.Pin.IN)
def check_motion():
try:
if pir.value() == 1:
print("Motion Detected!")
else:
print("No Motion")
except Exception as e:
print('Error reading PIR sensor:', e)
# ลูปหลัก
while True:
check_motion()
time.sleep(0.2) # รอ 200 มิลลิวินาทีก่อนตรวจจับครั้งถัดไป
วิธีใช้งาน:
การเชื่อมต่อ HC-SR501 กับ ESP32:
ขา VCC → 5V (หรือ 3.3V ในบางรุ่น)
ขา GND → GND
ขา OUT → GPIO27 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์:
เมื่อมีการเคลื่อนไหว เซ็นเซอร์จะส่งสัญญาณ HIGH (1) และแสดง "Motion Detected!" ใน Serial Monitor
หากไม่มีการเคลื่อนไหว จะแสดง "No Motion" ทุก 200 มิลลิวินาที
หมายเหตุ:
HC-SR501 มีตัวปรับความไวและหน่วงเวลา (delay) บนบอร์ด ควรปรับให้เหมาะสมกับการใช้งาน
เซ็นเซอร์อาจใช้เวลาสักครู่ในการเริ่มทำงานหลังจากจ่ายไฟ (ประมาณ 10-60 วินาที)
ตรวจสอบว่าแหล่งจ่ายไฟเหมาะสม (5V หรือ 3.3V ตามรุ่นของ HC-SR501)
หากต้องการลดการตรวจจับซ้ำถี่เกินไป ให้เพิ่มระยะเวลา time.sleep หรือใช้ interrupt แทนการตรวจจับแบบวนลูป
import machine
import time
# กำหนดขา GPIO สำหรับ MQ-2
MQ2_PIN = 34 # ขา ADC ที่เชื่อมต่อกับขา OUT ของ MQ-2
# สร้างอ็อบเจ็กต์ ADC สำหรับ MQ-2
mq2 = machine.ADC(machine.Pin(MQ2_PIN))
mq2.atten(machine.ADC.ATTN_11DB) # ตั้งค่าให้วัดได้ถึง 3.3V
def read_mq2():
try:
# อ่านค่า ADC (0-4095)
mq2_value = mq2.read()
# แปลงเป็นเปอร์เซ็นต์ (ประมาณการความเข้มข้นของก๊าซ)
gas_level = (mq2_value / 4095) * 100
print('MQ-2 Value: {}, Gas Level: {:.2f}%'.format(mq2_value, gas_level))
# ตรวจสอบระดับก๊าซ (ปรับเกณฑ์ตามการใช้งานจริง)
if mq2_value > 1000: # ค่านี้ต้องปรับตามการสอบเทียบ
print('Warning: High Gas/Smoke Detected!')
return gas_level
except Exception as e:
print('Error reading MQ-2 sensor:', e)
return None
# ลูปหลัก
while True:
read_mq2()
time.sleep(0.5) # รอ 500 มิลลิวินาทีก่อนอ่านครั้งถัดไป
วิธีใช้งาน:
การเชื่อมต่อ MQ-2 กับ ESP32:
ขา VCC → 5V (หรือ 3.3V ตามสเปกของเซ็นเซอร์)
ขา GND → GND
ขา OUT (หรือ AOUT) → GPIO34 (หรือขา ADC อื่นๆ เช่น GPIO32-GPIO39)
อาจต้องใช้ตัวต้านทาน pull-down (เช่น 10kΩ) หากสัญญาณไม่เสถียร
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์:
ค่า ADC ดิบ (0-4095) และระดับก๊าซโดยประมาณ (เปอร์เซ็นต์) จะแสดงใน Serial Monitor ทุก 500 มิลลิวินาที
หากตรวจพบก๊าซหรือควันในระดับสูง (ค่า ADC > 1000) จะแสดงคำเตือน
หมายเหตุ:
การสอบเทียบ: ค่าเกณฑ์ 1000 ในโค้ดเป็นเพียงตัวอย่าง ต้องสอบเทียบ MQ-2 กับสภาพแวดล้อมจริงและประเภทก๊าซที่ต้องการตรวจจับ (เช่น มีเทน, โพรเพน, ควัน)
เวลา warm-up: MQ-2 ต้องใช้เวลา warm-up (ประมาณ 1-2 นาที) หลังจ่ายไฟเพื่อให้ได้ค่าที่เสถียร
การแปลงค่า: การแปลงค่า ADC เป็นเปอร์เซ็นต์ในโค้ดเป็นเพียงการประมาณ อาจต้องใช้สูตรเฉพาะตาม datasheet ของ MQ-2 เพื่อความแม่นยำ
ขา ADC: ใช้ขา ADC1 (เช่น GPIO34) เพราะ ADC2 ไม่ทำงานเมื่อ Wi-Fi เปิดอยู่
ความปลอดภัย: MQ-2 อาจร้อนขณะทำงาน ควรติดตั้งในที่ที่มีการระบายอากาศดีและระวังการสัมผัส
หากต้องการความแม่นยำสูง ควรอ่านค่าเฉลี่ยจากหลายรอบเพื่อลดสัญญาณรบกวน
from machine import Pin, I2C
import time
import mpu6050 # ต้องติดตั้งไลบรารี mpu6050
# กำหนดขา I2C สำหรับ MPU6050
SCL_PIN = 22 # ขา SCL
SDA_PIN = 21 # ขา SDA
# สร้างอ็อบเจ็กต์ I2C
i2c = I2C(scl=Pin(SCL_PIN), sda=Pin(SDA_PIN))
# สร้างอ็อบเจ็กต์ MPU6050
mpu = mpu6050.MPU6050(i2c)
def read_mpu6050():
try:
# อ่านข้อมูลจากเซ็นเซอร์
accel = mpu.get_acceleration() # ค่าความเร่ง (x, y, z)
gyro = mpu.get_gyro() # ค่าการหมุน (x, y, z)
temp = mpu.get_temperature() # อุณหภูมิ (°C)
print('Acceleration (x, y, z): {:.2f}, {:.2f}, {:.2f} g'.format(
accel['x'] / 16384.0, accel['y'] / 16384.0, accel['z'] / 16384.0))
print('Gyro (x, y, z): {:.2f}, {:.2f}, {:.2f} deg/s'.format(
gyro['x'] / 131.0, gyro['y'] / 131.0, gyro['z'] / 131.0))
print('Temperature: {:.2f} °C'.format(temp))
except Exception as e:
print('Error reading MPU6050:', e)
# ลูปหลัก
while True:
read_mpu6050()
time.sleep(0.5) # รอ 500 มิลลิวินาทีก่อนอ่านครั้งถัดไป
วิธีใช้งาน:
การเชื่อมต่อ MPU6050 กับ ESP32:
ขา VCC → 3.3V
ขา GND → GND
ขา SCL → GPIO22 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
ขา SDA → GPIO21 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
ติดตั้งไลบรารี:
ต้องติดตั้งไลบรารี mpu6050 ใน MicroPython สามารถดาวน์โหลดได้จาก micropython-mpu6050 หรือใช้เครื่องมือเช่น upip:
bash
import upip
upip.install('micropython-mpu6050')
อัปโหลดไฟล์ไลบรารีไปยัง ESP32 หากจำเป็น
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์:
ค่าความเร่ง (g), การหมุน (องศา/วินาที), และอุณหภูมิ (°C) จะแสดงใน Serial Monitor ทุก 500 มิลลิวินาที
หมายเหตุ:
การแปลงค่า: ค่าความเร่งและการหมุนถูกแปลงโดยใช้ตัวหารมาตรฐาน (16384 สำหรับความเร่ง, 131 สำหรับการหมุน) ตาม datasheet ของ MPU6050 อาจต้องปรับตามการตั้งค่า sensitivity
การสอบเทียบ: MPU6050 อาจต้องสอบเทียบเพื่อให้ได้ค่าที่แม่นยำ โดยเฉพาะสำหรับการตรวจจับการเอียง อาจต้องคำนวณมุมจากข้อมูลความเร่งเพิ่มเติม
I2C: ตรวจสอบว่าการเชื่อมต่อ I2C เสถียร (อาจต้องใช้ตัวต้านทาน pull-up 4.7kΩ ที่ขา SCL และ SDA)
การใช้งาน: หากต้องการตรวจจับการเอียงอย่างง่าย สามารถคำนวณมุมจาก accel['x'], accel['y'], และ accel['z'] โดยใช้สูตร arctan
พลังงาน: ตรวจสอบว่าแหล่งจ่ายไฟเพียงพอ (3.3V) และการเชื่อมต่อแน่นหนาเพื่อลดสัญญาณรบกวน
import machine
import time
# กำหนดขา GPIO สำหรับ Soil Moisture Sensor
SOIL_PIN = 34 # ขา ADC ที่เชื่อมต่อกับขา AOUT ของเซ็นเซอร์
# สร้างอ็อบเจ็กต์ ADC สำหรับ Soil Moisture Sensor
soil = machine.ADC(machine.Pin(SOIL_PIN))
soil.atten(machine.ADC.ATTN_11DB) # ตั้งค่าให้วัดได้ถึง 3.3V
def read_soil_moisture():
try:
# อ่านค่า ADC (0-4095)
soil_value = soil.read()
# แปลงเป็นเปอร์เซ็นต์ความชื้น (ประมาณการ)
# ค่า ADC สูง = ดินแห้ง, ค่า ADC ต่ำ = ดินชื้น
moisture_percent = 100 - ((soil_value / 4095) * 100)
print('Soil Moisture Value: {}, Moisture: {:.2f}%'.format(soil_value, moisture_percent))
# ตรวจสอบระดับความชื้น
if moisture_percent < 30:
print('Warning: Soil is too dry!')
elif moisture_percent > 70:
print('Soil is very wet!')
return moisture_percent
except Exception as e:
print('Error reading Soil Moisture sensor:', e)
return None
# ลูปหลัก
while True:
read_soil_moisture()
time.sleep(1) # รอ 1 วินาทีก่อนอ่านครั้งถัดไป
วิธีใช้งาน:
การเชื่อมต่อ Soil Moisture Sensor กับ ESP32:
ขา VCC → 3.3V หรือ 5V (ขึ้นอยู่กับรุ่นของเซ็นเซอร์)
ขา GND → GND
ขา AOUT (Analog Output) → GPIO34 (หรือขา ADC อื่นๆ เช่น GPIO32-GPIO39)
ตรวจสอบว่าเซ็นเซอร์เชื่อมต่อถูกต้องและขา ADC1 ถูกใช้งาน (ADC2 ไม่ทำงานเมื่อ Wi-Fi เปิด)
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์:
ค่า ADC ดิบ (0-4095) และระดับความชื้นโดยประมาณ (เปอร์เซ็นต์) จะแสดงใน Serial Monitor ทุก 1 วินาที
หากความชื้นต่ำกว่า 30% จะแสดงคำเตือนว่าดินแห้งเกินไป และถ้าสูงกว่า 70% จะระบุว่าดินชื้นมาก
หมายเหตุ:
การสอบเทียบ: ค่าเปอร์เซ็นต์ความชื้นในโค้ดเป็นการประมาณ ต้องสอบเทียบเซ็นเซอร์ในสภาพแห้งสนิท (เช่น ในอากาศ) และชื้นเต็มที่ (เช่น ในน้ำ) เพื่อกำหนดช่วงค่า ADC ที่แม่นยำ
การแปลงค่า: ค่า ADC สูงเมื่อดินแห้งและต่ำเมื่อดินชื้น อาจต้องปรับสูตรตามรุ่นเซ็นเซอร์
การป้องกันการกัดกร่อน: เซ็นเซอร์ Soil Moisture บางรุ่นอาจกัดกร่อนเมื่อสัมผัสความชื้นนาน ควรถอดออกเมื่อไม่ใช้งาน
ความเสถียร: หากสัญญาณไม่เสถียร อาจเพิ่มตัวต้านทาน pull-down หรืออ่านค่าเฉลี่ยจากหลายรอบ
แหล่งจ่ายไฟ: ตรวจสอบว่าเซ็นเซอร์ใช้ 3.3V หรือ 5V ตามสเปกเพื่อป้องกันความเสียหาย
import machine
import time
# กำหนดขา GPIO สำหรับ KY-038
MIC_ANALOG_PIN = 34 # ขา AOUT สำหรับสัญญาณอนาล็อก
# สร้างอ็อบเจ็กต์ ADC สำหรับไมโครโฟน
mic = machine.ADC(machine.Pin(MIC_ANALOG_PIN))
mic.atten(machine.ADC.ATTN_11DB) # ตั้งค่าให้วัดได้ถึง 3.3V
def read_microphone():
try:
# อ่านค่า ADC (0-4095)
mic_value = mic.read()
# แปลงเป็นเปอร์เซ็นต์ระดับเสียง (ประมาณการ)
sound_level = (mic_value / 4095) * 100
print('Microphone Value: {}, Sound Level: {:.2f}%'.format(mic_value, sound_level))
# ตรวจสอบระดับเสียง
if mic_value > 1500: # ปรับเกณฑ์ตามการใช้งานจริง
print('Warning: Loud sound detected!')
return sound_level
except Exception as e:
print('Error reading KY-038 microphone:', e)
return None
# ลูปหลัก
while True:
read_microphone()
time.sleep(0.1) # รอ 100 มิลลิวินาทีก่อนอ่านครั้งถัดไป
วิธีใช้งาน:
การเชื่อมต่อ KY-038 กับ ESP32:
ขา VCC → 3.3V หรือ 5V (ขึ้นอยู่กับรุ่นของ KY-038)
ขา GND → GND
ขา AOUT (Analog Output) → GPIO34 (หรือขา ADC อื่นๆ เช่น GPIO32-GPIO39)
ขา DOUT (Digital Output) ไม่ได้ใช้ในโค้ดนี้ แต่สามารถต่อเพื่อตรวจจับระดับเสียงเกินเกณฑ์แบบดิจิทัลได้
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์:
ค่า ADC ดิบ (0-4095) และระดับเสียงโดยประมาณ (เปอร์เซ็นต์) จะแสดงใน Serial Monitor ทุก 100 มิลลิวินาที
หากระดับเสียงสูงเกินเกณฑ์ (เช่น ค่า ADC > 1500) จะแสดงคำเตือนว่าตรวจพบเสียงดัง
หมายเหตุ:
การสอบเทียบ: ค่าเกณฑ์ 1500 ในโค้ดเป็นเพียงตัวอย่าง ต้องสอบเทียบตามสภาพแวดล้อมและความไวของไมโครโฟนโดยการทดสอบกับระดับเสียงต่างๆ
การแปลงค่า: การแปลงค่า ADC เป็นเปอร์เซ็นต์เป็นเพียงการประมาณ อาจต้องปรับสูตรตามความต้องการหรือใช้การคำนวณเดซิเบล (dB) เพื่อความแม่นยำ
ขา ADC: ใช้ขา ADC1 (เช่น GPIO34) เพราะ ADC2 ไม่ทำงานเมื่อ Wi-Fi เปิดอยู่
ความไว: KY-038 มีตัวปรับความไว (potentiometer) บนบอร์ด ควรหมุนปรับเพื่อตั้งค่าระดับการตรวจจับที่เหมาะสม
สัญญาณรบกวน: หากสัญญาณไม่เสถียร อาจเพิ่มตัวกรอง (เช่น ตัวเก็บประจุ) หรืออ่านค่าเฉลี่ยจากหลายรอบเพื่อลด noise
แหล่งจ่ายไฟ: ตรวจสอบว่ารุ่น KY-038 ใช้ 3.3V หรือ 5V เพื่อป้องกันความเสียหาย
from machine import Pin, I2C
import time
import bme280 # ต้องติดตั้งไลบรารี bme280
# กำหนดขา I2C สำหรับ BMP280/BME280
SCL_PIN = 22 # ขา SCL
SDA_PIN = 21 # ขา SDA
# สร้างอ็อบเจ็กต์ I2C
i2c = I2C(scl=Pin(SCL_PIN), sda=Pin(SDA_PIN))
# สร้างอ็อบเจ็กต์ BME280 (หรือ BMP280)
bme = bme280.BME280(i2c=i2c)
def read_bme280():
try:
# อ่านข้อมูลจากเซ็นเซอร์
temperature, pressure, humidity = bme.read_compensated_data()
# แปลงหน่วย
temperature = temperature / 100 # °C
pressure = pressure / 256 / 100 # hPa
humidity = humidity / 1024 # % (เฉพาะ BME280)
print('Temperature: {:.2f} °C'.format(temperature))
print('Pressure: {:.2f} hPa'.format(pressure))
if humidity is not None: # ตรวจสอบว่าเป็น BME280
print('Humidity: {:.2f} %'.format(humidity))
else:
print('Humidity: Not available (BMP280)')
except Exception as e:
print('Error reading BME280/BMP280:', e)
# ลูปหลัก
while True:
read_bme280()
time.sleep(1) # รอ 1 วินาทีก่อนอ่านครั้งถัดไป
วิธีใช้งาน:
การเชื่อมต่อ BMP280/BME280 กับ ESP32:
ขา VCC → 3.3V
ขา GND → GND
ขา SCL → GPIO22 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
ขา SDA → GPIO21 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
ติดตั้งไลบรารี:
ต้องติดตั้งไลบรารี micropython-bme280 ใน MicroPython สามารถดาวน์โหลดได้จาก micropython-bme280 หรือใช้ upip:
bash
import upip
upip.install('micropython-bme280')
อัปโหลดไฟล์ไลบรารีไปยัง ESP32 หากจำเป็น
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft
ผลลัพธ์:
ค่าอุณหภูมิ (°C), ความกดอากาศ (hPa), และความชื้น (%) (สำหรับ BME280) จะแสดงใน Serial Monitor ทุก 1 วินาที
หากใช้ BMP280 ค่าความชื้นจะแสดงว่าไม่พร้อมใช้งาน
หมายเหตุ:
BMP280 vs BME280: BMP280 วัดได้เฉพาะอุณหภูมิและความกดอากาศ ส่วน BME280 วัดความชื้นเพิ่มได้ โค้ดนี้รองรับทั้งสองรุ่น
I2C Address: ตรวจสอบที่อยู่ I2C ของเซ็นเซอร์ (ปกติ 0x76 หรือ 0x77) หากโค้ดไม่ทำงาน อาจต้องระบุที่อยู่ให้ชัดเจนใน bme280.BME280(i2c=i2c, address=0x76)
การสอบเทียบ: เซ็นเซอร์มีการชดเชยในตัว แต่ควรตรวจสอบความถูกต้องของค่ากับแหล่งอ้างอิง (เช่น เครื่องวัดอุณหภูมิหรือสถานีอากาศ)
I2C Stability: ใช้ตัวต้านทาน pull-up (4.7kΩ) ที่ขา SCL และ SDA หากสัญญาณไม่เสถียร
การใช้งาน: หากต้องการคำนวณระดับความสูงจากความกดอากาศ สามารถใช้สูตร altitude = 44330 * (1 - (pressure / sea_level_pressure) ** (1/5.255)) โดยกำหนด sea_level_pressure (เช่น 1013.25 hPa)
from machine import Pin, I2C
import ssd1306
import time
# กำหนดขา I2C สำหรับ OLED SSD1306
SCL_PIN = 22 # ขา SCL
SDA_PIN = 21 # ขา SDA
# สร้างอ็อบเจ็กต์ I2C
i2c = I2C(scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400000)
# สร้างอ็อบเจ็กต์ OLED (ปรับขนาดตามจอ: 128x64 หรือ 128x32)
oled = ssd1306.SSD1306_I2C(128, 64, i2c) # เปลี่ยนเป็น 128, 32 ถ้าใช้จอ 128x32
def display_text():
try:
# ล้างหน้าจอ
oled.fill(0)
# แสดงข้อความ
oled.text('Hello, ESP32!', 0, 0)
oled.text('MicroPython', 0, 10)
oled.text('OLED SSD1306', 0, 20)
# อัปเดตหน้าจอ
oled.show()
except Exception as e:
print('Error displaying on OLED:', e)
# ลูปหลัก
while True:
display_text()
time.sleep(1) # รอ 1 วินาทีก่อนอัปเดต
วิธีใช้งาน:
การเชื่อมต่อ OLED SSD1306 กับ ESP32:
ขา VCC → 3.3V
ขา GND → GND
ขา SCL → GPIO22 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
ขา SDA → GPIO21 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
ติดตั้งไลบรารี ssd1306:
ไลบรารี ssd1306 ไม่ได้รวมอยู่ใน MicroPython core library ต้องดาวน์โหลดและติดตั้ง:
ดาวน์โหลดไฟล์ ssd1306.py จาก micropython-ssd1306.
อัปโหลดไปยัง ESP32 ด้วยเครื่องมือเช่น Thonny:
เปิด Thonny, เลือก File > Open, เลือก ssd1306.py.
กด File > Save as, เลือก MicroPython device, บันทึกเป็น ssd1306.py.
หรือใช้ ampy: ampy --port /dev/ttyUSB0 put ssd1306.py.
หาก ESP32 เชื่อมต่อ Wi-Fi ได้ ลองติดตั้งผ่าน upip:
python
import upip
upip.install('micropython-ssd1306')
อัปโหลดโค้ด:
อัปโหลดโค้ดด้านบนไปยัง ESP32 โดยใช้ Thonny, uPyCraft หรือเครื่องมืออื่น.
ผลลัพธ์:
จอ OLED จะแสดงข้อความ "Hello, ESP32!", "MicroPython", และ "OLED SSD1306" ในตำแหน่งที่กำหนด.
หน้าจอจะอัปเดตทุก 1 วินาที.
หมายเหตุ:
ขนาดจอ: ตรวจสอบขนาดจอ OLED (128x64 หรือ 128x32) และปรับพารามิเตอร์ใน ssd1306.SSD1306_I2C(128, 64, i2c) ให้ตรงกับจอที่ใช้.
I2C Address: SSD1306 มักใช้ address 0x3C หรือ 0x3D. หากจอไม่ทำงาน ลองสแกน I2C ด้วย i2c.scan() เพื่อหาที่อยู่ที่แน่นอน และระบุในโค้ด: ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C).
การเชื่อมต่อ: ใช้ตัวต้านทาน pull-up 4.7kΩ ที่ขา SCL และ SDA หากสัญญาณไม่เสถียร.
การแสดงผลเพิ่มเติม: สามารถใช้เมธอดอื่นๆ เช่น oled.pixel(x, y, 1) เพื่อวาดจุด, oled.line() สำหรับเส้น, หรือ oled.fill_rect() สำหรับสี่เหลี่ยม (ดูเอกสารใน ssd1306.py).
การแก้ปัญหา:
หากจอไม่แสดงผล ตรวจสอบการเชื่อมต่อ, address I2C, หรือติดตั้งไลบรารีใหม่.
ใช้ MicroPython เฟิร์มแวร์ล่าสุดจาก micropython.org เพื่อความเสถียร.
from machine import Pin, PWM
import time
# กำหนดขา GPIO สำหรับลำโพง (buzzer)
BUZZER_PIN = 25 # ขา GPIO ที่เชื่อมต่อกับลำโพง
# สร้างอ็อบเจ็กต์ PWM สำหรับลำโพง
buzzer = PWM(Pin(BUZZER_PIN))
def play_tone(frequency, duration):
try:
# ตั้งค่าความถี่และ duty cycle (50% สำหรับเสียงที่ชัดเจน)
buzzer.freq(frequency)
buzzer.duty(512) # Duty cycle 50% (1023/2)
time.sleep(duration)
buzzer.duty(0) # ปิดเสียง
except Exception as e:
print('Error playing tone:', e)
# ลูปหลัก: เล่นโทนเสียงตัวอย่าง
while True:
play_tone(440, 0.5) # เล่นโทน A4 (440 Hz) เป็นเวลา 0.5 วินาที
time.sleep(0.5) # รอ 0.5 วินาที
play_tone(523, 0.5) # เล่นโทน C5 (523 Hz) เป็นเวลา 0.5 วินาที
time.sleep(0.5) # รอ 0.5 วินาที
play_tone(659, 0.5) # เล่นโทน E5 (659 Hz) เป็นเวลา 0.5 วินาที
time.sleep(1) # รอ 1 วินาทีก่อนเริ่มใหม่
วิธีใช้งาน:
การเชื่อมต่อลำโพงขนาดเล็กกับ ESP32:
สำหรับ Passive Buzzer:
ขั้วบวก (+) → GPIO25 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
ขั้วลบ (-) → GND
อาจต้องใช้ตัวต้านทาน (เช่น 100-220Ω) ระหว่าง GPIO และขั้วบวกของลำโพงเพื่อป้องกันกระแสเกิน
สำหรับ Active Buzzer:
Active buzzer บางรุ่นต้องการเพียงสัญญาณ HIGH/LOW และไม่ใช้ PWM ในกรณีนี้ให้ปรับโค้ดโดยใช้ Pin แทน PWM
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft.
ผลลัพธ์:
ลำโพงจะเล่นโทนเสียงสามโทน (A4: 440 Hz, C5: 523 Hz, E5: 659 Hz) โดยแต่ละโทนดัง 0.5 วินาที สลับกับช่วงเงียบ 0.5-1 วินาที.
หมายเหตุ:
Passive vs Active Buzzer:
Passive Buzzer: ต้องการสัญญาณ PWM เพื่อกำเนิดเสียงที่มีความถี่ต่างกัน (โค้ดด้านบนเหมาะสำหรับ passive buzzer).
Active Buzzer: มีวงจรภายในที่สร้างเสียงเมื่อจ่ายไฟ สามารถใช้ Pin แทน PWM เช่น:
buzzer = Pin(BUZZER_PIN, Pin.OUT)
buzzer.value(1) # เปิดเสียง
time.sleep(0.5)
buzzer.value(0) # ปิดเสียง
ความถี่: ค่าความถี่ (เช่น 440 Hz) สามารถปรับได้ตามต้องการ เช่น 261 Hz (C4), 587 Hz (D5) เป็นต้น.
Duty Cycle: ค่า duty(512) (50%) ให้เสียงที่สมดุล หากเสียงเบาเกินไป ลองปรับ duty cycle (เช่น 256 หรือ 768).
การป้องกัน: ใช้ตัวต้านทานเพื่อจำกัดกระแส โดยเฉพาะกับ passive buzzer เพื่อป้องกันความเสียหายต่อ GPIO.
การแก้ปัญหา:
หากไม่มีเสียง ตรวจสอบการเชื่อมต่อ, ความถูกต้องของขั้ว, หรือรุ่นของ buzzer.
ใช้ MicroPython เฟิร์มแวร์ล่าสุดจาก micropython.org.
การขยาย: หากต้องการเล่นเพลง สามารถกำหนดลำดับความถี่และระยะเวลาในลิสต์ เช่น:
melody = [(440, 0.5), (523, 0.5), (659, 0.5)]
for freq, dur in melody:
play_tone(freq, dur)
time.sleep(0.1)
หากต้องการโค้ดที่ซับซ้อนกว่านี้ (เช่น เล่นเพลงเต็มรูปแบบหรือรวมกับเซ็นเซอร์) หรือช่วยแก้ปัญหาการเชื่อมต่อ แจ้งมาได้เลย!
from machine import Pin, PWM
import time
# กำหนดขา GPIO สำหรับควบคุมมอเตอร์ (ใช้ L298N)
IN1_PIN = 26 # ขา IN1 ของ L298N
IN2_PIN = 27 # ขา IN2 ของ L298N
ENA_PIN = 25 # ขา ENA (PWM) สำหรับควบคุมความเร็ว
# สร้างอ็อบเจ็กต์สำหรับขาควบคุม
in1 = Pin(IN1_PIN, Pin.OUT)
in2 = Pin(IN2_PIN, Pin.OUT)
ena = PWM(Pin(ENA_PIN))
# ตั้งค่าความถี่ PWM
ena.freq(1000) # ความถี่ 1 kHz
def motor_forward(speed):
"""หมุนมอเตอร์ไปข้างหน้า"""
in1.value(1)
in2.value(0)
ena.duty(speed) # ความเร็ว 0-1023
def motor_backward(speed):
"""หมุนมอเตอร์ถอยหลัง"""
in1.value(0)
in2.value(1)
ena.duty(speed) # ความเร็ว 0-1023
def motor_stop():
"""หยุดมอเตอร์"""
in1.value(0)
in2.value(0)
ena.duty(0)
# ลูปหลัก: ทดสอบการทำงานของมอเตอร์
while True:
try:
print("Forward at 50% speed")
motor_forward(512) # ความเร็ว 50%
time.sleep(2)
print("Stop")
motor_stop()
time.sleep(1)
print("Backward at 75% speed")
motor_backward(768) # ความเร็ว 75%
time.sleep(2)
print("Stop")
motor_stop()
time.sleep(1)
except Exception as e:
print('Error controlling motor:', e)
motor_stop()
break
สำหรับการใช้งานมอเตอร์ DC กับ ESP32 ต้องใช้โมดูลควบคุมมอเตอร์ เช่น L298N หรือ L293D เพื่อควบคุมทิศทางและความเร็วของมอเตอร์:
วิธีใช้งาน:
การเชื่อมต่อมอเตอร์ DC กับ ESP32 ผ่าน L298N:
L298N กับ ESP32:
IN1 → GPIO26
IN2 → GPIO27
ENA → GPIO25 (ขา PWM)
VCC → 5V หรือแหล่งจ่ายไฟภายนอก (เช่น 9V battery)
GND → GND (เชื่อมต่อ GND ร่วมกันระหว่าง ESP32, L298N และแหล่งจ่ายไฟ)
มอเตอร์ DC:
ต่อมอเตอร์เข้ากับขา OUT1 และ OUT2 ของ L298N
หมายเหตุ: หากใช้แหล่งจ่ายไฟแยกสำหรับมอเตอร์ (แนะนำ) ให้ต่อ GND ร่วมกัน และถอด jumper บน L298N ที่เชื่อม 5V regulator ออก.
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft.
ผลลัพธ์:
มอเตอร์จะหมุนไปข้างหน้าด้วยความเร็ว 50% เป็นเวลา 2 วินาที
หยุด 1 วินาที
หมุนถอยหลังด้วยความเร็ว 75% เป็นเวลา 2 วินาที
หยุด 1 วินาที แล้ววนซ้ำ
หมายเหตุ:
โมดูลควบคุมมอเตอร์: โค้ดนี้ใช้ L298N ซึ่งเป็นโมดูลควบคุมมอเตอร์ทั่วไป หากใช้โมดูลอื่น เช่น L293D อาจต้องปรับขาตามสเปก.
PWM และความเร็ว: ค่า duty ใน PWM (0-1023) ควบคุมความเร็วของมอเตอร์:
0 = หยุด
512 = ความเร็ว 50%
1023 = ความเร็ว 100%
แหล่งจ่ายไฟ:
มอเตอร์ DC มักต้องการไฟมากกว่า 3.3V ของ ESP32 แนะนำให้ใช้แหล่งจ่ายไฟแยก (เช่น 9V หรือ 12V) กับ L298N.
ตรวจสอบว่า GND ของ ESP32 และแหล่งจ่ายไฟเชื่อมต่อกัน.
การแก้ปัญหา:
หากมอเตอร์ไม่หมุน ตรวจสอบการเชื่อมต่อ, แรงดันไฟ, หรือลองเปลี่ยนขา GPIO.
ใช้ MicroPython เฟิร์มแวร์ล่าสุดจาก micropython.org.
หากมอเตอร์หมุนเบาเกินไป ปรับค่า duty หรือตรวจสอบแหล่งจ่ายไฟ.
การขยาย: สามารถเพิ่มการควบคุม เช่น:
ใช้ปุ่มกดเพื่อเปลี่ยนทิศทาง
รวมกับเซ็นเซอร์ (เช่น อัลตราโซนิก) เพื่อควบคุมมอเตอร์ตามระยะทาง
ตัวอย่าง: เพิ่มปุ่มที่ GPIO 15
button = Pin(15, Pin.IN, Pin.PULL_UP)
if button.value() == 0: # กดปุ่ม
motor_forward(512)
else:
motor_stop()
หากต้องการโค้ดที่ซับซ้อนกว่านี้ (เช่น ควบคุมมอเตอร์คู่, รวมกับเซ็นเซอร์, หรือควบคุมผ่าน Wi-Fi) หรือช่วยแก้ปัญหาการเชื่อมต่อ แจ้งมาได้เลย!
from machine import Pin
import time
# กำหนดขา GPIO สำหรับเซ็นเซอร์ IR
IR_PIN = 15 # ขา OUT ของเซ็นเซอร์ IR
# สร้างอ็อบเจ็กต์สำหรับขา IR
ir_sensor = Pin(IR_PIN, Pin.IN)
def read_ir_sensor():
try:
# อ่านสถานะจากเซ็นเซอร์ IR
if ir_sensor.value() == 0: # 0 = ตรวจพบวัตถุ (ขึ้นอยู่กับเซ็นเซอร์)
print("Object Detected!")
else:
print("No Object Detected")
except Exception as e:
print('Error reading IR sensor:', e)
# ลูปหลัก
while True:
read_ir_sensor()
time.sleep(0.2) # รอ 200 มิลลิวินาทีก่อนตรวจจับครั้งถัดไป
วิธีใช้งาน:
การเชื่อมต่อเซ็นเซอร์ IR กับ ESP32:
ขา VCC → 3.3V หรือ 5V (ขึ้นอยู่กับรุ่นของเซ็นเซอร์)
ขา GND → GND
ขา OUT → GPIO15 (หรือเปลี่ยนตามที่กำหนดในโค้ด)
หมายเหตุ: เซ็นเซอร์ IR บางรุ่น เช่น TCRT5000 หรือโมดูลตรวจจับสิ่งกีดขวาง มีขา OUT ที่ให้สัญญาณดิจิทัล (HIGH/LOW). หากใช้เซ็นเซอร์แบบอนาล็อก (เช่น AOUT) ต้องปรับโค้ดให้ใช้ ADC (ดูตัวอย่างด้านล่าง).
อัปโหลดโค้ด:
อัปโหลดโค้ดไปยัง ESP32 โดยใช้เครื่องมือเช่น Thonny หรือ uPyCraft.
ผลลัพธ์:
เมื่อเซ็นเซอร์ตรวจพบวัตถุ (เช่น มือหรือสิ่งกีดขวาง) จะแสดง "Object Detected!" ใน Serial Monitor.
หากไม่พบวัตถุ จะแสดง "No Object Detected" ทุก 200 มิลลิวินาที.
วิธีใช้งาน (สำหรับอนาล็อก):
การเชื่อมต่อ:
ขา AOUT → GPIO34 (หรือขา ADC อื่นๆ เช่น GPIO32-GPIO39)
VCC → 3.3V หรือ 5V
GND → GND
การสอบเทียบ: ค่าเกณฑ์ 2000 ในโค้ดเป็นตัวอย่าง ต้องทดสอบในสภาพแวดล้อมจริง (เช่น วางวัตถุใกล้/ไกลเซ็นเซอร์เพื่อดูค่า ADC).
ผลลัพธ์: แสดงค่า ADC ดิบ (0-4095) และเปอร์เซ็นต์สะท้อนแสง รวมถึงสถานะการตรวจจับวัตถุ.
หมายเหตุ:
ประเภทเซ็นเซอร์ IR:
ดิจิทัล (OUT): ให้สัญญาณ HIGH (1) หรือ LOW (0) ขึ้นอยู่กับการตรวจจับ (ใช้โค้ดแรก).
อนาล็อก (AOUT): ให้ค่าแปรผันตามระยะหรือความเข้มของการสะท้อน (ใช้โค้ดที่สอง).
ตรวจสอบสเปกเซ็นเซอร์ (เช่น TCRT5000, KY-033, หรือโมดูล IR อื่น) เพื่อเลือกโค้ดที่เหมาะสม.
การสอบเทียบ:
สำหรับเซ็นเซอร์อนาล็อก ค่า ADC จะสูงเมื่อวัตถุอยู่ใกล้และต่ำเมื่ออยู่ไกล (ขึ้นอยู่กับเซ็นเซอร์).
ปรับเกณฑ์ (เช่น 2000) ตามการทดสอบในสภาพแวดล้อมจริง.
ขา ADC: ใช้ขา ADC1 (เช่น GPIO34) เพราะ ADC2 ไม่ทำงานเมื่อ Wi-Fi เปิด.
การแก้ปัญหา:
หากเซ็นเซอร์ไม่ทำงาน ตรวจสอบการเชื่อมต่อ, แรงดันไฟ (3.3V/5V), หรือสแกนสถานะขา.
ใช้ MicroPython เฟิร์มแวร์ล่าสุดจาก micropython.org.
หากสัญญาณรบกวน ลองเพิ่มตัวต้านทาน pull-up/pull-down หรืออ่านค่าเฉลี่ยจากหลายรอบ.
การขยาย:
สามารถรวมกับอุปกรณ์อื่น เช่น เปิด LED เมื่อตรวจพบวัตถุ:
led = Pin(13, Pin.OUT)
if ir_sensor.value() == 0:
led.value(1)
else:
led.value(0)
หรือใช้กับจอ OLED เพื่อแสดงสถานะ.
หากต้องการโค้ดที่ซับซ้อนกว่านี้ (เช่น รวมกับเซ็นเซอร์อื่น, แสดงผลบน OLED, หรือควบคุมมอเตอร์เมื่อตรวจพบวัตถุ) หรือช่วยแก้ปัญหาการเชื่อมต่อ/สอบเทียบ แจ้งมาได้เลย!
การติดตั้งไลบรารี เพิ่มเติม
ใน MicroPython การใช้งานเซ็นเซอร์ MPU6050 ไม่มีโมดูล mpu6050 ใน core library (ต่างจาก dht ที่เป็นมาตรฐาน) ดังนั้น คุณต้องดาวน์โหลดและติดตั้งไลบรารีเพิ่มเติมจากแหล่งที่น่าเชื่อถือ เช่น GitHub ไลบรารีที่แนะนำคือ micropython-mpu6050 จาก wybiral ซึ่งเป็นไลบรารีง่ายๆ สำหรับอ่านค่าความเร่ง (accelerometer) และการหมุน (gyroscope) ผ่าน I2C ต่อไปนี้คือขั้นตอนการติดตั้งและใช้งาน:
ไปที่ GitHub repository: https://github.com/wybiral/micropython-mpu6050
ดาวน์โหลดไฟล์ mpu6050.py (คลิกที่ไฟล์แล้วกด "Raw" เพื่อดาวน์โหลดไฟล์ .py)
หากต้องการไลบรารีอื่นที่ง่ายกว่า สามารถใช้จาก Lezgend/MPU6050-MicroPython ซึ่งเหมาะกับ ESP32
วิธีที่ 1: ใช้ Thonny IDE (แนะนำสำหรับมือใหม่)
เชื่อมต่อ ESP32 กับคอมพิวเตอร์ผ่าน USB
เปิด Thonny (เลือก MicroPython (ESP32) เป็น interpreter)
ไปที่ File > Open แล้วเลือกไฟล์ mpu6050.py ที่ดาวน์โหลดมา
กด File > Save as แล้วเลือก MicroPython device เพื่อบันทึกไฟล์ไปยัง ESP32 (บันทึกเป็น mpu6050.py ใน root directory)
ตรวจสอบใน REPL (Shell) โดยพิมพ์ import mpu6050 หากไม่มี error แสดงว่าติดตั้งสำเร็จ
วิธีที่ 2: ใช้ ampy (command line tool)
ติดตั้ง ampy: pip install adafruit-ampy
รันคำสั่ง: ampy --port /dev/ttyUSB0 put mpu6050.py (เปลี่ยน /dev/ttyUSB0 เป็นพอร์ตของ ESP32)
วิธีที่ 3: ผ่าน upip (หาก ESP32 เชื่อมต่อ Wi-Fi)
ไลบรารีบางตัวอาจติดตั้งได้ผ่าน PyPI แต่สำหรับ mpu6050 แนะนำดาวน์โหลดตรงเพราะไม่ใช่แพ็กเกจมาตรฐาน
ลองรัน: import upip; upip.install('micropython-mpu6050') แต่หากไม่มี ให้ใช้วิธีด้านบน
นี่คือโค้ดตัวอย่างที่ปรับให้ใช้งานง่ายกับ ESP32 (ใช้ I2C default pins: SCL=22, SDA=21) สมมติว่าคุณใช้ไลบรารีจาก wybiral:
python
from machine import Pin, I2C
import time
import mpu6050 # import ไลบรารีที่ติดตั้ง
# กำหนดขา I2C สำหรับ MPU6050
SCL_PIN = 22
SDA_PIN = 21
# สร้างอ็อบเจ็กต์ I2C
i2c = I2C(scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400000)
# สร้างอ็อบเจ็กต์ MPU6050 (address ปกติคือ 0x68)
mpu = mpu6050.MPU6050(i2c)
def read_mpu6050():
try:
# อ่านข้อมูลจากเซ็นเซอร์
accel = mpu.get_acceleration() # ค่าความเร่ง (x, y, z) ในหน่วย g
gyro = mpu.get_gyro() # ค่าการหมุน (x, y, z) ในหน่วย deg/s
temp = mpu.get_temperature() # อุณหภูมิ (°C)
print('Acceleration: x={:.2f}g, y={:.2f}g, z={:.2f}g'.format(
accel['x'], accel['y'], accel['z']))
print('Gyroscope: x={:.2f}°/s, y={:.2f}°/s, z={:.2f}°/s'.format(
gyro['x'], gyro['y'], gyro['z']))
print('Temperature: {:.2f} °C'.format(temp))
print('---')
except Exception as e:
print('Error reading MPU6050:', e)
# ลูปหลัก
while True:
read_mpu6050()
time.sleep(0.5) # รอ 500 มิลลิวินาที
การเชื่อมต่อฮาร์ดแวร์:
VCC → 3.3V
GND → GND
SCL → GPIO22
SDA → GPIO21
อาจต้องใช้ตัวต้านทาน pull-up 4.7kΩ ที่ SCL และ SDA หากสัญญาณไม่เสถียร
ดาวน์โหลด MPU6050.py จาก repo
โค้ดตัวอย่าง (ปรับจาก repo):
python
from machine import Pin, I2C
from MPU6050 import MPU6050
import time
i2c = I2C(scl=Pin(22), sda=Pin(21))
mpu = MPU6050(i2c) # สร้างอ็อบเจ็กต์
while True:
accel = mpu.get_acceleration()
gyro = mpu.get_gyro()
print('Accel: {}, Gyro: {}'.format(accel, gyro))
time.sleep(0.5)
I2C Address: MPU6050 มักใช้ address 0x68 (หาก AD0 ต่อ GND) หรือ 0x69 (หาก AD0 ต่อ VCC) หากไม่ทำงาน ลองสแกน I2C ด้วยโค้ด: i2c.scan() เพื่อหาที่อยู่
การสอบเทียบ: ไลบรารีส่วนใหญ่มี wake-up อัตโนมัติ แต่หากค่าไม่เสถียร อาจต้องเรียก mpu.wake() หรือปรับ sensitivity ใน register (ดู datasheet)
ปัญหาที่พบบ่อย:
OSError จาก I2C → ตรวจสอบการเชื่อมต่อหรือเพิ่ม pull-up resistor
หากใช้ ESP32 ตรวจสอบว่า I2C pins ถูกต้อง (default I2C0: SDA=21, SCL=22)
แหล่งข้อมูลอื่น: ลองดู Awesome MicroPython list ที่ awesome-micropython.com สำหรับไลบรารีเพิ่มเติม หรือ Reddit discussion สำหรับปัญหาเฉพาะ r/microcontrollers
หากคุณมีปัญหาในการติดตั้งหรือต้องการไฟล์ไลบรารีโดยตรง (เช่น paste code ของ mpu6050.py) บอกเพิ่มเติมได้เลย!
ใน MicroPython การใช้งานเซ็นเซอร์ BMP280 หรือ BME280 (วัดความกดอากาศ อุณหภูมิ และความชื้นสำหรับ BME280) ต้องใช้ไลบรารี bme280 ซึ่งไม่ได้รวมอยู่ใน core library ของ MicroPython ดังนั้น คุณต้องดาวน์โหลดและติดตั้งไลบรารีนี้ด้วยตัวเอง ไลบรารีที่นิยมใช้คือ micropython-bme280 จาก GitHub ซึ่งออกแบบมาให้ใช้งานง่ายกับ ESP32 และบอร์ดอื่นๆ ต่อไปนี้คือขั้นตอนการติดตั้งและใช้งาน:
แหล่งที่แนะนำ: ดาวน์โหลดไฟล์ bme280.py จาก repository catdog2/micropython-bme280.
วิธีดาวน์โหลด:
คลิกที่ไฟล์ bme280.py, กดปุ่ม "Raw" แล้วบันทึกไฟล์ (หรือคัดลอกเนื้อหา).
วิธีที่ 1: ใช้ Thonny IDE (แนะนำสำหรับมือใหม่):
เชื่อมต่อ ESP32 กับคอมพิวเตอร์ผ่าน USB.
เปิด Thonny และเลือก MicroPython (ESP32) เป็น interpreter.
ไปที่ File > Open, เลือกไฟล์ bme280.py ที่ดาวน์โหลดมา.
กด File > Save as, เลือก MicroPython device, แล้วบันทึกเป็น bme280.py ใน root directory ของ ESP32.
ทดสอบใน REPL โดยพิมพ์ import bme280 หากไม่มี error แปลว่าติดตั้งสำเร็จ.
วิธีที่ 2: ใช้ ampy (command line tool):
ติดตั้ง ampy: pip install adafruit-ampy.
รันคำสั่ง: ampy --port /dev/ttyUSB0 put bme280.py (เปลี่ยน /dev/ttyUSB0 เป็นพอร์ตที่ ESP32 ใช้).
วิธีที่ 3: ผ่าน upip (ถ้า ESP32 เชื่อมต่อ Wi-Fi):
รันโค้ดใน MicroPython REPL:
python
import upip
upip.install('micropython-bme280')
หมายเหตุ: การติดตั้งผ่าน upip อาจขึ้นอยู่กับเวอร์ชัน MicroPython และความพร้อมของแพ็กเกจใน PyPI.
3. การเชื่อมต่อฮาร์ดแวร์
VCC → 3.3V
GND → GND
SCL → GPIO22
SDA → GPIO21
อาจต้องใช้ตัวต้านทาน pull-up 4.7kΩ ที่ SCL และ SDA หากสัญญาณไม่เสถียร.
BMP280 vs BME280: ไลบรารีนี้รองรับทั้ง BMP280 (อุณหภูมิ + ความกดอากาศ) และ BME280 (เพิ่มความชื้น). โค้ดด้านบนจะตรวจสอบว่ามีค่าความชื้นหรือไม่เพื่อรองรับทั้งสองรุ่น.
I2C Address: BME280 มักใช้ address 0x76 หรือ 0x77. หากโค้ดไม่ทำงาน ลองสแกน I2C ด้วย i2c.scan() เพื่อหาที่อยู่ที่แน่นอน หรือระบุในโค้ด: bme280.BME280(i2c=i2c, address=0x76).
การแก้ปัญหา:
หากเกิด OSError อาจเกิดจากการเชื่อมต่อ I2C หลวมหรือ address ไม่ถูกต้อง.
ตรวจสอบว่าใช้ I2C pins ที่ถูกต้อง (default I2C0: SDA=21, SCL=22).
อัปเดตเฟิร์มแวร์ MicroPython เป็นเวอร์ชันล่าสุดจาก micropython.org เพื่อความเสถียร.
แหล่งข้อมูลอื่น: ดูรายการไลบรารีเพิ่มเติมได้ที่ awesome-micropython.com หรือค้นหาใน GitHub ด้วยคำว่า "micropython bme280".
หากคุณต้องการให้ผมคัดลอกเนื้อหาของไฟล์ bme280.py โดยตรง (เช่น paste โค้ดทั้งหมด) หรือช่วยแก้ปัญหาการติดตั้งเฉพาะเจาะจง แจ้งมาได้เลย!
ใน MicroPython การใช้งานจอ OLED SSD1306 (ขนาด 128x64 หรือ 128x32) ต้องใช้ไลบรารี ssd1306 ซึ่งไม่ได้รวมอยู่ใน core library ของ MicroPython ดังนั้น คุณต้องดาวน์โหลดและติดตั้งไลบรารีนี้ด้วยตัวเอง ไลบรารีที่นิยมใช้คือ ssd1306.py จาก repository ของ micropython-lib ซึ่งออกแบบมาให้ใช้งานง่ายกับ ESP32 และบอร์ดอื่นๆ ผ่าน I2C หรือ SPI ต่อไปนี้คือขั้นตอนการติดตั้งและใช้งาน:
แหล่งที่แนะนำ: ดาวน์โหลดไฟล์ ssd1306.py จาก micropython-lib.
วิธีดาวน์โหลด:
ไปที่ https://github.com/micropython/micropython-lib/blob/master/python-ecosys/ssd1306/ssd1306.py.
คลิกปุ่ม "Raw" แล้วบันทึกไฟล์ ssd1306.py (หรือคัดลอกเนื้อหาไปยังไฟล์ใหม่).
วิธีที่ 1: ใช้ Thonny IDE (แนะนำสำหรับมือใหม่):
เชื่อมต่อ ESP32 กับคอมพิวเตอร์ผ่าน USB.
เปิด Thonny และเลือก MicroPython (ESP32) เป็น interpreter.
ไปที่ File > Open, เลือกไฟล์ ssd1306.py ที่ดาวน์โหลดมา.
กด File > Save as, เลือก MicroPython device, แล้วบันทึกเป็น ssd1306.py ใน root directory ของ ESP32.
ทดสอบใน REPL โดยพิมพ์:
python
import ssd1306
print(dir(ssd1306))
หากแสดงรายการเช่น ['SSD1306', 'SSD1306_I2C', 'SSD1306_SPI', ...] แปลว่าติดตั้งสำเร็จ.
วิธีที่ 2: ใช้ ampy (command line tool):
ติดตั้ง ampy: pip install adafruit-ampy.
รันคำสั่ง:
bash
ampy --port /dev/ttyUSB0 put ssd1306.py
(เปลี่ยน /dev/ttyUSB0 เป็นพอร์ตที่ ESP32 ใช้).
วิธีที่ 3: ผ่าน upip (ถ้า ESP32 เชื่อมต่อ Wi-Fi):
รันโค้ดใน MicroPython REPL:
python
import upip
upip.install('micropython-ssd1306')
หมายเหตุ: การติดตั้งผ่าน upip อาจไม่เสถียรในบางเวอร์ชัน MicroPython เนื่องจากแพ็กเกจอาจไม่อัปเดต หากไม่ได้ผล แนะนำให้ใช้วิธี manual upload ด้านบน.
VCC → 3.3V
GND → GND
SCL → GPIO22
SDA → GPIO21
อาจต้องใช้ตัวต้านทาน pull-up 4.7kΩ ที่ SCL และ SDA หากสัญญาณไม่เสถียร.
ขนาดจอ: ตรวจสอบขนาดจอ OLED (128x64 หรือ 128x32) และปรับในโค้ด (ssd1306.SSD1306_I2C(128, 64, i2c)). หากใช้ขนาดผิด จออาจไม่แสดงผล.
I2C Address: SSD1306 มักใช้ address 0x3C หรือ 0x3D. หากจอไม่ทำงาน ลองสแกน I2C address:
python
from machine import I2C, Pin
i2c = I2C(scl=Pin(22), sda=Pin(21))
print(i2c.scan())
แล้วระบุ address ในโค้ด: ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C).
การแก้ปัญหา:
หากจอไม่แสดงผล ตรวจสอบการเชื่อมต่อ, address I2C, หรือติดตั้งไลบรารีใหม่.
ใช้ MicroPython เฟิร์มแวร์ล่าสุดจาก micropython.org เพื่อความเสถียร.
หากใช้ SPI แทน I2C ต้องปรับโค้ดและการเชื่อมต่อ (ใช้ ssd1306.SSD1306_SPI).
การใช้งานเพิ่มเติม: ไลบรารี ssd1306 รองรับการวาดกราฟิก เช่น:
oled.pixel(x, y, 1): วาดจุด.
oled.line(x1, y1, x2, y2, 1): วาดเส้น.
oled.fill_rect(x, y, w, h, 1): วาดสี่เหลี่ยม. ดูรายละเอียดในไฟล์ ssd1306.py หรือเอกสารใน repository.
แหล่งข้อมูลอื่น: ดูรายการไลบรารีเพิ่มเติมที่ awesome-micropython.com หรือค้นหาใน GitHub ด้วยคำว่า "micropython ssd1306".
หากคุณต้องการให้ผมคัดลอกเนื้อหาของไฟล์ ssd1306.py โดยตรง (เช่น paste โค้ดทั้งหมด) หรือช่วยแก้ปัญหาการติดตั้ง/ใช้งานเฉพาะเจาะจง เช่น การรวมกับเซ็นเซอร์อื่น (เช่น BME280, MPU6050) หรือการวาดกราฟิก แจ้งมาได้เลย!