`查看红外板子和光敏电阻板子的电路,发现光敏电阻的电路被设计成了数字端口,三局管只能控制通断。
同理,人体红外也是数字端口。
原理图如下:
人体红外连接的是GPIO7,光敏电阻连接的是GPIO9.
我设计的程序是:
光敏电阻的优先级最高,遮住光敏电阻的话,没有充足的光线,RGB LED亮蓝光,如果没有遮住光敏电阻,人体红外检测到了人体,三色RGB LED都会亮。否则灭掉。
- /*this is my first application*/
- /*2020/11/08*/
- #include <stdio.h>
- #include "ohos_init.h"
- #include "ohos_types.h"
- #include <stdio.h>
- #include <unistd.h>
- #include "ohos_init.h"
- #include "cmsis_os2.h"
- #include "wifiiot_gpio.h"
- #include "wifiiot_gpio_ex.h"
- #include "wifiiot_adc.h"
- #include <hi_types_base.h>
- #include <hi_i2c.h>
- #include <hi_early_debug.h>
- #include <hi_stdlib.h>
- #include <hi_adc.h>
- #define LED_INTERVAL_TIME_US 500000 /*500ms*/
- #define LED_TASK_STACK_SIZE 512
- #define LED_TASK_PRIO 25
- #define KEY_INTERVAL_TIME_US 10000 /*10ms*/
- #define KEY_TASK_STACK_SIZE 1024
- #define KEY_TASK_PRIO 24
- #define RGB_INTERVAL_TIME_US 10000 /*10ms*/
- #define RGB_TASK_STACK_SIZE 1024
- #define RGB_TASK_PRIO 23
- //static void *LedTask(const char *arg);
- static void *KeyTask(const char *arg);
- static void *RGBTask(const char *arg);
- /*LED Control*/
- // enum LedState {
- // LED_ON = 0,
- // LED_OFF,
- // LED_SPARK,
- // };
- uint8_t RGB_ctrl = 0;
- // static void *LedTask(const char *arg)
- // {
- // (void)arg;
- // enum LedState g_ledState = LED_SPARK;
- // g_ledState = LED_SPARK;
-
- // while (1) {
- // switch (g_ledState) {
- // case LED_ON:
- // GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
- // usleep(LED_INTERVAL_TIME_US);
- // break;
- // case LED_OFF:
- // GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
- // usleep(LED_INTERVAL_TIME_US);
- // break;
- // case LED_SPARK:
- // GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
- // usleep(LED_INTERVAL_TIME_US);
- // GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
- // usleep(LED_INTERVAL_TIME_US);
- // break;
- // default:
- // usleep(LED_INTERVAL_TIME_US);
- // break;
- // }
- // }
- // return NULL;
- // }
- // static void Led0Entry(void)
- // {
- // osThreadAttr_t attr;
- // GpioInit();
- // IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
- // GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
- // attr.name = "LedTask";
- // attr.attr_bits = 0U;
- // attr.cb_mem = NULL;
- // attr.cb_size = 0U;
- // attr.stack_mem = NULL;
- // attr.stack_size = LED_TASK_STACK_SIZE;
- // attr.priority = LED_TASK_PRIO;
- // if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
- // printf("[Led0Task] Falied to create LedTask!
- ");
- // }
- // }
- // SYS_RUN(Led0Entry);
- /*OLED board KEY Control - vased on ADC input*/
- static void *KeyTask(const char *arg)
- {
- (void)arg;
- WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
- WifiIotGpioValue Last_key_Status = WIFI_IOT_GPIO_VALUE1;
- // hi_u16 Key_adc_value = 0u;
- // hi_u32 ret = 0;
- while (1) {
- GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
- // printf("%d
- ", Key_Status);
- if((Key_Status == WIFI_IOT_GPIO_VALUE0) && (Last_key_Status != Key_Status))
- {
- RGB_ctrl ++;
- printf("Key pressed, RGB_ctrl = %d
- ", RGB_ctrl);
- }
- else
- {
- }
- // ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &Key_adc_value,
- // HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);
- // if (ret != HI_ERR_SUCCESS) {
- // printf("ADC Read Fail
- ");
- // }
- // else
- // {
- // // printf("ADC value = %d", Key_adc_value);
- // }
- // /*User 按键ADC值读出来大概为116*/
- // /*S1 按键ADC读出来大概为320*/
- // /*S2 按键ADC读出来大概为548*/
- // if(Key_adc_value <= 200)
- // {
- // printf("User key pressed
- ");
- // }
- // else if(Key_adc_value <= 400)
- // {
- // printf("User S1 pressed
- ");
- // }
- // else if(Key_adc_value <= 600)
- // {
- // printf("User S2 pressed
- ");
- // }
- // else
- // {
- // }
- Last_key_Status = Key_Status;
- usleep(KEY_INTERVAL_TIME_US);
- }
- return NULL;
- }
- static void KeyEntry(void)
- {
- osThreadAttr_t attr;
- GpioInit();
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
- // AdcRead();
- attr.name = "KeyTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = KEY_TASK_STACK_SIZE;
- attr.priority = KEY_TASK_PRIO;
- if (osThreadNew((osThreadFunc_t)KeyTask, NULL, &attr) == NULL) {
- printf("[KeyTask] Falied to create KeyTask!
- ");
- }
- }
- SYS_RUN(KeyEntry);
- static void *RGBTask(const char *arg)
- {
- (void)arg;
- WifiIotGpioValue pho_in = 0u;
- WifiIotGpioValue rel_in = 0u;
- uint32_t ret = 0u;
- while (1) {
- /*光敏电阻*/
- ret = GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_9, &pho_in);
- if (ret != HI_ERR_SUCCESS) {
- printf("Photoresistor Read Fail
- ");
- }
- else
- {
- printf("Photoresistor value = %d
- ", pho_in);
- }
- /*人体红外*/
- ret = GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_7, &rel_in);
- if (ret != HI_ERR_SUCCESS) {
- printf("Photoresistor Read Fail
- ");
- }
- else
- {
- printf("Human body infrared value = %d
- ", rel_in);
- }
- if(WIFI_IOT_GPIO_VALUE1 == pho_in)
- {
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
- }
- else if(WIFI_IOT_GPIO_VALUE1 == rel_in)
- {
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
- }
- else
- {
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
- }
- }
- return NULL;
- }
- static void RGBEntry(void)
- {
- osThreadAttr_t attr;
- GpioInit();
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_OUT);
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_GPIO_DIR_OUT);
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_IN);
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_GPIO_DIR_IN);
- attr.name = "RGBTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = RGB_TASK_STACK_SIZE;
- attr.priority = RGB_TASK_PRIO;
- if (osThreadNew((osThreadFunc_t)RGBTask, NULL, &attr) == NULL) {
- printf("[KeyTask] Falied to create KeyTask!
- ");
- }
- }
- SYS_RUN(RGBEntry);
复制代码
人体红外没有检测到人体:
人体红外检测到人体,同时光线充足
光敏电阻没有检测到足够的光线
`