w494143467 发表于 2021-6-25 20:05

【环境专家之智能手表】Part10:状态灯及模式切换

<p><strong>1.介绍</strong></p>

<p>NFC功能先掠过,先写一个简单的功能,状态灯和模式切换,为什么需要状态灯,是因为【RSL10-SENSE-GEVK】板不方便外接显示模块,刚好板载一个RGB灯,刚好就拿这个RGB灯作为指示状态,而且还比较低功耗。</p>

<p><strong>2.设计</strong></p>

<p>由于用的是RGB灯,不能直接展示出用户想要的信息,那么就可以通过一些闪烁的方式来表示一些状态,根据自己需要的状态,定义了如下图1的对应表格:</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">图1</p>

<p>状态不多,灯也够用,后期要添加也足够。闪烁方式对应的状态表已经好了,那么就来实现吧,首先定义了一个枚举用于表示状态。</p>

<pre>
<code class="language-cpp">typedef enum
{
        LED_NO_STATUS = 0,
        LED_SWITCH_NORMAL,
        LED_BLE_CONNECT,
        LED_BLE_DISCONNECT,
        LED_SET_SUCCESS,
        LED_WITCH_DOWNHOLE,
        LED_DOWNHOLE_NORMAL,
        LED_DOWNHOLE_ALARM,
        LED_DOWNHOLE_HELP,
}status_led_t;</code></pre>

<p>一共是九种状态,有一个是无状态,有了状态之后,需要有一个状态设置接口,如下定义:</p>

<pre>
<code class="language-cpp">void status_led_set(status_led_t now_status)
{
        runing_status = now_status;
        runing_cnt = 0;
        LED_Off(LED_RED);
        LED_Off(LED_GREEN);
        LED_Off(LED_BLUE);
}</code></pre>

<p>其中runing就是用来计数的,然后实现一个定时调用的函数就可以了,由于逻辑比较简单,下面贴出部分代码:</p>

<pre>
<code class="language-cpp">void status_led_runing(void)
{
        if(runing_status == LED_NO_STATUS)
                return;
        switch(runing_status)
        {
                case LED_SWITCH_NORMAL:
                {
                        if(runing_cnt % 2 == 0)
                                LED_On(LED_BLUE);
                        else
                                LED_Off(LED_BLUE);
                        if(runing_cnt &gt;= 3)
                                status_led_set(LED_NO_STATUS);
                        break;
                }
                case LED_BLE_CONNECT:
                {
                        if(runing_cnt &lt; 5)
                                LED_On(LED_BLUE);
                        if(runing_cnt &gt;= 5)
                                status_led_set(LED_NO_STATUS);
                        break;
                }
                case LED_BLE_DISCONNECT:
                {
                        if(runing_cnt &lt; 5)
                                LED_On(LED_RED);
                        if(runing_cnt &gt;= 5)
                                status_led_set(LED_NO_STATUS);
                        break;
                }
      //.......
        }
        runing_cnt++;
}</code></pre>

<p>我是200毫秒调用一次【status_led_runing】函数,在蓝牙连接和断开回调中调用设置状态灯的函数即可,蓝牙连接函数为【GAPC_ConnectionReqInd】,蓝牙断开函数为【GAPC_DisconnectInd】,在该函数中调用即可。</p>

<p>对于状态切换,我这里采用两个按键,按键0长按3秒切换到正常模式,按键1长按3秒切换到下井模式,最终展示出来的效果如下图所示。</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">图2 蓝牙连接和断开测试</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">图3 模式切换</p>

<p>可以对照图1的表格观看GIF图片。</p>

<p><strong>3.总结</strong></p>

<p>状态灯这个设计其实不难,但是也是需要的,因为没有屏幕只能通过这个进行人机交互,对于模式切换,考虑到手表不是下井时才佩戴,日常也可以进行佩戴,所以加入了这么一个机制。</p>

dql2016 发表于 2021-6-25 21:54

<p>学习了,不错</p>

yilonglucky 发表于 2021-7-1 09:20

<p>请问手机用的是什么app?</p>

w494143467 发表于 2021-7-1 19:19

yilonglucky 发表于 2021-7-1 09:20
请问手机用的是什么app?

<p>nRF connect</p>
页: [1]
查看完整版本: 【环境专家之智能手表】Part10:状态灯及模式切换