STM32 Code Examples
ตัวอย่างโค้ดสาธิต CircuitPython สำหรับบอร์ดไมโครคอนโทรลเลอร์ STM32
โค้ดตัวอย่างที่ 1 PWM-based RGB LED Dimming
ตัวอย่างนี้สาธิตการสร้างสัญญาณ PWM แบบ 3 ช่องเอาต์พุต ความถี่คงที่ เช่น 500Hz โดยใช้คลาส pwmio สัญญาณ PWM นี้ จะถูกนำไปใช้ในการปรับความสว่างของ RGB LED (active-low, common anode) และได้เลือกใช้ขา A0 / PA00, A1 / PA01, A2 / PA02 ตามลำดับ สำหรับบอร์ด STM32F411CE BlackPill
เมื่อทดสอบการทำงานของโค้ด จะเห็นว่า โมดูล RGB LED จะค่อย ๆ สว่างขึ้นและดับลง เลือกสี (Red, Green, Blue) ไปตามลำดับ
import time
import board
import math
import pwmio
###########################################################
class PWMArray:
def __init__(self,pwm_objects):
self.pwm_objects = pwm_objects
def __iter__(self):
self.index = 0
return self
def __next__(self):
current = self.index
self.index = (self.index+1) % len(pwm_objects)
return pwm_objects[current]
###########################################################
led_pins = [board.A0, board.A1, board.A2]
pwm_objects = [
pwmio.PWMOut(pin=led_pin,duty_cycle=65535,frequency=500)
for led_pin in led_pins ]
# create an iterator for the list of three PWMOut objects
pwm_iter = iter(PWMArray(pwm_objects))
# create a table of (N+1) sine-wave values
N=128
sine_int = lambda i: int(65535*(1-math.sin(math.pi*i/N)))
values = [sine_int(i) for i in range(N+1)]
try:
level = 0 # 0..N
pwm = next(pwm_iter) # select the first PWM output
t = int(1000*time.monotonic()) # time in msec
while True:
now = int(1000*time.monotonic()) # time in msec
if now - t < 15:
continue
t = now # update timestamp
pwm.duty_cycle = values[level]
if level == N:
level = 0
pwm = next(pwm_iter) # select next PWM output
else:
level += 1
except KeyboardInterrupt:
pass
for pwm in pwm_objects:
pwm.deinit()
print('Done')
โค้ดตัวอย่างที่ 2: RGB LED + Push Button
ตัวอย่างนี้สาธิตการตรวจสอบการกดปุ่มจำนวน 1 ปุ่ม เมื่อมีการกดปุ่มแต่ละครั้ง จะทำให้ RGB LED เปลี่ยนสีไปตามลำดับ วงจรปุ่มกดภายนอกที่ได้นำมาต่อเพิ่มนั้นรับอินพุตแบบดิจิทัลที่ขา B8 / PB08 และขาเอาต์พุตสำหรับ RGB LED (active-low, common anode) คือ A0 / PA00, A1 / PA01, A2 / PA02 ตามลำดับ
คำสั่งที่ใช้สำหรับ Digital I/O มาจากไลบรารี digitalio (API)

โค้ดตัวอย่างที่ 3: PCF8574 I/O Expander (Output)
ตัวอย่างนี้สาธิตการใช้งานโมดูล PCF8574 I/O Expander ขนาด 8 บิต โดยใช้ในโหมดเอาต์พุตทั้ง 8 ขา และใช้ควบคุมสถานะลอจิกของ LED Bar (active-low, common-anode) ที่มีทั้งหมด 8 ดวง
โมดูลนี้ใช้ไอซี PCF8574 ที่เชื่อมต่อข้อมูลด้วยวิธีบัส I2C (default address 0x20) ดังนั้นเราจะใช้คำสั่งจากไลบรารี busio (API)
พฤติกรรมการทำงานของโค้ดตัวอย่างมีดังนี้ เริ่มต้นให้ LED หนึ่งดวงอยู่ในสถานะ ON (ตรงกับตำแหน่ง LSB) จากนั้นตำแหน่งของ LED ที่อยู่ในสถานะ ON จะเลื่อนไปทางซ้ายทีละตำแหน่ง เมื่อไปจนถึงซ้ายสุด (ตรงกับตำแหน่ง MSB) ให้เลื่อนกลับไปทางขวา และทำในลักษณะนี้ซ้ำไปเรื่อย ๆ
หรือเราอาจใช้คำสั่งของไลบรารี adafruit_bus_device (API) สำหรับ I2C Device จาก Adafruit Library Bundle ก็ได้ดังนี้

โค้ดตัวอย่างที่ 4: PCF8574 I/O Expander (Input)
ตัวอย่างนี้สาธิตการใช้โมดูล PCF8574 ตรวจสอบสถานะของปุ่มกดภายนอก (Push Buttons) เช่น จำนวน 3 ปุ่ม ซึ่งทำงานแบบ Active-Low และรับอินพุตที่ขา P0, P1, P2 ตามลำดับของไอซี PCF8474

Last updated
Was this helpful?