首页 > 其他分享 >合宙air780E解决适配ws2812b灯带发送错误问题

合宙air780E解决适配ws2812b灯带发送错误问题

时间:2024-08-01 17:50:51浏览次数:14  
标签:合宙 end -- 适配 light state 灯带 local port

最近使用合宙air780E通过gpio口直驱ws2812b灯带,使用luatos开发,系统自带外设库

sensor.ws2812b(pin,data,T0H,T0L,T1H,T1L) 

详细接口文档见官方文档:luatos接口外设库文档

上测试代码:

--led灯条展示

local this = {}

local gpioId = 24 --输出gpio引脚
local timeDelay = 2000 --灯光刷新间隔 闪动间隔

local cfg = {} --led灯状态
local color = { --GRB
    red = 0x00b400, --红色 故障
    blue = 0x0000b4, --蓝色 空闲
    green = 0xb40000, --绿色 充电中/充满
    orange = 0x609600, --橙色 插枪时颜色
    close = 0x000000, --关灯
    pink = 0x00b4b4, --粉红色 急停按下 闪动
}

--1-电源指示灯状态 0/100-故障 红灯 1-正常
--2-灯珠状态 0-熄灭 1-点亮
local powerState = {
    state = 100, --电源指示灯状态 0-熄灭 1-正常 绿常亮 100-故障 红闪
    light = 0, --灯珠状态  0-熄灭 1-点亮
}

local light=0 --闪动灯珠统一的状态  0-熄灭 1-点亮


--led灯光存储zbuff x=4*y=3 二维数组
local buff = zbuff.create({ 4, 3, 24 }, color.red)  --x=4,y=3

for i = 1, rxConfig.get("portCount") do
    cfg[i] = {
        state = 100, --状态 0空闲(蓝闪)、1充电中(绿闪)、3已插枪(黄闪)、4急停按下(红闪)、5充电完成(绿色常亮) 100-故障/异常/超功率(红闪)
        light = 0, --灯珠状态  0-熄灭 1-点亮
    }
end

gpio.setup(gpioId, 1)
gpio.set(gpioId, 0)
--pwm.open(1, 800*1000, 50,1)
--ws2812.create(ws2812.PWM, 12, 1)



--向led总线发送数据
local function sendData()
    sensor.ws2812b(gpioId, buff, 10, 0, 10, 300)
    --sensor.ws2812b_pwm(1,buff)
    --for i=0,11 do
    --    pwm.open(0, 800*1000,buff[i],8)
    --end

end

--延迟100毫秒显示默认红灯状态
sys.timerStart(function()
    sendData()
end, 100)

--设置某行灯珠颜色
--i 1-A枪指示灯 2-系统指示灯 3-B枪指示灯
--c 颜色
local function setColor(i, c)
    buff:drawLine(0, i - 1, 4, i - 1, c)  --绿
end

--设置指定接口灯珠的led颜色
--port 1-10接口id  100-电源指示灯
local function setPortLed(port, c)
    if port == 100 then
        setColor(2, c)
    elseif port == 1 then
        setColor(1, c)
    elseif port == 2 then
        setColor(3, c)
    end
end

--获取指定接口状态的颜色和事件 1 2接口号  100电源指示灯
--return 颜色,事件 1-常亮 2-闪动
local function getStateData(port)
    if port < 10 and cfg[port] == nil then
        return nil
    end
    --电源指示灯处理
    if port == 100 then
        local state = powerState.state
        if state == 0 then
            return color.close, 1
        elseif state == 1 then
            return color.blue, 1
        else
            return color.red, 2
        end
        --return 0, 0
    end

    local state = cfg[port].state
    if state == 0 then
        --空闲 蓝色 闪动
        return color.blue, 2
    elseif state == 1 then
        --充电中 绿色 闪动
        return color.green, 2
    elseif state == 3 then
        --插枪 橙色 闪动
        return color.orange, 2
    elseif state == 4 then
        --急停按下 粉红色 闪动
        return color.pink, 2
    elseif state == 5 then
        return color.green, 1
    else
        return color.red, 2
    end
end


--设置指定接口灯的状态
local function setState(port, state)
    if cfg[port]==nil then
        return
    end

    log.info("rx_led.lua.setState:port,state=",port,state)
    cfg[port].state = state
end

--led灯带处理事件
local function ledEvent()
    --处理电源指示灯
    local powerColor, s = getStateData(100)
    if s == 1 then
        --常亮处理
        setPortLed(100, powerColor)
        powerState.light = 1
    else
        --闪动处理
        if powerState.light == 0 then
            --当前熄灭处理
            setPortLed(100, powerColor)
            powerState.light = 1
        else
            --当前亮灯处理
            setPortLed(100, color.close)
            powerState.light = 0
        end
    end

    --处理各接口指示灯
    for k, v in pairs(cfg) do
        local c, s = getStateData(k) --获取灯的状态和颜色
        if c ~= nil then
            --local light=0
            --if k==1 then
            --    light=cfg[k].light
            --end

            if s == 1 then
                --常亮处理
                setPortLed(k, c)
                cfg[k].light = 1
            else
                --2和其他 闪动处理
                if light == 0 then
                    setPortLed(k, c)
                    cfg[k].light = 1
                    --light=1
                else
                    setPortLed(k, color.close)
                    cfg[k].light = 0
                    --light=0
                end
            end
        end
    end

    if light==0 then
        light=1
    else
        light=0
    end

    sendData()
    --sys.timerStart(ledEvent, timeDelay)
