1084504793 发表于 2024-10-30 17:58

【2024 DigiKey创意大赛】养老护理作品总结和提交

<div data-v-app="" id="jtzs-container-tools"><input data-version="3.0.1" id="install_jtzs" name="install_jtzs" type="hidden" value="1" />
<div data-v-fce10d93="">
<div class="jt-el-overlay" style="z-index: 2001; display: none;">
<div aria-describedby="jt-el-id-7480-0" aria-label="Cookie快捷获取工具 - 京淘助手出品!" aria-modal="true" class="jt-el-overlay-dialog" role="dialog">&nbsp;</div>
</div>
</div>

<div data-v-5eda8677="">
<div class="jt-el-overlay" style="z-index: 2002; display: none;">
<div aria-describedby="jt-el-id-7480-1" aria-label="二维码生成工具 - 京淘助手出品!" aria-modal="true" class="jt-el-overlay-dialog" role="dialog">&nbsp;</div>
</div>
</div>

<div data-v-d9760a0b="">
<div class="jt-el-overlay" style="z-index: 2003; display: none;">
<div aria-describedby="jt-el-id-7480-2" aria-label="二维码解码工具 - 京淘助手出品!" aria-modal="true" class="jt-el-overlay-dialog" role="dialog">&nbsp;</div>
</div>
</div>

<div data-v-2474d13e="">
<div class="jt-el-overlay" style="z-index: 2004; display: none;">
<div aria-describedby="jt-el-id-7480-3" aria-label="图片文字识别OCR工具 - 京淘助手出品!" aria-modal="true" class="jt-el-overlay-dialog" role="dialog">&nbsp;</div>
</div>
</div>
</div>

<p>作品名称:养老护理</p>

<p>作者:1084504793</p>

<p><span style="font-size:20px;"><strong>一、作品功能介绍</strong></span></p>

<p>&nbsp; &nbsp; &nbsp; &nbsp;本作品在原有的按键呼救的基础上变成通过手势进行多种功能的操作,简单易用且功能强大。将只能家居系统搬进养老院中,使广大的老年人员可以体验到科技的进步和家居的只能化。同时也方便老人进行操作,即通过简单的挥手便可进行,告别语音控制识别的低准确带来的麻烦。</p>

<p><strong><span style="font-size:20px;">二、使用方式</span></strong></p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; ESP32驱动AHT20获取温湿度数据,并将温湿度数据实时显示在0.96寸OLED屏上。若温湿度数值比较大时会上报给服务器端(树莓派5运行的HomeAssistant)。通过TCS3200颜色识别器可以识别出不同的颜色,通过颜色可以进行标记,如医院的普通病人或重症人员等。通过手势可以简单的进行交互,如向左挥手可以进入灯控界面,向上挥手可以开启灯;向下挥手可以关闭。再向右挥手可以进入呼救界面,向上是发出呼救,呼救信号是通过ESP32无线的MQTT报给树莓派5,向下可以取消呼救。若不需要使用的时候可以遮挡PAJ7620模块前的识别芯片。</p>

<p><strong><span style="font-size:20px;">三、硬件连接图</span></strong></p>

<p style="text-align: center;"> &nbsp;</p>

<p><strong><span style="font-size:20px;">四、系统框图</span></strong></p>

<p style="text-align: center;"> &nbsp;</p>

<p><strong><span style="font-size:20px;">五、功能界面</span></strong></p>

<p><strong><span style="font-size:16px;">1、温湿度显示界面(默认界面)</span></strong></p>

<p>&nbsp; &nbsp; &nbsp; &nbsp;设备上电默认显示温湿度数据,显示效果如下图所示:</p>

<div style="text-align: center;"></div>

<p><strong><span style="font-size:16px;">&nbsp; 2、LED控制界面</span></strong></p>

<p>&nbsp; &nbsp; &nbsp; &nbsp;在温湿度显示界面(默认界面)下向右挥手进入LED控制界面,或者在求救界面向左挥手,效果如下图</p>

<div style="text-align: center;"></div>

<p>&nbsp; &nbsp; &nbsp;LED状态默认是关闭的,向上挥手可以开启LED,效果显示如下图所示</p>

