ESP32用MicroPython的三个管脚查理复用桥流水灯

提示:仅供学习使用,请勿用作商业用途


什么是查理复用

因为在网上没找到自己想要的查理复用源码,自己琢磨了一下做出来了一个逻辑很简单但蛮好用的查理复用桥的使用办法,第一次发文章,如果有疏漏请指出。


一、什么是查理复用

查理复用是一种嵌入式算法,基于这种算法可以让IO口能点亮更多灯,通过芯片内置管脚模式置换输出高阻两种模式,让IO口改变电流流向,实现能然n个管脚点亮n*(n+1)个灯的效果。

二、原理图释义

两个管脚的查理复用原理图如下图,只要改变两个管脚输入输出模式就可以实现两个灯轮流亮灯

两个管脚实现的查理复用桥
三个管脚的查理复用原理图如下,我这里的代码也将用三个管脚来演示,在其中两个管脚实现输出0和1的时候,还需要一个管脚实现高阻模式,高祖模式相当于断路了,几乎没有电流流过。
三个管脚实现的查理复用桥

三、代码实现

1.引入库

代码如下(示例):

import machine
import time
import threading

2.变量定义和管脚初始化

代码如下(示例):

led1 = machine.Pin(32, machine.Pin.OUT)
led2 = machine.Pin(22, machine.Pin.OUT)
led3 = machine.Pin(16, machine.Pin.OUT)
KEY= machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP) #构建KEY对象 
state=0 #LED引脚状态
i=0#更换流水灯模式
delay=0#非阻塞性延时

3.定义流水模式,共三种(顺序,逆序,两两闪烁)

代码如下(示例):

#逆序流水灯
def switch3(num):
    if num==5:
        led1.value(1)
        led2.value(0)
        led3.init(mode=machine.Pin.IN, pull=None)
    elif num==4:
        led2.init(mode=machine.Pin.OUT)
        led1.value(0)
        led2.value(1)
        led3.init(mode=machine.Pin.IN, pull=None)
    elif num==3:
        led1.value(0)
        led3.value(1)
        led2.init(mode=machine.Pin.IN, pull=None)
    elif num==2:
        led1.init(mode=machine.Pin.OUT)
        led1.value(1)
        led3.value(0)
        led2.init(mode=machine.Pin.IN, pull=None)
    elif num==1:
        led2.value(1)
        led3.value(0)
        led1.init(mode=machine.Pin.IN, pull=None)
    elif num==0:
        led3.init(mode=machine.Pin.OUT)
        led2.value(0)
        led3.value(1)
        led1.init(mode=machine.Pin.IN, pull=None)
        
        
#顺序流水灯
def switch1(num):
    if num==0:
        led1.init(mode=machine.Pin.OUT)
        led1.value(1)
        led2.value(0)
        led3.init(mode=machine.Pin.IN, pull=None)
    elif num==1:
        led1.value(0)
        led2.value(1)
        led3.init(mode=machine.Pin.IN, pull=None)
    elif num==2:
        led3.init(mode=machine.Pin.OUT)
        led1.value(0)
        led3.value(1)
        led2.init(mode=machine.Pin.IN, pull=None)
    elif num==3:
        led1.value(1)
        led3.value(0)
        led2.init(mode=machine.Pin.IN, pull=None)
    elif num==4:
        led2.init(mode=machine.Pin.OUT)
        led2.value(1)
        led3.value(0)
        led1.init(mode=machine.Pin.IN, pull=None)
    elif num==5:
        led2.value(0)
        led3.value(1)
        led1.init(mode=machine.Pin.IN, pull=None)
        
        
#两个一起闪的流水灯
def switch2(num):
    if num==0:
        led1.value(1)
        led2.value(0)
        led3.value(0)
    elif num==1:
        led1.value(0)
        led2.value(1)
        led3.value(0)
    elif num==2:
        led1.value(0)
        led2.value(0)
        led3.value(1)

        

#流水灯切换模式
def switch():
        global state
        global i
        
        if state==0:
            print("switch0 i is ",str(i))
            switch1(i)
            i+=1
            i%=6
        elif state==2:
            print("switch2 i is ",str(i))
            switch2(i)
            i+=1
            i%=3
        elif state==1:
            print("switch1 i is ",str(i))
            switch3(i)
            i+=1
            i%=6

4.按键控制

while True:
    if KEY.value()==0:   #按键被按下 
        time.sleep_ms(10) #消除抖动 
        if KEY.value()==0: #确认按键被按下
            state+=1
            state%=4
            print("state is "+str(state))
            led2.init(mode=machine.Pin.OUT)
            time.sleep_ms(10)
            led1.init(mode=machine.Pin.OUT)
            time.sleep_ms(10)
            led3.init(mode=machine.Pin.OUT)
            led1.value(0)
        	led2.value(0)
        	led3.value(0)
            i=0
            time.sleep_ms(10)
            while not KEY.value(): #检测按键是否松开 
                pass
    if(delay==100):#判断非阻塞延时,时间到了就执行一次,换下一个流水模式
        switch()
        delay=0
    else:
        delay+=1
        time.sleep_ms(10)

总结

比较麻烦的地方在从switch1切换到switch2中,看起来是从一个灯亮切换成两个灯亮,但实际上也是从有高阻模式切换成全输出模式,需要在按键切换的时候对当下num模式进行判断并将管脚改回输出并置0操作。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
当然,下面是一个使用MicroPython编写的ESP32蓝牙模块程序示例: 首先,需要导入ESP32和蓝牙库: ``` import bluetooth from machine import Pin import esp32 ``` 接下来,需要初始化蓝牙并设置设备名称: ``` bluetooth.init() bluetooth.set_advertisement(name='ESP32 Bluetooth', service_uuid=b'1234567890123456') ``` 然后,需要设置GPIO口,作为蓝牙模块的连接指示: ``` led = Pin(2, Pin.OUT) ``` 接着,需要创建一个蓝牙服务器并开始监听: ``` server_sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) server_sock.bind(("", bluetooth.PORT_ANY)) server_sock.listen(1) ``` 随后,需要设置服务的UUID和通道号,并将蓝牙模块的地址输出到控制台: ``` uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee" bluetooth.advertise_service(server_sock, "ESP32_BT_Server", service_id=uuid, service_classes=[uuid, bluetooth.SERIAL_PORT_CLASS], profiles=[bluetooth.SERIAL_PORT_PROFILE]) print("Waiting for connection on RFCOMM channel") print("Bluetooth device address:", bluetooth.get_address()) ``` 最后,需要进入循环,接收蓝牙客户端的连接并进行数据通信: ``` while True: try: client_sock, client_info = server_sock.accept() print("Accepted connection from", client_info) led.value(1) while True: data = client_sock.recv(1024) if not data: break print("Received:", data.decode()) client_sock.send("Echo: " + data.decode()) client_sock.close() print("Disconnected from", client_info) led.value(0) except KeyboardInterrupt: break ``` 以上就是一个使用MicroPython编写的ESP32蓝牙模块程序示例,它可以接收蓝牙客户端发送的数据并将其回显到客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值