#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
//#include <sys/time.h>
#include <driver/dac.h>
#include "esp_timer.h"
#include "driver/pcnt.h"
#define LED GPIO_NUM_9
#define echoPin GPIO_NUM_5
#define trigPin GPIO_NUM_4
long dist = 0;
long last_dist = -1;
void app_main() {
gpio_reset_pin(LED);
gpio_set_direction(LED, GPIO_MODE_OUTPUT);
gpio_reset_pin(echoPin);
gpio_set_direction(echoPin, GPIO_MODE_INPUT);
gpio_reset_pin(trigPin);
gpio_set_direction(trigPin, GPIO_MODE_OUTPUT);
while (true) {
long dist = 0;
gpio_set_level(trigPin, false);
esp_rom_delay_us(4);
gpio_set_level(trigPin, true);
esp_rom_delay_us(10);
gpio_set_level(trigPin, false);
while(!gpio_get_level(echoPin)) {
//printf("LOW \n");
}
uint32_t echo_start = esp_timer_get_time();
while(gpio_get_level(echoPin)) {
//time = esp_timer_get_time();
}
long dur = esp_timer_get_time() - echo_start;
dist = (dur / 2) * 0.0343;
long one = dist / 100.75;
dist -= one * 0.75;
printf("Дистанция:%ld \n", dist);
if(dist > 200) {
gpio_set_level(LED, true);
}
else {
gpio_set_level(LED, false);
}
esp_rom_delay_us(1000000);
}
}
// // Настройка PCNT
// void setup_pcnt() {
// pcnt_unit_config_t unit_config = {
// .high_limit = 100000,
// .low_limit = -100000
// };
// pcnt_unit_handle_t pcnt_unit;
// ESP_ERROR_CHECK(pcnt_new_unit(&unit_config, &pcnt_unit));
// pcnt_chan_config_t chan_config = {
// .edge_gpio_num = ECHO_GPIO,
// .level_gpio_num = -1
// };
// pcnt_channel_handle_t pcnt_chan;
// ESP_ERROR_CHECK(pcnt_new_channel(pcnt_unit, &chan_config, &pcnt_chan));
// // Счёт на rising и falling edge
// ESP_ERROR_CHECK(pcnt_channel_set_edge_action(pcnt_chan,
// PCNT_CHANNEL_EDGE_ACTION_INCREASE,
// PCNT_CHANNEL_EDGE_ACTION_INCREASE));
// // Фильтр помех (игнорировать выбросы < 100ns)
// pcnt_glitch_filter_config_t filter_config = {
// .max_glitch_ns = 100
// };
// ESP_ERROR_CHECK(pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config));
// ESP_ERROR_CHECK(pcnt_unit_enable(pcnt_unit));
// ESP_ERROR_CHECK(pcnt_unit_clear_count(pcnt_unit));
// ESP_ERROR_CHECK(pcnt_unit_start(pcnt_unit));
// }
// // Чтение длительности импульса в микросекундах
// int get_pulse_us() {
// int pulse_count;
// ESP_ERROR_CHECK(pcnt_unit_get_count(pcnt_unit, &pulse_count));
// return pulse_count * 10; // Конвертация в мкс (зависит от clock источника)
// }