<div style="text-align: center;"></div>

<p>&nbsp; &nbsp; &nbsp; 在此界面向下挥手可以关闭LED灯,显示效果和LED状态默认显示是一样的。</p>

<p><span style="font-size:16px;"><strong>&nbsp; 3、求救界面</strong></span></p>

<p>&nbsp; &nbsp; &nbsp; 在LED设置界面向右挥手可以进入求救界面,在温湿度显示界面向左挥手也可以进入。求救界面默认是没有发出的,效果如下</p>

<div style="text-align: center;"></div>

<p>&nbsp; &nbsp; &nbsp; 向上挥手可以发出求救,效果如下</p>

<div style="text-align: center;"></div>

<p>向下挥手可以取消求救,效果如默认界面。</p>

<p><strong><span style="font-size:20px;">六、代码解析</span></strong></p>

<p><strong><span style="font-size:16px;">1、初始化部分</span></strong></p>

<pre>
<code class="language-coffeescript">    Serial.begin(UART_BAUD_SET);               /* 串口0初始化 */
    Wire.begin(SDA_PORT, SCL_PORT, 400000);    /* 初始化IIC连接 */
    //pinMode(LED_PORT, OUTPUT);               /* 初始化LED引脚 */
    //digitalWrite(LED_PORT, LOW);               /* LED默认熄灭,即LEN引脚输出低电平 */
    //digitalWrite(LED_PORT, HIGH);
    strip.begin();
    strip.setBrightness(10);
    for (int j = 0; j &lt; 5; j++)
    {
      for (int i = 0; i &lt; strip.getLedCount(); i++)
      {
            strip.setLedColorData(i, 255, 255, 255);
            strip.show();
      }
    }
    OLED_Init();                               /* OLED模块初始化 */
    if(Gesture.init())                         /* 初始化PAJ7620 */
    {
      Serial.println("PAJ7620U2 initialization failed");
    }
    else
    {
      Serial.println("PAJ7620U2 initialization success");
    }
    Serial.println("Please input your gestures:\n");
    if (aht.begin())                           /* 初始化AHT20 */
    {
      Serial.println("Found AHT20");
    }
    else
    {
      Serial.println("Didn't find AHT20");
    }

    /* 初始化TSC3200 */
    pinMode(S0_PIN,OUTPUT); //设定引脚输入输出模式
    pinMode(S1_PIN,OUTPUT);
    pinMode(S2_PIN,OUTPUT);
    pinMode(S3_PIN,OUTPUT);
    pinMode(OUT_PIN,INPUT);//控制器采集传感器信号
   
    digitalWrite(S0_PIN,HIGH); //频率缩放20%S0-HIGH,S1-LOW   
    digitalWrite(S1_PIN,LOW);</code></pre>

<p>&nbsp; &nbsp; &nbsp;初始化部分主要初始化各个模块</p>

<p><strong><span style="font-size:16px;">2、逻辑处理</span></strong></p>

