[文章]Hi3861 炫彩灯板(DCL)开发

阅读量0
0
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
  50. ",(int)rel,data);
  51.         }
  52.         else{
  53.             g_ledState = LED_OFF;
  54.         }
  55.         switch (g_ledState) {
  56.             case LED_ON:
  57.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
  58.                 usleep(LED_INTERVAL_TIME_US);
  59.                 break;
  60.             case LED_OFF:
  61.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
  62.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  63.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
  64.                 usleep(LED_INTERVAL_TIME_US);
  65.                 break;
  66.             case LED_SPARK:
  67.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
  68.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
  69.                 usleep(LED_INTERVAL_TIME_US);
  70.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  71.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
  72.                 usleep(LED_INTERVAL_TIME_US);
  73.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
  74.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
  75.                 usleep(LED_INTERVAL_TIME_US);
  76.                 break;
  77.             default:
  78.                 usleep(LED_INTERVAL_TIME_US);
  79.                 break;
  80.         }
  81.     }

  82.     return NULL;
  83. }

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

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

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

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

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

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

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

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

  113. SYS_RUN(LedExampleEntry);

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

`
WeChat_20201030205535.gif

回帖

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