import timeimport boardimport mathimport pwmio###########################################################classPWMArray:def__init__(self,pwm_objects): self.pwm_objects = pwm_objectsdef__iter__(self): self.index =0return selfdef__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 objectspwm_iter =iter(PWMArray(pwm_objects))# create a table of (N+1) sine-wave valuesN=128sine_int =lambdai: int(65535*(1-math.sin(math.pi*i/N)))values = [sine_int(i)for i inrange(N+1)]try: level =0# 0..N pwm =next(pwm_iter)# select the first PWM output t =int(1000*time.monotonic())# time in msecwhileTrue: now =int(1000*time.monotonic())# time in msecif 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 +=1exceptKeyboardInterrupt:passfor 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)
import timeimport boardimport digitaliobutton_pin = board.B8button = digitalio.DigitalInOut(button_pin)button.direction = digitalio.Direction.INPUTbutton.pull = digitalio.Pull.UPled_pins = [board.A0, board.A1, board.A2]leds = [ digitalio.DigitalInOut(pin)for pin in led_pins]for led in leds: led.direction = digitalio.Direction.OUTPUT led.drive_mode = digitalio.DriveMode.PUSH_PULL led.value =Truetry: index =0whileTrue:if button.value ==0:# button pressedwhile button.value !=1:# wait until releasedpass leds[index].value =True index = (index+1) %len(leds) leds[index].value =False time.sleep(0.05)exceptKeyboardInterrupt:passbutton.deinit()for led in leds: led.value =True led.deinit()print('Done')
พฤติกรรมการทำงานของโค้ดตัวอย่างมีดังนี้ เริ่มต้นให้ LED หนึ่งดวงอยู่ในสถานะ ON (ตรงกับตำแหน่ง LSB) จากนั้นตำแหน่งของ LED ที่อยู่ในสถานะ ON จะเลื่อนไปทางซ้ายทีละตำแหน่ง เมื่อไปจนถึงซ้ายสุด (ตรงกับตำแหน่ง MSB) ให้เลื่อนกลับไปทางขวา และทำในลักษณะนี้ซ้ำไปเรื่อย ๆ
import timeimport busiofrom board import SCL, SDAPCF8574_ADDR =0x20i2c = busio.I2C(SCL, SDA,frequency=100000)# 100kHz speed# attempt to lock the i2c buswhilenot i2c.try_lock():passaddr_found = []addr_found = i2c.scan()print("I2C found:", [hex(addr) for addr in addr_found])i2c.unlock()if PCF8574_ADDR notin addr_found:print('PCF8574 not found')shift_left =lambdax: ((x <<1) | (x >>7)) &0xffshift_right =lambdax: ((x >>1) | (x <<7)) &0xfftry: data =0x01 direction =1# shift left buf =bytearray(1)whileTrue:if i2c.try_lock(): buf[0]= data ^0xff# inverting output i2c.writeto(PCF8574_ADDR, buffer=buf,start=0,end=1) i2c.unlock()if data ==0x80:# MSB is 1. direction =0# change direction to shift-rightelif data ==0x01:# LSB is 1. direction =1# change direction to shift-leftif direction ==1: data =shift_left(data)else: data =shift_right(data) time.sleep(0.1)exceptKeyboardInterrupt:passi2c.deinit()
import timeimport busiofrom board import*from adafruit_bus_device.i2c_device import I2CDevicePCF8574_ADDR =0x20i2c = busio.I2C(SCL, SDA, frequency=100000)dev =I2CDevice(i2c, PCF8574_ADDR)shift_left =lambdax: ((x <<1) | (x >>7)) &0xffshift_right =lambdax: ((x >>1) | (x <<7)) &0xfftry: data =0x01 direction =1# shift left buf =bytearray(1)whileTrue: buf[0]= data ^0xff# inverting outputwith dev: dev.write(buf)if data ==0x80:# MSB is 1. direction =0# change direction to shift-rightelif data ==0x01:# LSB is 1. direction =1# change direction to shift-leftif direction ==1: data =shift_left(data)else: data =shift_right(data) time.sleep(0.1)exceptKeyboardInterrupt:passi2c.deinit()
import timeimport busiofrom board import*from adafruit_bus_device.i2c_device import I2CDevicePCF8574_ADDR =0x20i2c = busio.I2C(SCL, SDA, frequency=100000)dev =I2CDevice(i2c, PCF8574_ADDR)STATES = ['LOW','HIGH']try: buf =bytearray(1) t =int(1000*time.monotonic())# time in msec last_value =0xffwhileTrue:# press Ctrl+C to stop now =int(1000*time.monotonic())# time in msecif now - t <50:continue# update every 50 msec t = now buf[0]=0xff# must be 1's for input checkingwith dev: dev.readinto(buf) value = buf[0] change = value ^ last_valueif change !=0:# state change detectedif change &1!=0:# SW1 print('SW1:', STATES[value &1])if change &2!=0:# SW2print('SW2:', STATES[value>>1&1])if change &4!=0:# SW3print('SW3:', STATES[value>>2&1]) last_value = valueexceptKeyboardInterrupt:passi2c.deinit()print('Done')
เผยแพร่ภายใต้ลิขสิทธิ์
Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)