<pre>
<code class="language-coffeescript">/* 获取颜色传感器颜色值 */
    int r_RGB, g_RGB, b_RGB;
    float k_R=7.6, k_G=6.8, k_B=7.3;
    int r_H, g_H, b_H;
    int r_L, g_L, b_L;
    int data_RGB_TFT16;
   
    digitalWrite(S2_PIN, LOW);//只采集红光
    digitalWrite(S3_PIN, LOW);
    r_L = pulseIn(OUT_PIN, LOW);
    r_H = pulseIn(OUT_PIN, HIGH);
    r_RGB=calcRGB(r_L,r_H,k_R);
    Serial.print("r_RGB = ");
    Serial.print(r_RGB);
    Serial.print(" ");
    delay(200);
   
    digitalWrite(S2_PIN, HIGH);//只采集绿光
    digitalWrite(S3_PIN, HIGH);
    g_L = pulseIn(OUT_PIN, LOW);
    g_H = pulseIn(OUT_PIN, HIGH);
    g_RGB=calcRGB(g_L,g_H,k_G);
    Serial.print("g_RGB = ");
    Serial.print(g_RGB);
    Serial.print(" ");
    delay(200);
   
    digitalWrite(S2_PIN, LOW);//只采集蓝光
    digitalWrite(S3_PIN, HIGH);
    b_L = pulseIn(OUT_PIN, LOW);
    b_H = pulseIn(OUT_PIN, HIGH);
    b_RGB=calcRGB(b_L,b_H,k_B);
    Serial.print("b_RGB = ");
    Serial.print(b_RGB);
    Serial.print(" ");
    Serial.println();
    delay(200);

    /* 手势数据获取 */
    paj7620_gesture_t result;
    if (Gesture.getResult(result))
    {
      switch (result)
      {
            case UP:
            delay(GES_QUIT_TIME);
            Gesture.getResult(result);
            if (result == PUSH)
            {
                Serial.println("Forward");
                delay(GES_QUIT_TIME);
            }
            else if (result == POLL)
            {
                Serial.println("Backward");
                delay(GES_QUIT_TIME);
            }
            else
            {
                Serial.println("Up");
            }
            break;
      case DOWN:
            delay(GES_QUIT_TIME);
            Gesture.getResult(result);
            if (result == PUSH)
            {
                Serial.println("Forward");
                delay(GES_QUIT_TIME);
            }
            else if (result == POLL)
            {
                Serial.println("Backward");
                delay(GES_QUIT_TIME);
            }
            else
            {
                Serial.println("Down");
            }
            break;
      case LEFT:
            delay(GES_QUIT_TIME);
            Gesture.getResult(result);
            if (result == PUSH)
            {
                Serial.println("Forward");
                delay(GES_QUIT_TIME);
            }
            else if (result == POLL)
            {
                Serial.println("Backward");
                delay(GES_QUIT_TIME);
            }
            else
            {
                Serial.println("Left");
            }
            break;
      case RIGHT:
            delay(GES_QUIT_TIME);
            Gesture.getResult(result);
            if (result == PUSH)
            {
                Serial.println("Forward");
                delay(GES_QUIT_TIME);
            } else if (result == POLL)
            {
                Serial.println("Backward");
                delay(GES_QUIT_TIME);
            } else
            {
                Serial.println("Right");
            }
            break;
      case PUSH:
            Serial.println("Forward");
            delay(GES_QUIT_TIME);
            break;
      case POLL:
            Serial.println("Backward");
            delay(GES_QUIT_TIME);
            break;
      case CLOCKWISE:
            Serial.println("Clockwise");
            break;
      case ANTI_CLOCKWISE:
            Serial.println("anti-clockwise");
            break;
      case WAVE:
            Serial.println("wave");
            break;
      default:
            break;
      }
    }

    /* 温湿度数据获取 */
    sensors_event_t humidity, temp;
    aht.getEvent(&amp;humidity, &amp;temp);// populate temp and humidity objects with fresh data
    /*Serial.print("Temperature: ");
    Serial.print(temp.temperature);
    Serial.println(" degrees C");
    Serial.print("Pressure: ");
    Serial.print(humidity.relative_humidity);
    Serial.println(" RH %");*/

    /* 手势处理 */
    switch (result)
    {
      case UP:
      if (OLEDNextSel == OLED_MENU_SEL_LED_SET)
      {
            LEDSta = 1;
      }
      else if (OLEDNextSel == OLED_MENU_SEL_CALL_HELP)
      {
            CallHelpSta = 1;
      }
      break;
    case DOWN:
      if (OLEDNextSel == OLED_MENU_SEL_LED_SET)
      {
            LEDSta = 0;
      }
      else if (OLEDNextSel == OLED_MENU_SEL_CALL_HELP)
      {
            CallHelpSta = 0;
      }
      break;
    case LEFT:
      if (OLEDNextSel == OLED_MENU_SEL_TEM)
      {
            OLEDNextSel = OLED_MENU_SEL_CALL_HELP;
      }
      else
      {
            OLEDNextSel = static_cast&lt;OLEDMenuSel&gt;((static_cast&lt;int&gt;(OLEDNextSel) - 1) % 3);
      }
      break;
    case RIGHT:
      OLEDNextSel = static_cast&lt;OLEDMenuSel&gt;((static_cast&lt;int&gt;(OLEDNextSel) + 1) % 3);
      if (OLEDNextSel == OLED_MENU_SEL_LAST)
      {
            OLEDNextSel = OLED_MENU_SEL_TEM;
      }
      break;
    default:
      break;
    }

    /* LED状态实现 */
    if (LEDSta)
    {
      for (int j = 0; j &lt; 5; j++)
      {
            for (int i = 0; i &lt; strip.getLedCount(); i++)
            {
                strip.setLedColorData(i, 255, 255, 255);
                strip.show();
            }
      }
    }
    else
    {
      for (int j = 0; j &lt; 5; j++)
      {
            for (int i = 0; i &lt; strip.getLedCount(); i++)
            {
                strip.setLedColorData(i, 0, 0, 0);
                strip.show();
            }
      }
    }

    /* OLED显示处理 */   
    if ((OLEDNextSel != OLEDPerSel) || (LEDSta != LEDStaRec) || (CallHelpStaRec != CallHelpSta) ||
             ((HumiRec &gt; ((uint32_t)humidity.relative_humidity + 1)) || (HumiRec &lt; ((uint32_t)humidity.relative_humidity - 1))
            ||(TempRec &gt; ((uint32_t)temp.temperature + 1)) || (TempRec &lt; ((uint32_t)temp.temperature - 1))))
    {
      if (OLEDNextSel != OLEDPerSel)
      {
            OLEDPerSel = OLEDNextSel;
      }
      HumiRec = humidity.relative_humidity;
      TempRec = temp.temperature;
      OLED_Clear();
      //Serial.println("next");
      switch (OLEDPerSel)
      {
            case OLED_MENU_SEL_TEM:
            {
                OLED_ShowString(6,1,"Temp:",16);
                OLED_ShowString(6,3,"Humi:",16);
                //OLED_ShowNum(43,1,30,3,16);
                OLED_ShowNum(43,1,(uint32_t)temp.temperature,3,16);
                OLED_ShowNum(43,3,(uint32_t)humidity.relative_humidity,3,16);
                break;
            }
      case OLED_MENU_SEL_LED_SET:
            {
                LEDStaRec = LEDSta;
                if (LEDSta)
                {
                  OLED_ShowString(6,2,"LED: On",16);
                }
                else
                {
                  OLED_ShowString(6,2,"LED: Off",16);
                }
                break;
            }
      case OLED_MENU_SEL_CALL_HELP:
            {
                CallHelpStaRec = CallHelpSta;
                if (CallHelpSta)
                {
                  OLED_ShowString(6,2,"Already Called",16);
                  OLED_ShowString(18,4,"for Help!",16);
                }
                else
                {
                  OLED_ShowString(6,2,"Call for Help? ",16);
                }
                break;
            }
      default:
            break;
      }
    }</code></pre>

