提示,技巧和有用的事情

  • 1.去掉引脚输入

  • 2.制作UART - USB通过

1.引脚输入弹跳

用作来自开关或其他机械装置的输入的引脚可能在其上具有很多噪声,当首次按下或释放开关时,从低到高迅速变化。使用电容器(去抖动电路)可以消除这种噪声。它也可以通过简单的功能消除,【】确保引脚上的值稳定。

以下功能就是这样做的。它获取给定引脚的当前值,然后等待值更改。新的引脚值必须稳定连续20ms才能记录更改。如果您仍有噪音,可以调整此时间(比如说50毫秒)。

import pyb

def wait_pin_change(pin):
    # wait for pin to change value
    # it needs to be stable for a continuous 20ms
    cur_value = pin.value()
    active = 0
    while active < 20:
        if pin.value() != cur_value:
            active += 1
        else:
            active = 0
        pyb.delay(1)

使用这样的东西:

import pyb

pin_x1 = pyb.Pin('X1', pyb.Pin.IN, pyb.Pin.PULL_DOWN)
while True:
    wait_pin_change(pin_x1)
    pyb.LED(4).toggle()

2. 制作UART - USB传递

它很简单:

import pyb
import select

def pass_through(usb, uart):
    usb.setinterrupt(-1)
    while True:
        select.select([usb, uart], [], [])
        if usb.any():
            uart.write(usb.read(256))
        if uart.any():
            usb.write(uart.read(256))

pass_through(pyb.USB_VCP(), pyb.UART(1, 9600, timeout=0))

一般板控制

pyb

import pyb

pyb.repl_uart(pyb.UART(1, 9600)) # duplicate REPL on UART(1)    ;重复上UART(1)REPL
pyb.wfi() # pause CPU, waiting for interrupt            ; 暂停CPU,等待中断
pyb.freq() # get CPU and bus frequencies            ; 获取CPU和总线频率
pyb.freq(60000000) # set CPU freq to 60MHz          ; 设置CPU频率为60MHz
pyb.stop() # stop CPU, waiting for external interrupt       ; 停止CPU,等待外部中断

延迟和计时

使用time模块:

import time

time.sleep(1)           # sleep for 1 second            ; 睡眠1秒
time.sleep_ms(500)      # sleep for 500 milliseconds        ; sleep 500毫秒
time.sleep_us(10)       # sleep for 10 microseconds     ; sleep 10微秒
start = time.ticks_ms() # get value of millisecond counter  ; 获取毫秒计数器
delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference   ;计算时间差

内部 LED

请参阅 pyb.LED

from pyb import LED

led = LED(1) # 1=red, 2=green, 3=yellow, 4=blue ; 1 =红色,2 =绿色,3 =黄色,4 =蓝色
led.toggle()
led.on()
led.off()

# LEDs 3 and 4 support PWM intensity (0-255)        ; LED 3和4支持PWM强度(0-255)
LED(4).intensity()    # get intensity           ; 获得强度
LED(4).intensity(128) # set intensity to half       ; 设定强度为一半

内部开关

pyb.Switch

from pyb import Switch

sw = Switch()
sw.value() # returns True or False      ; 返回True或False
sw.callback(lambda: pyb.LED(1).toggle())

引脚和GPIO

pyb.Pin

from pyb import Pin

p_out = Pin('X1', Pin.OUT_PP)
p_out.high()
p_out.low()

p_in = Pin('X2', Pin.IN, Pin.PULL_UP)
p_in.value() # get value, 0 or 1

可用引脚来自以下范围(包括):0-19,21-23,25-27,32-39。这些对应于ESP32芯片的实际GPIO引脚编号。请注意,许多最终用户板使用自己的adhoc引脚编号(标记为例如D0,D1,...)。有关板逻辑引脚和物理芯片引脚之间的映像,请参阅电路板文文件。

笔记:

  • 引脚1和3分别是REPL UART TX和RX
  • 引脚6,7,8,11,16和17用于连接嵌入式闪存,不建议用于其他用途
  • 引脚34-39仅为输入,也没有内部上拉电阻
  • 可以将某些引脚的拉值设置Pin.PULL_HOLD为降低深度睡眠期间的功耗。

