ESP32 отправляет данные, пока мигает светодиод
Могу ли я запрограммировать свой ESP32 на отправку строки данных MQTT, одновременно мигая встроенным светодиодом?
Если да, то как это сделать
Заранее спасибо
@P_K, 👍2
Обсуждение1 ответ
Лучший ответ:
ESP32 имеет два ядра, каждое ядро может выполнять разные задачи. Затем вы можете отправлять данные с одним ядром и мигать светодиодом с другим ядром.
Для этого нужно использовать многоядерное программирование. Я рекомендую использовать FreeRTOS
(ESP32 поддерживает это). Показать еще.
Посмотрите пример "Let's multitask: Blink with Hello" здесь, это то, что вы хотите.
Прочитайте документацию о FreeRTOS
в ESP32.
Пример в Arduino IDE:
#include <Arduino_FreeRTOS.h>
// определить две задачи для Blink & analogRead
void TaskBlink( void *pvParameters );
void TaskAnalogRead( void *pvParameters );
// функция setup запускается один раз при нажатии кнопки reset или включении питания платы
void setup() {
// Теперь настройте две задачи для запуска независимо друг от друга.
xTaskCreate(
TaskBlink
, (const portCHAR *)"Blink" // Имя только для людей
, 128 // Размер стека
, NULL
, 2 // приоритет
, NULL );
xTaskCreate(
TaskAnalogRead
, (const portCHAR *) "AnalogRead"
, 128 // Этот размер стека можно проверить и отрегулировать, прочитав Highwater
, NULL
, 1 // приоритет
, NULL );
// Теперь автоматически запускается планировщик задач, который берет на себя управление планированием отдельных задач.
}
void loop()
{
// Пусто. Все делается в Задачах.
}
/*--------------------------------------------------*/
/*---------------------- Tasks ---------------------*/
/*--------------------------------------------------*/
void TaskBlink(void *pvParameters) // Это задача.
{
(void) pvParameters;
// инициализировать цифровой вывод 13 в качестве выхода.
pinMode(13, OUTPUT);
for (;;) // Задача никогда не должна возвращаться или выходить.
{
digitalWrite(13, HIGH); // включите светодиод (HIGH-уровень напряжения)
vTaskDelay( 1000 / portTICK_PERIOD_MS ); // подождите одну секунду
digitalWrite(13, LOW); // выключите светодиод, сделав напряжение НИЗКИМ
vTaskDelay( 1000 / portTICK_PERIOD_MS ); // подождите одну секунду
}
}
void TaskAnalogRead(void *pvParameters) // Это задача.
{
(void) pvParameters;
// инициализация последовательной связи со скоростью 9600 бит в секунду:
Serial.begin(9600);
for (;;)
{
// считывание входного сигнала на аналоговом выводе 0:
int sensorValue = analogRead(A0);
// распечатайте значение, которое вы прочитали:
Serial.println(sensorValue);
vTaskDelay(1); // задержка в один тик (15 мс) между чтениями для стабильности
}
}
Ссылка.
Спасибо вам за помощь. Есть ли какие-либо примеры Arduino IDE, так как в нем это более понятно, @P_K
[Посмотрите на это example](https://create.arduino.cc/projecthub/feilipu/using-freertos-multi-tasking-in-arduino-ebc3cc). Я добавил пример в ответ., @Higor Maia Concessa
Хотя это правда, это кажется большим увеличением сложности при относительно низком коэффициенте усиления (и есть несколько планировщиков задач для Arduino, которые не включают RTOS). Я также понимаю, что если задачи специально не привязаны к ядру, то нет никакой гарантии относительно многоядерности., @Dave Newton
Поэтому я предполагаю, что предоставление одинакового приоритета 2 небольшим задачам заставит их выполняться одновременно. Я прав?, @P_K
Если запустить в разных ядрах, то будет выполняться одновременно. Если запустить в одном ядре с одинаковым приоритетом, будет выполняться слияние каждого из них., @Higor Maia Concessa
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Питание esp32cam от аккумулятора
- Контакты RX и TX на esp32
- ESP32: отключить детектор отключения питания
Конечно, можешь. Вы можете использовать что-то вроде примера BlinkWithoutDelay, включенного в Arduino IDE, чтобы ваша программа могла работать (например, отправлять данные MQTT), пока светодиод включается и выключается с правильной частотой. До тех пор, пока отправка данных MQTT не займет больше времени, чем период включения или выключения светодиода, это будет работать., @StarCat
Взгляните на пример [blink-without-delay](https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay) чтобы получить представление о том, как можно реализовать "многозадачность". Но, как уже упоминал @HigorMaiaConcessa, ESP поддерживает FreeRTOS, где вам не нужно сильно заботиться о том, как это работает., @Sim Son
Мое мнение таково, что использование нескольких ядер для чрезвычайно простых задач, таких как мигание светодиода, излишне сложно., @StarCat