2444|2

45

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

IOT台灯软件设计 [复制链接]

  本帖最后由 skyworth74 于 2021-7-4 14:00 编辑

      IOT台灯基础架构

    要实现IOT功能、因为蓝牙不能直接连上物联网,必须通过网关进行连接进行转换,IOT蓝牙台灯架构如下:

1、蓝牙和网关通讯功能,所有控制命令和设备参数通过BLE和发送给网关网关再把IOT台灯的参数上报云端服务器、通过手机APP把数据通过网关转换后发给IOT台灯执行、还有就是没有网络的时候在家APP直接通过BLE和IOT台灯进行通讯实现台灯功能。

2、台灯功能实现和命令执行

因为网关通讯协议涉及公司机密本次大赛不把协议内容进行具体阐述,只进行APP和BLE直接通讯进行控制、和台灯功能实现。台灯采用一线归零技术进行LED的控制,本次比赛采用WS2812 进行LED驱动实现调光调色功能。WS2812可以通过一根GPIO就可以实现控制每个像素点三基色 256级亮度显示和多级级联功能。下面实现的是WS2812的时序控制共能

#define WS1258_GPIO 0
#define WS2812_EN_GPIO 1
#define _nop_() __NOP()
#define PERCENT 1
#define T0H (350+150/PERCENT) //0.35us
#define T0L (800+150/PERCENT)  //0.8us
#define T1H (700+150/PERCENT)  //0.7us
#define T1L (600+150/PERCENT)  //0.6us
#define RESTIME 2400
void delay_us(uint32_t ns)
{
    uint32_t i =0;
    while(ns){
        ns--;
        for(i=100;i>1;i--){
            _nop_();
        }
    }

}
void ledGpioInit(void)
{

    Sys_DIO_Config(WS1258_GPIO, DIO_MODE_GPIO_OUT_0);
    Sys_DIO_Config(WS2812_EN_GPIO, DIO_MODE_GPIO_OUT_0);


}
void ledGpio(gpio_status_e on)
{
    if (GPIO_HIGH==on){
        Sys_GPIO_Set_High(WS1258_GPIO);
    }else{
        Sys_GPIO_Set_Low(WS1258_GPIO);
    }


}

void onsemLedEnable(xt_ledenable_e enable)
{
    if (enable==LEDENABLE){
        Sys_GPIO_Set_High(WS2812_EN_GPIO);
    }else{
        Sys_GPIO_Set_Low(WS2812_EN_GPIO);
    }
}
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//子程序名称:ResetDateFlow(void)
//功能:复位,为下一次发送做准备,
//说明:将DI置位为0后,延时约65us
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
void ResetDataFlow(void)
{
    unsigned char i,j;
    ledGpio(GPIO_LOW);//DI=0;                   
    delay_us(RESTIME);
}

//发送3BYTE的数据给LED 控制RGB
static void WS2811_SendByte(uint32_t dat)//
{
    uint8_t i = 0;
    uint32_t temp =dat;
    for(i=0;i<24;i++)
        {
            if(temp&0x800000)         //
            {
                 //LINEZERO_GPIO_Port->BSRR = (uint32_t)LINEZERO_Pin;
                ledGpio(GPIO_HIGH);           
                _nop_();        
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                //delay_us(T1H);
                //LINEZERO_GPIO_Port->BRR = (uint32_t)LINEZERO_Pin;
                ledGpio(GPIO_LOW);    //DI=0;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                //delay_us(T1L);
            }
            else               
            {
                 //LINEZERO_GPIO_Port->BSRR = (uint32_t)LINEZERO_Pin;
                ledGpio(GPIO_HIGH);
                //delay_us(T0H);
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                //LINEZERO_GPIO_Port->BRR = (uint32_t)LINEZERO_Pin;
                ledGpio(GPIO_LOW);    //DI=0;
                //delay_us(T0L);
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
            }
            temp=(temp<<1);        
        }


}


//把RGB打包发送

void send_data(uint8_t r,uint8_t g,uint8_t b)
{
   uint8_t i;
    uint32_t para =0;
    para= (r<<16|g<<8|b);
    WS2811_SendByte(para);

   //ResetDataFlow();             
}

//应用直接调用函数

