1 | #include <string.h>
|
2 | #include <freertos/FreeRTOS.h>
|
3 | #include <freertos/task.h>
|
4 | #include <freertos/event_groups.h>
|
5 | #include <esp_log.h>
|
6 | #include <esp_sleep.h>
|
7 |
|
8 | #include "pirSensor.h"
|
9 |
|
10 | #define PIR_SENSOR_PIN GPIO_NUM_2
|
11 |
|
12 | #define PIR_SENSOR_HIGH_BIT BIT0
|
13 | #define PIR_SENSOR_LOW_BIT BIT1
|
14 |
|
15 | static EventGroupHandle_t pirSensorEventGroup;
|
16 | static uint8_t pirSensorLevel;
|
17 |
|
18 | static void pirSensorTask(void* pvParameters);
|
19 |
|
20 | static void IRAM_ATTR pirSensorIsrHandler(void* arg)
|
21 | {
|
22 | static const char *TAG = "pirSensorIsrHandler";
|
23 | pirSensorLevel = gpio_get_level(PIR_SENSOR_PIN);
|
24 | ESP_LOGI(TAG, "Level: %d", pirSensorLevel);
|
25 | if(0 != pirSensorLevel) xEventGroupSetBits(pirSensorEventGroup, PIR_SENSOR_HIGH_BIT);
|
26 | else xEventGroupSetBits(pirSensorEventGroup, PIR_SENSOR_LOW_BIT);
|
27 | }
|
28 |
|
29 | static void pirSensorTask(void* pvParameters)
|
30 | {
|
31 | const char *TAG = "pirSensorTask";
|
32 | ESP_LOGI(TAG, "starting task");
|
33 |
|
34 | esp_err_t result;
|
35 |
|
36 | EventBits_t uxBits;
|
37 | pirSensorEventGroup = xEventGroupCreate();
|
38 |
|
39 | /* configure sensor */
|
40 | gpio_config_t sensorConfig;
|
41 | sensorConfig.intr_type = GPIO_INTR_ANYEDGE;
|
42 | sensorConfig.mode = GPIO_MODE_INPUT;
|
43 | sensorConfig.pull_up_en = GPIO_PULLUP_DISABLE;
|
44 | sensorConfig.pull_down_en = GPIO_PULLDOWN_ENABLE;
|
45 | sensorConfig.pin_bit_mask = (1 << PIR_SENSOR_PIN);
|
46 | result = gpio_config(&sensorConfig);
|
47 | if(result != ESP_OK)
|
48 | {
|
49 | ESP_LOGE(TAG, "failed gpio_config: %s", esp_err_to_name(result));
|
50 | return;
|
51 | }
|
52 | ESP_LOGI(TAG, "pirSensor configured");
|
53 |
|
54 | /* get initial sensorlevel */
|
55 | pirSensorLevel = gpio_get_level(PIR_SENSOR_PIN);
|
56 |
|
57 | /* configure interrupt and add handler */
|
58 | result = gpio_install_isr_service(0);
|
59 | if(result != ESP_OK)
|
60 | {
|
61 | ESP_LOGE(TAG, "failed gpio_install_isr_service: %s", esp_err_to_name(result));
|
62 | return;
|
63 | }
|
64 | result = gpio_isr_handler_add(PIR_SENSOR_PIN, pirSensorIsrHandler, NULL);
|
65 | if(result != ESP_OK)
|
66 | {
|
67 | ESP_LOGE(TAG, "failed gpio_isr_handler_add: %s", esp_err_to_name(result));
|
68 | return;
|
69 | }
|
70 | ESP_LOGI(TAG, "ISR handler Pir-Sensor configured");
|
71 |
|
72 | while(1)
|
73 | {
|
74 | uxBits = xEventGroupWaitBits(
|
75 | pirSensorEventGroup,
|
76 | PIR_SENSOR_HIGH_BIT | PIR_SENSOR_LOW_BIT,
|
77 | pdFALSE,
|
78 | pdFALSE,
|
79 | portMAX_DELAY);
|
80 | //1000/portTICK_PERIOD_MS);
|
81 | if(!(uxBits & PIR_SENSOR_HIGH_BIT) && !(uxBits & PIR_SENSOR_LOW_BIT))
|
82 | {
|
83 | ESP_LOGI(TAG, "Triggered without sensor");
|
84 | }
|
85 | }
|
86 | }
|
87 |
|
88 | uint8_t getPirSensorLevel(void)
|
89 | {
|
90 | return pirSensorLevel;
|
91 | }
|
92 |
|
93 | void initPirSensorTask(void)
|
94 | {
|
95 | xTaskCreate(pirSensorTask, "pirSensorTask", 100000, (void*)1, tskIDLE_PRIORITY, NULL);
|
96 | }
|