w494143467 发表于 2021-7-4 14:52

【环境专家之智能手表】Part18:下井模式

<p><strong><span style="font-size:20px;">1.介绍</span></strong></p>

<p><span style="font-size:16px;">因为手表可以日常佩戴,所以需要有一个机制进行模式的切换,【RSL10-SENSE-GEVK】开发套件有两个按钮,所以可以利用这两个按钮进行设计,下井模式和正常佩戴模式使用的场景显而易见,下井模式则是下井时使用,正常模式则是平时佩戴时使用。</span></p>

<p><span style="font-size:20px;"><strong>2.设计介绍</strong></span></p>

<p><span style="font-size:16px;">首先介绍一下这次的设计,有两个按钮,为了防止误触,所以都采用长按的机制,下面是两个模式的切换设计:</span></p>

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

<p style="text-align: center;"><span style="font-size:16px;">图1</span></p>

<p><span style="font-size:16px;">其中下井模式还有三种状态,分别是:正常状态、报警状态和呼救状态,状态之间互相切换的框图如下图2:</span></p>

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

<p style="text-align: center;"><span style="font-size:16px;">图2</span></p>

<p><span style="font-size:16px;">三种状态是可以相互切换的,而且这三种状态也是满足正常使用的,当遇到危险时,长按某个按键,则会将自己的状态转换为呼救状态,这样矿井外人员看到设备上有人呼救,则立马对齐进行定位(通过中继器大致定位),并进行救援。</span></p>

<p><strong><span style="font-size:20px;">3.程序设计</span></strong></p>

<p><span style="font-size:16px;">其实没有太多的难点,首先定义按键,检测3秒和5秒的长按,具体实现如下:</span></p>

<pre>
<code>void PB_TransitionEvent(void *arg)
{
        static uint32_t btn0_rpessed_time, btn1_rpessed_time;
    ButtonName btn = (ButtonName)arg;

    bool button_pressed = BTN_Read(btn);

    switch (btn)
    {
    case BTN0:
            if(button_pressed == BTN_PRESSED)        //按键按下
            {
                    btn0_rpessed_time = HAL_Time();
            }
            else
            {
                    if(HAL_Time() - btn0_rpessed_time &gt; 3000)        //大于3秒钟
                    {
                            if(status_get_downhole_flag())        //不是正常模式
                            {
                                    status_led_set(LED_SWITCH_NORMAL);        //切换为正常模式
                            }
                    }
            }
      break;
    case BTN1:
            if(button_pressed == BTN_PRESSED)        //按键按下
                {
                        btn1_rpessed_time = HAL_Time();
                }
                else
                {
                        if(HAL_Time() - btn1_rpessed_time &gt; 3000)        //大于3秒钟
                        {
                                if(status_get_downhole_flag() == 0)                //不是下井模式
                                {
                                        status_led_set(LED_WITCH_DOWNHOLE);        //切换为下井模式
                                }
                        }
                        if(status_get_downhole_flag())
                        {
                                if(HAL_Time() - btn1_rpessed_time &gt; 5000)        //大于5秒钟
                                {
                                        if(status_get_downhole_status() &lt; 2)
                                                status_led_set(LED_DOWNHOLE_HELP);        //切换呼救模式
                                        else
                                                status_led_set(LED_DOWNHOLE_NORMAL);        //切换为普通模式
                                }
                        }
                }
      break;
    default:
      return;
    }
}
</code></pre>

<p><span style="font-size:16px;">然后修改广播协议,在气压值后面添加上状态标志,矿井外设备从中获取到设备是否处于下井模式,如果处于下井模式,则显示到屏幕上,如果不处于则过滤。</span></p>

<p><span style="font-size:16px;">这里有一个设计冲突,如果矿井外设备检测到有设备进入下井模式,那么屏幕上会显示出该设备,<strong>当如果这台设备关闭下井模式,屏幕是否应该继续显示该设备的状态?</strong>最终我设计成这样的,当检测到有设备进入下井模式,如果该设备退出下井模式,会继续显示在屏幕上,同时屏幕上显示该设备的处于正常模式,为什么要这样设计,主要是怕下井人员误触,如果矿井外设备查看到此标志,则需通过对讲机或其他通信设备告知佩戴该设备的人员,开启下井模式,因为正常模式进入低功耗,更新数据会比较慢,会造成延时!</span></p>

<p><span style="font-size:20px;"><strong>4.总结</strong></span></p>

<p><span style="font-size:16px;">最终下井模式就设计完毕了,矿井外设备的扫描机制需要做一些修改,同时还需要添加窗口置顶的功能,用于提示该设备处于呼救状态,而且需要设计窗口优先级,这个需要专门写一篇帖子进行分析设计。</span></p>

Jacktang 发表于 2021-7-6 07:23

<p>井人员误触是必须注意点</p>

<p>楼主设计的很细</p>

<p>&nbsp;</p>

freebsder 发表于 2021-7-6 22:20

<p>要是一直被误触发长按呢?</p>

w494143467 发表于 2021-7-7 11:53

freebsder 发表于 2021-7-6 22:20
要是一直被误触发长按呢?

<p>那就只能按另一个按键退出了。</p>

freebsder 发表于 2021-7-7 17:40

w494143467 发表于 2021-7-7 11:53
那就只能按另一个按键退出了。

<p>哈哈,好吧,故意破坏确实没啥好的办法。</p>

w494143467 发表于 2021-7-7 20:00

freebsder 发表于 2021-7-7 17:40
哈哈,好吧,故意破坏确实没啥好的办法。

<p>是啊,其实也有别的办法,不过目前不好实现。</p>

freebsder 发表于 2021-7-9 21:39

w494143467 发表于 2021-7-7 20:00
是啊,其实也有别的办法,不过目前不好实现。

<p>啥办法?科普一下</p>

w494143467 发表于 2021-7-10 08:06

freebsder 发表于 2021-7-9 21:39
啥办法?科普一下

<p>就是进入下井模式,由矿井外人员设置,通过扫描NFC标签获取设备MAC地址,然后通过矿井外设备对下井设备进行设置。</p>
页: [1]
查看完整版本: 【环境专家之智能手表】Part18:下井模式