Pull to refresh

Comments 10

Умение читать документацию -- отличный навык! Есть, правда, пара субъективных замечаний по коду.

  1. Вместо постоянного переключения направления GPIO имеет смысл один раз сконфигурировать пин как GPIO_MODE_INPUT_OUTPUT_OD . Переключение отнимает время, а тайминги тут критичны.

  2. В данном случае датчик очень простой, идентификация по единственному пину и больше ничего не требуется, даже инициализации никакой не нужно, если направление каждый раз дёргать, но, на мой взгляд, имеет смысл пересмотреть интерфейс, сделать его что-то типа:

```

typedef struct {
    gpio_num_t pin;
    float humidity;
    float temperature;
} dht22_t;

dht22_t * dht22_init(gpio_num_t pin);
esp_err_t dht22_read(dht22_t *dht);

Суть в том, что будет чётко определённая инициализация, вызов чтения будет сохранять измеренные значения в структуру, из которой потом можно уже читать что надо. Если не нравится идея использования динамической памяти, хотя на ESP32 это не так критично, как на более мелких MCU, то вот другой вариант интерфейса инициализации:

esp_err_t dht22_init(dht22_t *dht, gpio_num_t pin);

Всё чётко и по делу. Согласен с обоими советами.
Я только начинаю разбираться что и как устроено как в С, так и в ESP, поэтому годные советы очень помогают.
Спасибо

P.S. Почитал про GPIO_MODE_INPUT_OUTPUT_OD, он тут идеально подходит. Поэтому поменял в коде. Ещё раз спасибо за подсказку)

Я бы ещё сверху навернул подсказок компилятору для оптимизации, на функцию init attribute cold, а в самом алгоритме на ветку проверки ошибки unlikely, на wait level inline

Зачем вам тут режим 2-х направленного вывода? Просто возьмите и объедините 2 вывода. Один на выход, второй на вход. Вы выводы решили экономить?

И чем же это отличается от "скетчей"? Мы поток тормозим на все время обмена с датчиком. Если железка будет делать что то ещё, этот код начнет либо глючить, либо тормозить другие задачи. Ведь наверняка на этой esp есть и таймера с захватом и dma и прерывания.

  1. Выше уже написали - как только есп32 чем нибудь нагрузить весь обмен посыпятся, т.к. уплывут тайминги. Выход - смотреть в сторону переферии, у нас есть rmt, как пример: https://github.com/mongoose-os-libs/onewire-rmt/blob/master/src/onewire_rmt.c

  2. Для отрицательных температур - код будет возвращать чушь. Лучше уж сразу raw_t объявить знаковым интом16.

DHT22 уже сильно устарел в 26-м году - погрешность ±0,5 градуса. Сегодня даже спутники измеряют температуру Земли с точностью в 0,3 градуса.

И зачем такая точность для дома? Изменилась температура на улице на 0.3 градуса, непременно надо надеть трусы с начесом...?) Для домашнего применения, коматные/уличные градусники точности и разрешающей способности в 1 градус достаточно более чем. Если датчик еще заведенив какую либо систему регулирования 0.5 градуса достаточно.

А где Вы смотрите результаты измерений?

Имейте в виду, что ESP довольно заметно греется и датчик температуры (и влажности) надо или относить подальше, или задействовать Sleep или Deep sleep.

Sign up to leave a comment.

Articles