end

local function ledEventLoop()
    sys.taskInit(function()
        while true do
            ledEvent()
            sys.wait(timeDelay)
        end
    end)

end

ledEventLoop()

--其他业务事件代码省略

return this

 

正常灯带应该全部闪红色,但是经过测试,每间隔几秒就会出现几个灯错误颜色或者灭后个别亮起,当插在电脑usb上的时候,基本不会出现问题,本来以为是电源不稳定的,后来经过合宙官方技术支持提醒,问题存在在:

1.4g通讯类芯片,网络通讯优先级最高,可能在给灯带发送数据时,被更高优先级的网络底层通讯占用时间片

2.如果插usb正常,拔掉usb不正常,可以关闭uart0的debug日志尝试解决

 

我们先关闭uart0的日志尝试,问题就解决了,分享以下关闭uart0日志的方式:

 

需要登录合宙luatos构建平台,https://www.luatos.com/

登录后点击右上角的构建功能

新建构建,模块类型选择 EC618-luatos.

在功能模块选择中,找到"释放UART0供用户使用.不能从UART0读取底层日志了,只能通过USB读取日志"选项,选中

在选择其他需要的功能模块,构建后选择该底层固件进行尝试,问题就解决了

标签:合宙,end,--,适配,light,state,灯带,local,port
From: https://www.cnblogs.com/lanfengye/p/18337193

相关文章

  • 适配器模式
    适配器模式(AdapterPattern)将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作适配器继承适配对象,并实现适配目标所有的方法 国标接口(适配目标)publicinterfaceNationalStandard{voiduse()......
  • Android开发 - (适配器)Adapter类中SimpleAdapter实现类详细解析
    具体作用SimpleAdapter的主要作用是简化将数据源(如List<Map<String,Object>>)绑定到视图组件(如TextView、ImageView等)的过程。它可以根据指定的键将数据映射到指定的视图组件上,从而快速实现数据的展示参数、方法解析SimpleAdapter(Contextcontext,List<?extendsMap......
  • Android开发 - (适配器)Adapter类中BaseAdapter实现类详细解析
    具体作用BaseAdapter是Android开发中一个非常重要的Adapter(适配器)基类。它提供了创建自定义适配器的基本实现,使开发者可以根据具体需求创建适用于不同视图(如ListView、GridView)的数据适配器。以下是BaseAdapter的主要作用:提供基本接口实现BaseAdapter实现了ListAd......
  • 设计模式-适配器模式( Adapter Pattern)
    设计模式-适配器模式(AdapterPattern)  概要   记忆关键词:转换,兼容接口  定义:将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  分析:在适配器模式中,Cilent调用Adapter以获得相应功能,Adapter扩......
  • Android开发 - (适配器)Adapter类中CursorAdapter实现类详细解析
    作用将Cursor对象中的数据与AdapterView组件(如ListView、GridView等)进行绑定。以下是CursorAdapter的主要作用:1.数据源绑定数据源连接:CursorAdapter通过Cursor对象作为数据源,实现了从数据库或其他数据源(如ContentResolver查询结果)中读取数据的功能。这使得开发者能够轻松地......
  • vue3屏幕适配
    通过两个插件来实现  postcss-pxtorem和  amfe-flexible 在main.js中导入import"amfe-flexible";在vite.config.js中配置css:{postcss:{plugins:[postcssPxtoRem({rootValue:192,//根据使用的ui组件?定义根元素大小?......
  • Android开发 - (适配器)Adapter类中ArrayAdapter实现类详细解析
    作用将数组数据映射到UI组件(如ListView、Spinner等)上的角色。它是BaseAdapter的一个子类,专门用于处理简单的数据集合,如数组或列表。ArrayAdapter简化了数据到视图映射的过程,使得开发者能够以更少的代码实现数据的展示。它的主要作用为以下几点:数据绑定:它能够将一组数据......
  • 如何解决部分设备分辨率不适配
    1)如何解决部分设备分辨率不适配2)Unity中如何实现草的LOD3)使用了PlayAssetDelivery提交版本被Google报错4)如何计算弧线弹道的落地位置这是第396篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。UWA社区主页:co......
  • 设计模式:代理、装饰和适配器模式的区别
    结构对比讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,一时难以说清具体是使用的这三种里的哪一种。之所以会出现混淆的原因是,三种模式......
  • 实战:MyBatis适配多种数据库:MySQL、Oracle、PostGresql等
    概叙很多时候,一套代码要适配多种数据库,主流的三种库:MySQL、Oracle、PostGresql,刚好mybatis支持这种扩展,如下图所示,在一个“namespace”,判断唯一的标志是id+databaseId,刚好写了三个同样的方法,一个不带databaseId,两个带databaseId,此时当前库如果连接的是oracle则执行databaseId=......