基于MicroPython的ESP8266连接外设IO(二)

目录

红外接收模块VS1838B


红外接收模块VS1838B

参考链接

参考链接2

本次使用的红外模块为VS1838B,遥控器采用NEC编码协议,下面为遥控器键码表和NEC协议波形图

下面是测试过程中的一些数据,整理如下,方便理解NEC协议及编写代码

解码重点:

每两个连续的时间差代表一个bit位,如上图,两值相加大于2000微秒则为1,否则为0

下面为参考网上程序进行的采集程序封装为vs1838.py

import machine
import utime
import micropython

micropython.alloc_emergency_exception_buf(100)

class VS1838B:
    def __init__(self, gpioNum):
        self.gpioNum = gpioNum
        #管脚初始化,并设置为上拉电阻
        gpioNum.init(machine.Pin.IN, machine.Pin.PULL_UP)

        #定义管脚出现电压变化时的回调函数,包含上升沿和下降沿
        gpioNum.irq(
            trigger=machine.Pin.IRQ_RISING | machine.Pin.IRQ_FALLING,
            handler= self.__logHandler)

        self.logList = [0 for x in range(1000)]
        self.index = 0
        self.start = 0
        #所获得的遥控器键码
        self.redCode = self.__loop()

    #管脚发生变化时的回调函数
    def __logHandler(self, source):
        '''
        由于采用的是上拉电阻,使得管脚默认为高电平状态
        '''
        thisComeInTime = utime.ticks_us()
        #用于第一次发生管脚电压变化时的记录
        if self.start ==0:
            self.start = thisComeInTime
            self.index = 0
            return
        #循环记录每次值
        self.logList[self.index] = utime.ticks_diff(thisComeInTime, self.start)
        self.start = thisComeInTime
        self.index += 1
        #如果连续不停的按下某按键会出现数量超过1000的现象,这里做下初始化处理
        if self.index >= 1000:
            self.logList = [0 for x in range(1000)]
            self.index = 0
            self.start = 0


    #从获得的所有数据中拆出 数据码 和 数据反码
    def getUsefulCode(self, timeList):
        n=0
        for i in timeList:
            firstTimeTrue = (timeList[n] >= 8000) & (timeList[n]<= 10000)
            seconTimeTrue = (timeList[n+1] >= 4000) & (timeList[n+1]<= 5000)
            if firstTimeTrue & seconTimeTrue:
                return timeList[n+34: n+65]
            n += 1

    #将数据码转换为整数数组,高电平为1,低电平为0,注意这里的顺序与实际正好相反,所有从后往前进行解码
    def getBinCode(self, usefulCode):
        n=15
        binCodeList =[]
        for i in usefulCode:
            if (usefulCode[n]+usefulCode[n-1])>2000:
                binCodeList.append(1)
            else:
                binCodeList.append(0)
            n-=2
            if n<0:
                return binCodeList

    def __loop(self):
        while True:
            utime.sleep_ms(200)
            if utime.ticks_diff(
                    utime.ticks_us(),
                    self.start) > 800000 and self.index > 0:
                thisIRcodeList = []
                n = 0
                for i in self.logList:
                    #当被赋值的数据列表中有连续6个0时,则提取这6个0之前的数据作为全部数据
                    if (self.logList[n] == 0) and (self.logList[n +
                        1] == 0) and (self.logList[n +
                        2] == 0) and (self.logList[n +
                        3] == 0) and (self.logList[n +
                        4] == 0) and (self.logList[n +
                        5] == 0):
                        #获得的所有数据
                        print(thisIRcodeList)
                        print(str(len(thisIRcodeList)))

                        #从所有数据中拆分出有效数据码,同样也可以拆分出数据反码进行校验,这里省略
                        usefulCode= self.getUsefulCode(thisIRcodeList)
                        #print(usefulCode)

                        #获取二进制整数数组
                        binCode = self.getBinCode(usefulCode)
                        #print(binCode)

                        #把二进制整数数组转为10进制
                        toInt = int("".join(map(str, binCode)),2)
                        toInt = hex(toInt)
                        #print(toInt)

                        #返回键码前,把数据进行初始化,否则下次解析时会出错
                        self.logList = [0 for x in range(1000)]
                        self.index = 0
                        self.start = 0
                        return toInt
                    else:
                        thisIRcodeList.append(i)
                        n += 1

在主函数main.py中进行调用