伺服控制

请参阅 pyb.Servo

from pyb import Servo

s1 = Servo(1) # servo on position 1 (X1, VIN, GND)  ; 伺服在位置1(X1,VIN,GND)
s1.angle(45) # move to 45 degrees           ; 移动到45度
s1.angle(-60, 1500) # move to -60 degrees in 1500ms ; 移动到在1500毫秒-60度
s1.speed(50) # for continuous rotation servos       ; 用于连续旋转伺服系统

外部中断

请参阅 pyb.ExtInt

from pyb import Pin, ExtInt

callback = lambda e: print("intr")
ext = ExtInt(Pin('Y1'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)

定时器

请参阅 pyb.Timer

from pyb import Timer

tim = Timer(1, freq=1000)
tim.counter() # get counter value
tim.freq(0.5) # 0.5 Hz
tim.callback(lambda t: pyb.LED(1).toggle())

RTC(实时时钟)

请参阅 pyb.RTC

from pyb import RTC

rtc = RTC()             ; 设定一个特定日期和时间
rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # set a specific date and time 
rtc.datetime() # get date and time      ; 获取日期和时间

PWM(脉冲宽度调制)

请参阅 pyb.Pinpyb.Timer

from pyb import Pin, Timer

p = Pin('X1') # X1 has TIM2, CH1
tim = Timer(2, freq=1000)
ch = tim.channel(1, Timer.PWM, pin=p)
ch.pulse_width_percent(50)

ADC(模数转换)

请参阅 pyb.Pinpyb.ADC

from pyb import Pin, ADC

adc = ADC(Pin('X19'))
adc.read() # read value, 0-4095

DAC(数模转换)

请参阅 pyb.Pinpyb.DAC

from pyb import Pin, DAC

dac = DAC(Pin('X5'))
dac.write(120) # output between 0 and 255   ; 输出0到255之间

UART(串行总线)

请参阅 pyb.UART

from pyb import UART

uart = UART(1, 9600)
uart.write('hello')
uart.read(5) # read up to 5 bytes   ; 最多读取5个字节

SPI总线

请参阅 pyb.SPI

from pyb import SPI

spi = SPI(1, SPI.MASTER, baudrate=200000, polarity=1, phase=0)
spi.send('hello')
spi.recv(5) # receive 5 bytes on the bus        ; 在总线接收5个字节
spi.send_recv('hello') # send and receive 5 bytes   ; 发送和接收5个字节

I2C总线

请参阅 pyb.I2C

from pyb import I2C

i2c = I2C(1, I2C.MASTER, baudrate=100000)
i2c.scan() # returns list of slave addresses                ; 返回从地址列表
i2c.send('hello', 0x42) # send 5 bytes to slave with address 0x42   ; 向地址为0x42
i2c.recv(5, 0x42) # receive 5 bytes from slave              ; 接收来自从属5字节
i2c.mem_read(2, 0x42, 0x10) # read 2 bytes from slave 0x42, slave memory 0x10
                        ; 从从机0x42读取2个字节,从机存储器0x10
i2c.mem_write('xy', 0x42, 0x10) # write 2 bytes to slave 0x42, slave memory 0x10
                        ; 写入2字节到从的0x42,从存储器0x10的

深度睡眠模式

以下代码可用于休眠,唤醒和检查重置原因:

import machine

# check if the device woke from a deep sleep        ; 检查设备从沉睡中醒来
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
    print('woke from a deep sleep')

# put the device to sleep for 10 seconds        ; 把装置进入休眠状态,持续10秒
machine.deepsleep(10000)

注意:

  • deepsleep()不带参数调用会使设备无限期地进入睡眠状态
  • 软件复位不会改变复位原因

SD card

See machine.SD.

from machine import SD
import os

# clock pin, cmd pin, data0 pin
sd = SD(pins=('GP10', 'GP11', 'GP15'))
# or use default ones for the expansion board
sd = SD()
os.mount(sd, '/sd')