• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как подключить дополнительные RX и TX к ESP32

CodeNameHawk

Moderator
Команда форума
программированием же я занимался почти всю жизнь (Delphi, Basic, ASP, Java, PHP, PowerShell)
Тогда странно, что без готовой библиотеки вы не можете придумать как
как-то передать по I2C данные в формате float,
А ведь чего проще, нп. преобразовать в текст, преобразовать в целочисленное значение(нужно вам два знака после запятой, умножьте на 100 и возьмите целую часть) , передать и преобразовать обратно.
Только из-за этого и нет подсказок на элементарные вещи.
 
Про такие способы передачи я
Тогда странно, что без готовой библиотеки вы не можете придумать как
Ну С немного другой скажем так язык в отличии от тех, на которых программировал я. Я больше работал с базами данных, WEB опять так для работы с базами данных, потом с AD.
А на счет передачи с переводом в текст или в целочисленные значения я читал и держал этот варимант на крайний случай в уме.
 
для этого надо переписать либу bmp280 на FreeRTOS - земенить все delay() на vTaskDelay().
Библиотека от Adafruit. На досуге можно конечно залесть в нее и посмотреть как там все устроено. Тормоза дает именно измерение давления. Я в итоге сделал измерение температуры и влажности раз в секунду, а давление раз в 10 секунд. В принципе это тоже избавило бегущую строку от подергиваний.
 
это обозначает паскаль, не если даже С то принцип тот же.
Это я понимаю, но Паскаль и ему подобные языки я не знал.
для этого надо переписать либу bmp280 на FreeRTOS - земенить все delay() на vTaskDelay().
Нашел библиотеку ErriezBMX280-master. Посмотрел код. В отличии от Adafruit библиотеки в этой нет ни одного Delay. Послезавтра буду на удаленке работать, потестирую ее.
 

gromush

Member
Delphin911
ESP32 - двух ядерный процессор. Таска loop() от ардуино бежит на первом коре, можете создать отдельный таск на коре 0 и там хоть что измерять у вас никаких проблем с таском ардуино не будет.
 

gromush

Member
xTaskCreatePinnedToCore

Работает так же как обычная, но дает возможность установить кор на котором побежит функция таска.
 
Работает так же как обычная, но дает возможность установить кор на котором побежит функция таска.
Наверное я этого еще не знаю. Просто loop() оно как бы существуе вне всего прочего. Т.е. без нее просто ничего не заработает. И я его никуда не привязываю. А как использовать команду xTaskCreatePinnedToCore? И где? Как отдельную функцию? Ну не в теле же основного loop()?
А! Довольно быстро нашел что и как! И переменные задаются для обоих ядер? Т.е. если я задал перед Setup() переменную скажем uint8_t X, то когда она измениться на первом ядре, то во втором ядре ее можно считать?
 

gromush

Member
Delphin911
Да, но не все так просто. При синхронизации двух коров желательно использовать очереди.


По поводу loop().
ESP32 работает не как ардуино.
Для поддержки иллюзии, что это тоже самое, в таске FreeRTOS вызывает пользовательскую функцию setup() перед стартом бесконечного цикла таска, а loop() вызывается внутри этого бесконченого цикла.
Т.е. имитируется один процессор для симуляции ардуино.

В твоем случае ты в setup() создаешь еще один таск но на другом коре процессора. В функции которая будет играть роль таска сначала делаешь сетап нужного сенсора, затем в
while(1)
{
}

вставляешь в тело бесконечного цикла работу с сенсором и небольшую задержку, чтобы не ругался WatchDog.
Создаешь так же очередь на 1 или 2 поля, в которую передаешь либо структуру либо переменную которую хочешь передавать другому таску, так полностью безопасно.
Чтение же глобальных переменных можно делать если один таск пишет атомарно, но чтобы не заморачивать тебе голову этим и семафорами - проще просто перекидывать через очередь.
По ссылке выше видно, как можно читать с очереди данные. Как можно ждать их в ней определенный период или вообще не ждать или ждать бесконечно.

Обычно каждая часть работы программы может быть оформлена как таск.
Например ты создаешь таск чтения данных с сенсора и он кидает их в очередь. Можно создать структуру в которой первое поле - это вид сообщения в очереди, а дальше структура данных для передачи, например.
Для дисплея, бегущей строки и прочего - отдельный таск который получает сообщение и начинает показывать эти данные, третий таск для работы с вторым типом сенсора, четвертый для выброса данных на сервер или чтения с него чего-то и так далее.

Между ними можно ставить очереди, а можно иметь глобальные данные и каждый раз когда пишешь или читаешь закрывать к ним доступ семаформо (Почитай про них там же на сайте)

Я вообще использую чистый FreeRTOS, но если лениво и хочется просто взять библиотеки, то таски создаются в setup() а loop() просо убивает сам себя (стандартный таск ардуино) и все, бегут только твои таски.
Главное не забывай, что железо в библиотеках ардуино написано в расчете на один таск и попытка работать с одним и тем же сенсором может убить программу.
 
Вроде разобрался с работой 2х ядер и совместной работой ESP32 с Arduino Nano. И тут меня ждал облом. Решил таки посмотреть как работает датчик CO2. Куплен он у меня был уж года 2, а то и больше назад. И оказался он похоже дохлый. В итоге я его подключал к Arduino Nano и по UART (и с использованием библиотеки и без библиотеки) и через PWM. Вроде светодиодики внутри моргают, а результат не выдает.
 
Сверху Снизу