[文章]

Hi3861 炫彩灯板(DCL)开发

2020-11-12 22:29:23  81
分享
0
一、前言
HarmonyOS HiSpark Wi-Fi IoT 套件开发之彩灯
二、场景描述
场景设定:楼道
三、功能描述
感应照明灯,在光线比较暗的地方,感应到人体就会打开照明灯
四、功能实现
首先,通过人体红外感应检测人体运动
然后,通过光敏电阻检测光线亮度
最后,若满足有人且天黑的条件则亮灯
五、代码实现
  1. /*
  2. * Copyright (c) 2020 Huawei Device Co., Ltd.
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. *     http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */

  15. /*
  16.   * HiSpark_WiFi_IoT_DCL_VER.A板
  17.   * GPIO_07 人体红外感应
  18.   * GPIO_09 光敏电阻
  19.   * GPIO_10 红色LED,高电平点亮
  20.   * GPIO_11 绿色LED,高电平点亮
  21.   * GPIO_12 蓝色LED,高电平点亮
  22. */
  23. #include <stdio.h>

  24. #include <unistd.h>
  25. #include "wifiiot_adc.h"
  26. #include "ohos_init.h"
  27. #include "cmsis_os2.h"
  28. #include "wifiiot_gpio.h"
  29. #include "wifiiot_gpio_ex.h"

  30. #define LED_INTERVAL_TIME_US 300000
  31. #define LED_TASK_STACK_SIZE 512
  32. #define LED_TASK_PRIO 25

  33. enum LedState {
  34.     LED_ON = 0,
  35.     LED_OFF,
  36.     LED_SPARK,
  37. };

  38. enum LedState g_ledState = LED_OFF;

  39. static void *LedTask(const char *arg)
  40. {
  41.     (void)arg;
  42.     while (1) {
  43.         WifiIotGpioValue rel=0;
  44.         GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_7, &rel);

  45.         unsigned short data = 0;
  46.         AdcRead(WIFI_IOT_ADC_CHANNEL_4, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0);

  47.         if(rel != 0 && data > 1500){//当感应到人体活动且天色较暗时,三色LED会闪烁
  48.             g_ledState = LED_SPARK;
  49.             // printf("GPIO_7=%d, GPIO_9=%d\n",(int)rel,data);
  50.         }
  51.         else{
  52.             g_ledState = LED_OFF;
  53.         }
  54.         switch (g_ledState) {
  55.             case LED_ON:
  56.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
  57.                 usleep(LED_INTERVAL_TIME_US);
  58.                 break;
  59.             case LED_OFF:
  60.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
  61.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  62.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
  63.                 usleep(LED_INTERVAL_TIME_US);
  64.                 break;
  65.             case LED_SPARK:
  66.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
  67.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
  68.                 usleep(LED_INTERVAL_TIME_US);
  69.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  70.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
  71.                 usleep(LED_INTERVAL_TIME_US);
  72.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
  73.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
  74.                 usleep(LED_INTERVAL_TIME_US);
  75.                 break;
  76.             default:
  77.                 usleep(LED_INTERVAL_TIME_US);
  78.                 break;
  79.         }
  80.     }

  81.     return NULL;
  82. }

  83. static void LedExampleEntry(void)
  84. {
  85.     osThreadAttr_t attr;

  86.     GpioInit();
  87.     //设置IO为输入状态
  88.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO);
  89.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_GPIO_DIR_IN);
  90.     IoSetPull(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_IO_PULL_UP);

  91.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
  92.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_IN);

  93.     //设置红色,绿色,蓝色 LED IO为输出状态
  94.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
  95.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);

  96.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
  97.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_GPIO_DIR_OUT);

  98.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
  99.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_OUT);

  100.     attr.name = "LedTask";
  101.     attr.attr_bits = 0U;
  102.     attr.cb_mem = NULL;
  103.     attr.cb_size = 0U;
  104.     attr.stack_mem = NULL;
  105.     attr.stack_size = LED_TASK_STACK_SIZE;
  106.     attr.priority = LED_TASK_PRIO;

  107.     if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
  108.         printf("[LedExample] Falied to create LedTask!\n");
  109.     }
  110. }

  111. SYS_RUN(LedExampleEntry);

复制代码
六、编译
Screenshot from 2020-10-24 22-39-38.png
七、烧录
Screenshot from 2020-10-24 22-41-03.png
八、运行
WeChat_20201030205535.gif
九、总结
在编程过程中需要参考API文档,了解每个函数的定义,还需要参考硬件电路图,了解每个管脚的定义。感谢社区的大佬们提供帮助

评论

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发文章