esp32 基于micropython开发经历
ADC、DAC应用
OLED显示图片
WIFI联网(STA, AP模式)
tcp客户端的实现
…
ADC、DAC应用
导入machine模块中的Pin,ADC,DAC模
from machine import ADC,Pin,DAC
初始化引脚 ADC引脚设置为输入模式,DAC引脚设置为输出模式
adc = ADC(Pin(2, Pin.IN, Pin.PULL_DOWN), atten = ADC.ATTN_11DB)
# atten(衰减)取值
#ADC.ATTN_0DB:无衰减(100mV - 950mV)
#ADC.ATTN_2_5DB: 2.5dB 衰减 (100mV - 1250mV)
#ADC.ATTN_6DB: 6dB 衰减 (150mV - 1750mV
#ADC.ATTN_11DB: 11dB 衰减 (150mV - 2450mV)
dac = DAC(Pin(25, Pin.OUT ))
"""
esp32 ADC引脚:
ADC模块1:Pin32 - Pin39
ADC模块2:Pin(0, 2, 4, 12 - 15, 25 - 27)
ADC模块2被WIFI使用,因此使用WIFI时避免使用这些端口
"""
对ADC、DAC操作
""" ADC操作 """
adc.read()
#此方法根据块的分辨率返回原始 ADC 值,例如,0-4095 表示 12 位分辨率
adc.read_u16()
#返回 ADC 值,分辨率为 16 位分辨率,值为 0 ~ 65535
adc.read_uv()
"""
此方法使用 ADC 的已知特性和每个封装的 eFuse 值(在制造期间设置)返回以微伏为单位的校准输入电压(衰减前)。返回值只有毫伏分辨率(即,始终是 1000 微伏的倍数)。
校准仅在 ADC 的线性范围内有效。特别是,接地的输入将读取为高于 0 微伏的值。然而,在线性范围内,将获得比使用read_u16()常数和缩放结果更准确和一致的结果。
"""
dac.write()
#引脚电平写入 8 位 DAC 范围为 0 ~ 255 (对应 0 - 3.3v)
OLED显示图片
导入micropython图像缓存等模块
from machine import Pin,I2C
import framebuf
import ssd1306
初始化OLED
""" 使用硬件I2C 频率设置为 1000000hz"""
i2c = I2C(1, scl=Pin(22), sda=Pin(21), freq=1000000)
""" 定义OLED分辨率为128x64 """
oled_width = 128
oled_height = 64
""" 初始化SSD1306模块 """
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
初始化图像对象
img = framebuf.FrameBuffer(bytearray(list), width, height, framebuf.MONO_HLSB)
"""
bytearray()中参数应为取模软件获取到的十六进制列表
width为图片的宽度(像素)
height为图片的高度(像素)
framebuf.MONO_HLSB为framebuf模块定义的常量,本常量表示逐行式取模
"""
图片数据填入OLED缓冲区
oled.blit(img, x, y)
"""
img 为对应的图像对象
x 为图片在OLED x方向上坐标
y 为图片在OLED y方向上坐标
"""
图片显示在OLED上
""" 该函数会刷新OLED的缓存区,将缓存区数据刷新在屏幕上 """
oled.show()
资源下载
WIFI联网(STA, AP模式)
导入network模块
import network
联网操作
ssid = 'OrayBox-B9E8'
password = '1234567890'
# 定义 WIFI 名,密码变量
wlan = network.WLAN(network.STA_IF)#STA_IF -> 客户端模式 AP_IF -> 服务端模式
# 初始化WLAN对象
wlan.active(True)
# 开启wifi
if not wlan.isconnected():
print("正在连接...")
wlan.connect(ssid, password)
# 连接WIFI
while not wlan.isconnected():
pass
print("WIFI连接成功:"+str(wlan.ifconfig()))
"""
wlan.ifconfig() 输出当前设备的wifi信息,ip地址等
"""
tcp客户端的实现tcp客户端的实现
导入python套接字模块 socket
import socket
导入多线程模块
import _thread
设置 tcp 服务端 ip 地址、通信端口、接收数据大小
HOST = '10.168.1.181' #服务器ip地址
PORT = 10000 #通信端口号
BUFSIZ = 1024 #接收数据缓冲大小
ADDR = (HOST, PORT) #创建包含 ip 和端口的元组ADDR
创建客户端套接字
tcpCliSock = socket(AF_INET, SOCK_STREAM) #创建客户端套接字 tcpCliSock
多线程执行函数(接收数据)
def th_func():
print("\n(客户端)~> 开始监听")
while True:
a = tcpCliSock.recv(BUFSIZ) # 接收服务端数据
if a: # 如果接收到数据
print('\n(服务端)~> '+a.decode('utf8')) # 将接收到的数据按utf-8解码后打印在控制台
启动多线程
_thread.start_new_thread(th_func, ())
# 创建一个新进程 执行 th_func 函数,传入参数为空元组 ()
主循环(发送数据)
while True:
data = str(input('(客户端)~> ' )) # 用户端控制台输入待发送数据
if not data=='': # 判断输入值是否为空
tcpCliSock.send(data) #客户端发送消息
print("(客户端)~> 发送成功") # 控制台打印 “发送成功” 消息
关闭 tcp 客户端
tcpCliSock.close() #关闭客户端socket