#红外接收,并用遥控器的1键开灯,2键关灯
from red1838 import VS1838B
gpioNum = Pin(5)
p2 = Pin(2, Pin.OUT)
while True:
    try:
        print("红外接收键码")
        getcode = VS1838B(gpioNum=gpioNum) #红外模块未收到数据时会停留在这里
        codeValue = getcode.redCode
        print(codeValue)
        if str(codeValue) == "0x45":
            p2.off() #Open led
        if str(codeValue) == "0x46":
            p2.on() #Close led
    except:
        pass

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Micropython ESP8266 串口是一种用于ESP8266芯片的串口通信协议,可以通过该协议实现ESP8266芯片与其他设备之间的数据传输。Micropython是一种基于Python语言的微型操作系统,可以在ESP8266芯片上运行,提供了丰富的库函数和API接口,方便开发者进行开发和调试。通过Micropython ESP8266 串口,开发者可以轻松地实现ESP8266芯片与其他设备之间的通信,例如与传感器、执行器、显示屏等设备进行数据交互。 ### 回答2: Micropython支持ESP8266的串口通讯,这使得ESP8266可以使用python语言进行编程。在ESP8266中,通常有两个串口可用:硬件串口和软件串口。 硬件串口是指在ESP8266芯片内部集成的串口,通常可用于连接外设,如传感器、显示器、WiFi模块等。硬件串口是高速的,通常可达到115200、230400、460800等波特率。 软件串口是指通过GPIO模拟实现的串口功能。软件串口的波特率通常较慢,最高可达到19200波特率。但软件串口的好处是可随意选择任何GPIO引脚作为串口通讯端口,从而使得它更加灵活。 在Micropython中,使用`machine`模块的`UART`类实现串口通讯。下面是一个基本的代码示例: ``` import machine uart = machine.UART(0, 115200) #创建一个UART对象,设置波特率为115200 uart.write('Hello, world!') #发送数据 data = uart.read(10) #读取10个字节的数据 print(data) #打印读取的数据 ``` 在上面的代码中,`UART`类的第一个参数`0`表示使用硬件串口,第个参数`115200`表示设置波特率为115200。`write()`方法发送数据,`read()`方法读取数据。如果要使用软件串口,可以将`UART`类的第一个参数换成对应的GPIO引脚。 使用Micropython实现ESP8266串口通讯,可以让开发者使用简洁的python语言进行开发和调试,提高开发效率。同时,由于Micropython支持的语言特性和库非常丰富,可以大大降低开发的难度。 ### 回答3: Micropython是一个小型的Python解释器,它可以在微控制器上运行。而ESP8266则是一款完整的WiFi芯片,它的处理器集成了TCP/IP协议栈和一些通用IO口,因此它可以作为物联网设备的核心控制器使用。在使用ESP8266进行开发时,串口是一种非常常见的通信方式。那么,如何在Micropython中使用ESP8266的串口呢? 首先,需要导入机器模块和UART(串口)模块: ```python from machine import UART ``` 接着,创建一个UART对象: ```python uart = UART(0, 115200) # 初始化并设置波特率为115200 ``` 其中,参数0表示使用串口0,波特率为115200。当然,也可以使用其它的串口和波特率。 接下来就可以使用串口进行通信了。例如,通过串口发送一段数据: ```python uart.write('Hello, World!\n') ``` 这行代码将会向串口发送字符串“Hello, World!”并换行。需要注意的是,Micropython的串口写操作和Python的print函数不同,不会自动添加换行符。 当然,也可以通过串口读取数据。例如,读取一个字节: ```python data = uart.read(1) # 读取1个字节 ``` 这行代码将会从串口读取一个字节数据,并将结果保存在data变量中。如果要读取更多的字节,可以增加参数。如: ```python data = uart.read(10) # 读取10个字节 ``` 当然,读取串口时也可以使用不同的阻塞模式。默认情况下,读取串口时会一直等待,直到有数据可读。如果想要在没有数据的情况下立即返回,可以使用UART的相应方法。如: ```python data = uart.read(10) # 读取10个字节 uart.readinto(buf) # 将数据读取并存储到buf中 uart.any() # 返回当前接收缓冲区中的字节数 ``` 最后,需要注意的是,Micropython的串口功能与Python中的serial库有所不同,特别是在串口读取时。有些主机操作系统上的串口接口并不支持非常灵活的非阻塞读取,因此在实际使用中需要多加注意。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值