[文章]HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】8.光敏电阻和人体红外

阅读量0
0
0
`查看红外板子和光敏电阻板子的电路,发现光敏电阻的电路被设计成了数字端口,三局管只能控制通断。
同理,人体红外也是数字端口。
原理图如下:
人体红外连接的是GPIO7,光敏电阻连接的是GPIO9.

1.png
2.png



我设计的程序是:
光敏电阻的优先级最高,遮住光敏电阻的话,没有充足的光线,RGB LED亮蓝光,如果没有遮住光敏电阻,人体红外检测到了人体,三色RGB LED都会亮。否则灭掉。

  1. /*this is my first application*/
  2. /*2020/11/08*/

  3. #include <stdio.h>
  4. #include "ohos_init.h"
  5. #include "ohos_types.h"
  6. #include <stdio.h>

  7. #include <unistd.h>

  8. #include "ohos_init.h"
  9. #include "cmsis_os2.h"
  10. #include "wifiiot_gpio.h"
  11. #include "wifiiot_gpio_ex.h"
  12. #include "wifiiot_adc.h"

  13. #include <hi_types_base.h>
  14. #include <hi_i2c.h>
  15. #include <hi_early_debug.h>
  16. #include <hi_stdlib.h>

  17. #include <hi_adc.h>



  18. #define LED_INTERVAL_TIME_US 500000    /*500ms*/
  19. #define LED_TASK_STACK_SIZE 512
  20. #define LED_TASK_PRIO 25

  21. #define KEY_INTERVAL_TIME_US 10000    /*10ms*/
  22. #define KEY_TASK_STACK_SIZE 1024
  23. #define KEY_TASK_PRIO 24

  24. #define RGB_INTERVAL_TIME_US 10000    /*10ms*/
  25. #define RGB_TASK_STACK_SIZE 1024
  26. #define RGB_TASK_PRIO 23

  27. //static void *LedTask(const char *arg);
  28. static void *KeyTask(const char *arg);
  29. static void *RGBTask(const char *arg);

  30. /*LED Control*/
  31. // enum LedState {
  32. //     LED_ON = 0,
  33. //     LED_OFF,
  34. //     LED_SPARK,
  35. // };

  36. uint8_t RGB_ctrl = 0;


  37. // static void *LedTask(const char *arg)
  38. // {
  39. //     (void)arg;
  40. //     enum LedState g_ledState = LED_SPARK;
  41. //     g_ledState = LED_SPARK;
  42.    
  43. //     while (1) {
  44. //         switch (g_ledState) {
  45. //             case LED_ON:
  46. //                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  47. //                 usleep(LED_INTERVAL_TIME_US);
  48. //                 break;
  49. //             case LED_OFF:
  50. //                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  51. //                 usleep(LED_INTERVAL_TIME_US);
  52. //                 break;
  53. //             case LED_SPARK:
  54. //                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  55. //                 usleep(LED_INTERVAL_TIME_US);
  56. //                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  57. //                 usleep(LED_INTERVAL_TIME_US);
  58. //                 break;
  59. //             default:
  60. //                 usleep(LED_INTERVAL_TIME_US);
  61. //                 break;
  62. //         }
  63. //     }

  64. //     return NULL;
  65. // }

  66. // static void Led0Entry(void)
  67. // {
  68. //     osThreadAttr_t attr;

  69. //     GpioInit();
  70. //     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
  71. //     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);

  72. //     attr.name = "LedTask";
  73. //     attr.attr_bits = 0U;
  74. //     attr.cb_mem = NULL;
  75. //     attr.cb_size = 0U;
  76. //     attr.stack_mem = NULL;
  77. //     attr.stack_size = LED_TASK_STACK_SIZE;
  78. //     attr.priority = LED_TASK_PRIO;

  79. //     if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
  80. //         printf("[Led0Task] Falied to create LedTask!
  81. ");
  82. //     }
  83. // }
  84. // SYS_RUN(Led0Entry);

  85. /*OLED board KEY Control - vased on ADC input*/
  86. static void *KeyTask(const char *arg)
  87. {
  88.     (void)arg;

  89.     WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
  90.     WifiIotGpioValue Last_key_Status = WIFI_IOT_GPIO_VALUE1;
  91.     // hi_u16 Key_adc_value = 0u;
  92.     // hi_u32 ret = 0;

  93.     while (1) {
  94.         GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
  95. //        printf("%d
  96. ", Key_Status);

  97.         if((Key_Status == WIFI_IOT_GPIO_VALUE0) && (Last_key_Status != Key_Status))
  98.         {
  99.             RGB_ctrl ++;
  100.             printf("Key pressed, RGB_ctrl = %d
  101. ", RGB_ctrl);
  102.         }
  103.         else
  104.         {

  105.         }

  106. //         ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &Key_adc_value,
  107. //                     HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);
  108. //         if (ret != HI_ERR_SUCCESS) {
  109. //             printf("ADC Read Fail
  110. ");
  111. //         }
  112. //         else
  113. //         {
  114. // //            printf("ADC value = %d", Key_adc_value);
  115. //         }
  116. //         /*User 按键ADC值读出来大概为116*/
  117. //         /*S1 按键ADC读出来大概为320*/
  118. //         /*S2 按键ADC读出来大概为548*/
  119. //         if(Key_adc_value <= 200)
  120. //         {
  121. //             printf("User key pressed
  122. ");
  123. //         }
  124. //         else if(Key_adc_value <= 400)
  125. //         {
  126. //             printf("User S1 pressed
  127. ");
  128. //         }   
  129. //         else if(Key_adc_value <= 600)
  130. //         {
  131. //             printf("User S2 pressed
  132. ");
  133. //         }
  134. //         else
  135. //         {

  136. //         }

  137.         Last_key_Status = Key_Status;
  138.         usleep(KEY_INTERVAL_TIME_US);
  139.     }

  140.     return NULL;
  141. }

  142. static void KeyEntry(void)
  143. {
  144.     osThreadAttr_t attr;

  145.     GpioInit();
  146.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
  147.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
  148. //    AdcRead();

  149.     attr.name = "KeyTask";
  150.     attr.attr_bits = 0U;
  151.     attr.cb_mem = NULL;
  152.     attr.cb_size = 0U;
  153.     attr.stack_mem = NULL;
  154.     attr.stack_size = KEY_TASK_STACK_SIZE;
  155.     attr.priority = KEY_TASK_PRIO;

  156.     if (osThreadNew((osThreadFunc_t)KeyTask, NULL, &attr) == NULL) {
  157.         printf("[KeyTask] Falied to create KeyTask!
  158. ");
  159.     }
  160. }
  161. SYS_RUN(KeyEntry);


  162. static void *RGBTask(const char *arg)
  163. {
  164.     (void)arg;

  165.     WifiIotGpioValue pho_in = 0u;
  166.     WifiIotGpioValue rel_in = 0u;
  167.     uint32_t ret = 0u;

  168.     while (1) {
  169.         /*光敏电阻*/
  170.         ret = GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_9, &pho_in);
  171.         if (ret != HI_ERR_SUCCESS) {
  172.             printf("Photoresistor Read Fail
  173. ");
  174.         }
  175.         else
  176.         {
  177.             printf("Photoresistor value = %d
  178. ", pho_in);
  179.         }
  180.         /*人体红外*/
  181.         ret = GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_7, &rel_in);
  182.         if (ret != HI_ERR_SUCCESS) {
  183.             printf("Photoresistor Read Fail
  184. ");         
  185.         }
  186.         else
  187.         {
  188.             printf("Human body infrared value = %d
  189. ", rel_in);
  190.         }

  191.         if(WIFI_IOT_GPIO_VALUE1 == pho_in)
  192.         {
  193.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
  194.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  195.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
  196.         }
  197.         else if(WIFI_IOT_GPIO_VALUE1 == rel_in)
  198.         {
  199.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
  200.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
  201.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
  202.         }
  203.         else
  204.         {
  205.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
  206.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  207.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);            
  208.         }
  209.     }

  210.     return NULL;
  211. }

  212. static void RGBEntry(void)
  213. {
  214.     osThreadAttr_t attr;

  215.     GpioInit();
  216.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
  217.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_OUT);

  218.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
  219.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_GPIO_DIR_OUT);

  220.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
  221.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);

  222.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
  223.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);

  224.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
  225.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_IN);

  226.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO);
  227.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_GPIO_DIR_IN);


  228.     attr.name = "RGBTask";
  229.     attr.attr_bits = 0U;
  230.     attr.cb_mem = NULL;
  231.     attr.cb_size = 0U;
  232.     attr.stack_mem = NULL;
  233.     attr.stack_size = RGB_TASK_STACK_SIZE;
  234.     attr.priority = RGB_TASK_PRIO;

  235.     if (osThreadNew((osThreadFunc_t)RGBTask, NULL, &attr) == NULL) {
  236.         printf("[KeyTask] Falied to create KeyTask!
  237. ");
  238.     }
  239. }
  240. SYS_RUN(RGBEntry);
复制代码


人体红外没有检测到人体:
3.png


人体红外检测到人体,同时光线充足
4.png


光敏电阻没有检测到足够的光线

`
6.png

回帖

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