Использование ESP_NOW с циклом и задержками

#c #loops #delay #esp32 #arduino-ide

#c #циклы #задержка #esp32 #arduino-ide

Вопрос:

Я пытаюсь получить данные от одного esp32 к другому. Я также делаю некоторые looping с delays для считывания данных датчика и включения / выключения охлаждения реле. Это устройство также используется ESPAsyncWebServer в качестве сервера API (не включено в код для размера). Я получаю данные от одного eps32 в POST запросе к API прямо сейчас. Я хотел бы изменить это, чтобы иметь возможность получать с. esp_now Я проводил некоторые эксперименты, но получение данных задерживается из-за delay метода в цикле. Есть ли способ сделать это асинхронным, как, например ESPA , выше?

Я также попробовал способ сравнения milis() (времени) для ожидания цикла, но я считаю, что это слишком «ресурсоемкая» задача, чтобы позволить ей сравнивать на полной скорости в цикле, как вихрь навсегда.

вот мой цикл, это просто простой цикл с некоторыми переменными и функцией задержки, например

 
void loop() {
    if (WiFi.status() == WL_CONNECTED) {
        float temp_check = dht.readTemperature();

        if (temp_check == 0) {
            delay(1000);
            temp_check = dht.readTemperature();
        }

        if (temp_check > 32.0 amp;amp; *cooling_switch_p == false) {
            Serial.println("[ INF ] Too high temperature, switch on a cooling system");
            digitalWrite(COOLING_RELAY, LOW);
            *cooling_switch_p = true;
        }
        else if (temp_check < 30.0  amp;amp; *cooling_switch_p == true) {
            Serial.println("[ INF ] Normal temperature, switch off a cooling system");
            digitalWrite(COOLING_RELAY, HIGH);
            *cooling_switch_p = false;
        }

        Serial.print("[ DBG ] Light Switch: ");
        Serial.println(String(light_switch));
        Serial.println("");

        Serial.print("[ DBG ] Pump Switch: ");
        Serial.println(String(pump_switch));
        Serial.println("");
        delay(5000);
    }

    else {
        Serial.println("[ ERR ] Wifi not connected. Exiting program");
        delay(9999);
        exit(0);
    }
}

 

Ответ №1:

Я предполагаю, что вы пытаетесь отправить данные своего датчика с этого устройства на другое, более или менее точно сохраняя 5-секундный интервал выборки. Вы можете создать простую асинхронную архитектуру самостоятельно, используя 2 потока.

Существующий поток (созданный Arduino) запускает ваш ток loop() , который считывает данные датчика каждые 5 секунд. Вы добавляете второй поток, который занимается передачей выборки на другие устройства. Первый поток отправляет образец второму потоку через очередь FreeRTOS; второй поток немедленно переходит к работе по передаче. Первый поток продолжает заниматься своими делами, не дожидаясь завершения передачи.

Использование документации FreeRTOS по созданию задач и очередей:

 #include <task.h>
#include <queue.h>
#include <assert.h>

TaskHandle_t hTxTask;
QueueHandle_t hTxQueue;

constexpr size_t TX_QUEUE_LEN = 10;

// The task which transmits temperature samples to wherever needed
void txTask(void* parm) {
  while (true) {
    float temp;
    // Block until a sample is posted to queue
    const BaseType_t res = xQueueReceive(hTxQueue, static_cast<void*>(amp;temp), portMAX_DELAY);
    assert(res);
    // Here you write your code to send the temperature to other device
    // e.g.: esp_now_send(temp);
  }
}

void setup() {
  // Create the queue
  hTxQueue = xQueueCreate(TX_QUEUE_LEN, sizeof(float));
  assert(hTxQueue);
  // Create and start the TX task
  const BaseType_t res = xTaskCreate(txTask, "TX task", 8192, nullptr, tskIDLE_PRIORITY, amp;hTxTask);
  assert(res);
  // ... rest of your setup()
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    float temp_check = dht.readTemperature();
    // Post fresh sample to queue
    const BaseType_t res = xQueueSendToBack(hTxQueue, amp;temp_check, 0);
    if (!res) {
      Serial.println("Error: TX queue full!");
    }
    // ... Rest of your loop code
  }
}
 

Комментарии:

1. Спасибо! Я пытаюсь не «отправлять», а «получать» с помощью этого устройства, но я думаю, что предоставленный вами код также будет работать таким образом!

2. Хорошо, тогда получайте удовольствие!