<p>&nbsp; &nbsp; &nbsp;逻辑处理主要包括各个模块数据的获取,数据处理和OLED显示刷新等。</p>

<p><strong><span style="font-size:20px;">七、源码文件</span></strong></p>

<p>源码链接:<a href="https://download.eeworld.com.cn/detail/1084504793/634835" target="_blank">2024_DigiKey_创意大赛_养老护理</a></p>

<p style="text-align: center;"> &nbsp;</p>

<p>&nbsp; &nbsp; &nbsp;源码文件主要包含工程文件、OLED驱动代码和OLED字库。</p>

<p><strong><span style="font-size:20px;">八、效果视频</span></strong></p>

<p>d8b891c3af364f900d1402e781114c4c</p>

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

<p>&nbsp; &nbsp; &nbsp; &nbsp; 三个月如白驹过隙那样过得那么快。从刚开始不知道如何使用Arduino开发软件,不知道ESP32如何编程,树莓派如何使用等到现在对其都有了一定的了解。虽然最后作品并没有完美呈现出来,但是其中学到的知识却是无比宝贵的。感谢得捷提供的舞台,感谢得捷的支持。</p>

<p><strong><span style="font-size:20px;">十、文档</span></strong></p>

<div></div>

<p><!--importdoc--></p>

<p>&nbsp;</p>

1084504793 发表于 2024-11-21 17:41

<div></div>
页: [1]
查看完整版本: 【2024 DigiKey创意大赛】养老护理作品总结和提交