ESP32 отправляет данные, пока мигает светодиод

Могу ли я запрограммировать свой ESP32 на отправку строки данных MQTT, одновременно мигая встроенным светодиодом?

Если да, то как это сделать

Заранее спасибо

, 👍2

Обсуждение

Конечно, можешь. Вы можете использовать что-то вроде примера BlinkWithoutDelay, включенного в Arduino IDE, чтобы ваша программа могла работать (например, отправлять данные MQTT), пока светодиод включается и выключается с правильной частотой. До тех пор, пока отправка данных MQTT не займет больше времени, чем период включения или выключения светодиода, это будет работать., @StarCat

Взгляните на пример [blink-without-delay](https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay) чтобы получить представление о том, как можно реализовать "многозадачность". Но, как уже упоминал @HigorMaiaConcessa, ESP поддерживает FreeRTOS, где вам не нужно сильно заботиться о том, как это работает., @Sim Son

Мое мнение таково, что использование нескольких ядер для чрезвычайно простых задач, таких как мигание светодиода, излишне сложно., @StarCat


1 ответ


Лучший ответ:

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