ЦЕЛЬ темы - проверить код на с visial code в espressif
А у некоторых чел не потуг в голове ? е только ниже пояса? почему?😗
- В области разработке ПО основная проблема старого и нового - это переносимость кода. Переносимость кода невозможно по разным причинам в основном из за утери актуальности: СЫЛКА video
1) устарела аппаратура на который организован код;
2) изменялись архитектуры и версии, а и не все версии актуальны, но есть;
3) узкой направленности задачи под который писался код, что вызвало его не развитие и не поддержку - сопутствующие описание и примеры;
:
N) ранее или позже созданные коды в библиотеках, которые вызывают конфликт.
Потому при разработке и использования примеров надо учитывать все выше не до конца перечисленные нюансы. Особо это когда касается при замене СРЕДСТВ разработки в виду и по причине , что может возникнуть конфликт библиотек или сборок.
Потому актуальна проверка состояния совместимости кода на этапах перехода из одной седы разработки в другую?
Характеристика HC-SR04
- Питание: 5 В
- Ток: 6 мА
- Угол измерения: 15 гр
- Расстояние: от 2 до 400 см
- Точность: 2 мм
- Размер: 50*30*20 мм
переработаем немного по своему схему соединений согласно другой кит плате
Микроконтроллеры одинаковые , а распиновка плат разная и плюс питание на на ЧЕРНО БЕЛЫЙ жк дисплей взята из usb-uart соединения. Сама плата запитана от micro usb .
- Кстати если посмотреть то используем для HC-SR04 SPI интерфейс, но SDA провод в нем не используем.
ЗАПУСТИМ ПО(((
немного на английском в теории тут
Выполним пункты?
Три пункта выполним ? Нужный чип укажем?
/////КОД в mail.c
#include <stdio.h>
#include <stdbool.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <ultrasonic.h>
#include <esp_err.h>
#define MAX_DISTANCE_CM 500 // 5m max
#define TRIGGER_GPIO 5
#define ECHO_GPIO 18
//// библиотеки нужные есть?🤨
void ultrasonic_test(void *pvParameters)
{ ultrasonic_sensor_t sensor = {
.trigger_pin = TRIGGER_GPIO, .echo_pin = ECHO_GPIO};
ultrasonic_init(&sensor);
while (true) { float distance;
esp_err_t res = ultrasonic_measure(&sensor, MAX_DISTANCE_CM, &distance);
if (res != ESP_OK)
{ printf("Error %d: ", res);
switch (res)
{ case ESP_ERR_ULTRASONIC_PING:
printf("Cannot ping (device is in invalid state)\n"); break;
case ESP_ERR_ULTRASONIC_PING_TIMEOUT:
printf("Ping timeout (no device found)\n"); break;
case ESP_ERR_ULTRASONIC_ECHO_TIMEOUT:
printf("Echo timeout (i.e. distance too big)\n"); break;
default: printf("%s\n", esp_err_to_name(res));}
} else printf("Distance: %0.04f cm\n", distance*100);
vTaskDelay(pdMS_TO_TICKS(500));}
}
////////////////////////////// тело программы😋
void app_main()
{ xTaskCreate(ultrasonic_test, "ultrasonic_test", configMINIMAL_STACK_SIZE * 3, NULL, 5, NULL); }
- Копируем указанный выше код в main.c (от рихтовать можно по правилам кстати - полезно) 😙
СОЗДАЛИ КАТАЛОГ? СОЗДАДИМ ПОДКАТАЛОГИ \esp_idf_lib_helpers и \ultrasonic
теперь занесём туда файлы и немного на английском в теории тут
😊приступим и создадим CMakeLists.txt
idf_component_register(
INCLUDE_DIRS .
REQUIRES freertos
)
🤨далее создадим esp_idf_lib_helpers.h
#if !defined(__ESP_IDF_LIB_HELPERS__H__)
#define __ESP_IDF_LIB_HELPERS__H__
#include <freertos/FreeRTOS.h>
#include <esp_idf_version.h>
#if !defined(ESP_IDF_VERSION) || !defined(ESP_IDF_VERSION_VAL)
#error Unknown ESP-IDF/ESP8266 RTOS SDK version
#endif
#define HELPER_ESP32_MIN_VER ESP_IDF_VERSION_VAL(3, 3, 5)
#define HELPER_ESP8266_MIN_VER ESP_IDF_VERSION_VAL(3, 3, 0)
#if defined(CONFIG_IDF_TARGET_ESP32) \
|| defined(CONFIG_IDF_TARGET_ESP32S2) \
|| defined(CONFIG_IDF_TARGET_ESP32S3) \
|| defined(CONFIG_IDF_TARGET_ESP32C3)
#define HELPER_TARGET_IS_ESP32 (1)
#define HELPER_TARGET_IS_ESP8266 (0)
#elif defined(CONFIG_IDF_TARGET_ESP8266)
#define HELPER_TARGET_IS_ESP32 (0)
#define HELPER_TARGET_IS_ESP8266 (1)
#else
#error BUG: cannot determine the target
#endif
#if HELPER_TARGET_IS_ESP32 && ESP_IDF_VERSION < HELPER_ESP32_MIN_VER
#error Unsupported ESP-IDF version. Please update!
#endif
#if HELPER_TARGET_IS_ESP8266 && ESP_IDF_VERSION < HELPER_ESP8266_MIN_VER
#error Unsupported ESP8266 RTOS SDK version. Please update!
#endif
#if DEBUG
#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define VAR_NAME_VALUE(var) #var "=" VALUE(var)
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP32C3))
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP32S2))
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP32))
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP8266))
#pragma message(VAR_NAME_VALUE(ESP_IDF_VERSION_MAJOR))
#endif
#endif
😃надо создать тут же ets_sys.h и немного на английском в теории тут
///копируем его в созданный файл ets_sys.h 😏
#if CONFIG_IDF_TARGET_ESP32
#include <esp32/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32S2
#include <esp32s2/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32S3
#include <esp32s3/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32C3
#include <esp32c3/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32H2
#include <esp32h2/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32C2
#include <esp32c2/rom/ets_sys.h>
#endif
🚲 для чего этот код всем понятно? о чём и реч шла о совместимости ПО и оборудования выше
😉Далее в каталоге \ultrasonics надо создать файлы
🎈создадим файл CMakeLists.txt
🤨необходимый код для файла CMakeLists.txt
if(${IDF_TARGET} STREQUAL esp8266)
set(req esp8266 freertos esp_idf_lib_helpers esp_timer)
elseif(${IDF_VERSION_MAJOR} STREQUAL 4 AND ${IDF_VERSION_MINOR} STREQUAL 1 AND ${IDF_VERSION_PATCH} STREQUAL 3)
set(req driver freertos esp_idf_lib_helpers)
else()
set(req driver freertos esp_idf_lib_helpers esp_timer)
endif()
idf_component_register(
SRCS ultrasonic.c
INCLUDE_DIRS .
REQUIRES ${req}
)
🎈создадим файл ultrasonic.c
///🤨необходимый код для файла ultrasonic.c
#include <esp_idf_lib_helpers.h>
#include "ultrasonic.h"
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_timer.h>
#include <ets_sys.h>
#define TRIGGER_LOW_DELAY 4
#define TRIGGER_HIGH_DELAY 10
#define PING_TIMEOUT 6000
#define ROUNDTRIP_M 5800.0f
#define ROUNDTRIP_CM 58
#if HELPER_TARGET_IS_ESP32
static portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
#define PORT_ENTER_CRITICAL portENTER_CRITICAL(&mux)
#define PORT_EXIT_CRITICAL portEXIT_CRITICAL(&mux)
#elif HELPER_TARGET_IS_ESP8266
#define PORT_ENTER_CRITICAL portENTER_CRITICAL()
#define PORT_EXIT_CRITICAL portEXIT_CRITICAL()
#else
#error cannot identify the target
#endif
#define timeout_expired(start, len) ((esp_timer_get_time() - (start)) >= (len))
#define CHECK_ARG(VAL) do { if (!(VAL)) return ESP_ERR_INVALID_ARG; } while (0)
#define CHECK(x) do { esp_err_t __; if ((__ = x) != ESP_OK) return __; } while (0)
#define RETURN_CRITICAL(RES) do { PORT_EXIT_CRITICAL; return RES; } while(0)
esp_err_t ultrasonic_init(const ultrasonic_sensor_t *dev)
{ CHECK_ARG(dev);
CHECK(gpio_set_direction(dev->trigger_pin, GPIO_MODE_OUTPUT));
CHECK(gpio_set_direction(dev->echo_pin, GPIO_MODE_INPUT));
return gpio_set_level(dev->trigger_pin, 0);
}
esp_err_t ultrasonic_measure_raw(const ultrasonic_sensor_t *dev, uint32_t max_time_us, uint32_t *time_us)
{ CHECK_ARG(dev && time_us); PORT_ENTER_CRITICAL;
// Ping: Low for 2..4 us, then high 10 us
CHECK(gpio_set_level(dev->trigger_pin, 0));
ets_delay_us(TRIGGER_LOW_DELAY);
CHECK(gpio_set_level(dev->trigger_pin, 1));
ets_delay_us(TRIGGER_HIGH_DELAY);
CHECK(gpio_set_level(dev->trigger_pin, 0));
// Previous ping isn't ended
if (gpio_get_level(dev->echo_pin))
RETURN_CRITICAL(ESP_ERR_ULTRASONIC_PING);
// Wait for echo
int64_t start = esp_timer_get_time();
while (!gpio_get_level(dev->echo_pin))
{ if (timeout_expired(start, PING_TIMEOUT))
RETURN_CRITICAL(ESP_ERR_ULTRASONIC_PING_TIMEOUT);
}
// got echo, measuring
int64_t echo_start = esp_timer_get_time();
int64_t time = echo_start;
while (gpio_get_level(dev->echo_pin))
{ time = esp_timer_get_time();
if (timeout_expired(echo_start, max_time_us))
RETURN_CRITICAL(ESP_ERR_ULTRASONIC_ECHO_TIMEOUT);
}
PORT_EXIT_CRITICAL;
*time_us = time - echo_start;
return ESP_OK;
}
esp_err_t ultrasonic_measure(const ultrasonic_sensor_t *dev, float max_distance, float *distance)
{ CHECK_ARG(dev && distance);
uint32_t time_us;
CHECK(ultrasonic_measure_raw(dev, max_distance * ROUNDTRIP_M, &time_us));
*distance = time_us / ROUNDTRIP_M;
return ESP_OK;
}
esp_err_t ultrasonic_measure_cm(const ultrasonic_sensor_t *dev, uint32_t max_distance, uint32_t *distance)
{ CHECK_ARG(dev && distance);
uint32_t time_us;
CHECK(ultrasonic_measure_raw(dev, max_distance * ROUNDTRIP_CM, &time_us));
*distance = time_us / ROUNDTRIP_CM;
return ESP_OK;
}
🎈создадим файл ultrasonic.h
🤨необходимый код для файла ultrasonic.h
#ifndef __ULTRASONIC_H__
#define __ULTRASONIC_H__
#include <driver/gpio.h>
#include <esp_err.h>
#ifdef __cplusplus
extern "C" {
#endif
#define ESP_ERR_ULTRASONIC_PING 0x200
#define ESP_ERR_ULTRASONIC_PING_TIMEOUT 0x201
#define ESP_ERR_ULTRASONIC_ECHO_TIMEOUT 0x202
typedef struct
{ gpio_num_t trigger_pin; //!< GPIO output pin for trigger
gpio_num_t echo_pin; //!< GPIO input pin for echo
} ultrasonic_sensor_t;
sp_err_t ultrasonic_init(const ultrasonic_sensor_t *dev);
esp_err_t ultrasonic_measure_raw(const ultrasonic_sensor_t *dev, uint32_t max_time_us, uint32_t *time_us);
esp_err_t ultrasonic_measure(const ultrasonic_sensor_t *dev, float max_distance, float *distance);
esp_err_t ultrasonic_measure_cm(const ultrasonic_sensor_t *dev, uint32_t max_distance, uint32_t *distance);
#ifdef __cplusplus
}
#endif
#endif
😎немного на английском в теории кстати тут
НАПОМНЮ ЦЕЛЬ темы - проверить код на изложенный для visial code в espressif.
ЗАПУСТИМ? отладим?😜
По пунктам?✔
Выполним пункты?
Установите утилиту gercules? Можете другую?
Предмет перед датчиком передвигаем (можно ладонь) смотрим результат
ПЕРВОИСТОЧНИК кстати тут , НО КОД ДЛЯ code vijual какой то...
- СПОНСОР ООО АК ПРАВОВОЕ СОТРУДНИЧЕСТВО
СЫЛКА video