skyworth74 发表于 2021-7-4 13:57

IOT台灯软件设计

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

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOT台灯基础架构</p>

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

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

<p>2、台灯功能实现和命令执行</p>

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

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

<p>}<br />
void ledGpioInit(void)<br />
{</p>

<p>&nbsp;&nbsp; &nbsp;Sys_DIO_Config(WS1258_GPIO, DIO_MODE_GPIO_OUT_0);<br />
&nbsp;&nbsp; &nbsp;Sys_DIO_Config(WS2812_EN_GPIO, DIO_MODE_GPIO_OUT_0);</p>

<p><br />
}<br />
void ledGpio(gpio_status_e on)<br />
{<br />
&nbsp;&nbsp; &nbsp;if (GPIO_HIGH==on){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Sys_GPIO_Set_High(WS1258_GPIO);<br />
&nbsp;&nbsp; &nbsp;}else{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Sys_GPIO_Set_Low(WS1258_GPIO);<br />
&nbsp;&nbsp; &nbsp;}</p>

<p><br />
}</p>

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

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

<p><br />
}</p>

<p><br />
//把RGB打包发送</p>

<p>void send_data(uint8_t r,uint8_t g,uint8_t b)<br />
{<br />
&nbsp;&nbsp; uint8_t i;<br />
&nbsp;&nbsp; &nbsp;uint32_t para =0;<br />
&nbsp;&nbsp;&nbsp; para= (r&lt;&lt;16|g&lt;&lt;8|b);<br />
&nbsp;&nbsp;&nbsp; WS2811_SendByte(para);</p>

<p>&nbsp;&nbsp; //ResetDataFlow();&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br />
}</p>

<p>//应用直接调用函数</p>

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

<p><i><i><i>&nbsp;下图是单线归零时序图,用简单的逻辑分析仪抓到的波形图</i></i></i></p>

<p>&nbsp;</p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

<p><i><i><i>&nbsp;</i></i></i></p>

skyworth74 发表于 2021-7-4 15:11

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

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

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

<p>#define CS_CHAR_LONG_RX_UUID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 0x24, 0xdc, 0x0e, 0x6e, 0x04, 0x40, \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xca, 0x9e, 0xe5, 0xa9, 0xa3, 0x00, \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xb5, 0xf3, 0x93, 0xe0 }<br />
#define CS_CHAR_LONG_TX_UUID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 0x24, 0xdc, 0x0e, 0x6e, 0x05, 0x40, \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xca, 0x9e, 0xe5, 0xa9, 0xa3, 0x00, \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xb5, 0xf3, 0x93, 0xe0 }</p>

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

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

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

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

<p><i>在freertos里面创建一个任务</i></p>

<p><i>osThreadNew(ledDriverThread, NULL, &amp;thread_led_attr);</i></p>

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

<p><i>&nbsp;&nbsp; &nbsp;for(;;)<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;osDelay(10);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(1==onsemi_fifo_HaveData(&amp;fifo_dev)){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; smartLightProtocolDataRead();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;PRINTF(&quot;%s header=%x\r\n&quot;,__func__,ble_protocol_data-&gt;header);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (HEADER_0==ble_protocol_data-&gt;header&amp;&amp;HEADER_1==ble_protocol_data-&gt;header){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; effectMode = ble_protocol_data-&gt;cmd;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;switch(effectMode)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;case NIGHT:<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;send_data(0x55,0xaa,0x55);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;PRINTF(&quot;NIGHT\r\n&quot;);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;case VOICE_CONTROL:</i></p>

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

<p><i>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;case FLASH_MODE:<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</i><br />
下图蓝牙收到数据命令,解析出来的命令模式台灯进入夜晚模式</p>

<p><i>&nbsp;</i></p>

<p><i>&nbsp;</i></p>

<p><br />
<i>&nbsp;</i></p>

<p><i>&nbsp;</i></p>

soso 发表于 2021-7-5 09:06

<p>期待楼主后续</p>
页: [1]
查看完整版本: IOT台灯软件设计