void ledDriver(RGB_T rgb[],uint8_t lens )
{    
    uint8_t i=0;
    if (rgb==NULL||lens<1){
        return;
    }
    
    ResetDataFlow();                 //发送帧复位信号
    for (i=0;i<lens;i++){//sizeof(rgb)/sizeof(rgb[0])
        send_data(rgb.r,rgb.g ,rgb.b);
    }
    ResetDataFlow();                 //发送帧复位信号
}

 下图是单线归零时序图,用简单的逻辑分析仪抓到的波形图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最新回复

期待楼主后续   详情 回复 发表于 2021-7-5 09:06
点赞 关注
 
 

回复
举报

45

帖子

2

TA的资源

一粒金砂(中级)

沙发
 
本帖最后由 skyworth74 于 2021-7-4 15:29 编辑

实现了单线归零驱动以后需要开始编写手机APP和BLE通讯的程序,onsemi提供的demo程序里面选择了

freertos_ble_peripheral_server_bond 这个例程,通过简单改造就可以实现通讯功能,选取里面

#define CS_CHAR_LONG_RX_UUID            { 0x24, 0xdc, 0x0e, 0x6e, 0x04, 0x40, \
                                          0xca, 0x9e, 0xe5, 0xa9, 0xa3, 0x00, \
                                          0xb5, 0xf3, 0x93, 0xe0 }
#define CS_CHAR_LONG_TX_UUID            { 0x24, 0xdc, 0x0e, 0x6e, 0x05, 0x40, \
                                          0xca, 0x9e, 0xe5, 0xa9, 0xa3, 0x00, \
                                          0xb5, 0xf3, 0x93, 0xe0 }


两个特征值直接就可以通过手机APP BLE调试APP进行测试,只需要在这两个特征值里面找到两个callback 函数 CUSTOMSS_RXLongCharCallback()

把接受度到的数据加入到fifo的队列里面。然后通过freetos创建一个新的task 把fifo收到的数据进行解析

uint8_t CUSTOMSS_RXLongCharCallback(uint8_t conidx, uint16_t attidx, uint16_t handle,
                                    uint8_t *to, const uint8_t *from, uint16_t length,
                                    uint16_t operation)
{
    memcpy(to, from, length);
#if RSL10_DEBUG
    PRINTF("\n\rRXLongCharCallback (%d): ", conidx, length);
    for (int i = 0; i < length; i++)
    {
        PRINTF("%02x ", app_env_cs.from_air_buffer_long);
    }
#endif  /* if RSL10_DEBUG */
    PRINTF("\r\n");

    /* Update TX long characteristic with the inverted version of
     * RX long characteristic just received */
    if(operation == GATTC_WRITE_REQ_IND)
    {  //把数据放入fifo 缓冲里面
        smartLightProtocolDataInsert((void *)app_env_cs.from_air_buffer_long, length);
    }
    return ATT_ERR_NO_ERROR;
}

在freertos里面创建一个任务

osThreadNew(ledDriverThread, NULL, &thread_led_attr);

__NO_RETURN void ledDriverThread(void *argument)
{
    EFFECT_MODE effectMode = PARTY;
    xt_protocol_data_t *ble_protocol_data=& sg_ble_protocol_data;
      /* creation of rgbQueue */
      rgbQueueHandle = osMessageQueueNew (1, sizeof(LIGHT_ATTR), &rgbQueue_attributes);
    

    for(;;)
    {
        osDelay(10);
        if(1==onsemi_fifo_HaveData(&fifo_dev)){
            smartLightProtocolDataRead();
            PRINTF("%s header[0]=%x\r\n",__func__,ble_protocol_data->header[0]);
            if (HEADER_0==ble_protocol_data->header[0]&&HEADER_1==ble_protocol_data->header[1]){
                effectMode = ble_protocol_data->cmd;
            }
        }
        switch(effectMode)
        {
        case NIGHT:
            send_data(0x55,0xaa,0x55);
            PRINTF("NIGHT\r\n");
            break;
        case VOICE_CONTROL:

         //在这里实现把咪头采集到的声音进行傅里叶变化,计算出频率和震幅然后通过数据归一化处理实现等效控制

            break;
        case FLASH_MODE:
            break;
        }
        
    }
}

下图蓝牙收到数据命令,解析出来的命令模式台灯进入夜晚模式

 

 


 

 

 
 
 

回复

2万

帖子

71

TA的资源

管理员

板凳
 

期待楼主后续

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表