使用 ESP_NOW 循环和延迟

Using ESP_NOW with loop and delays

我正在尝试从一个 esp32 接收数据到另一个。 我也在用 delays 做一些 looping 来读取传感器数据和开关 on/off 继电器 冷却 。 此设备还使用 ESPAsyncWebServer 作为 API 服务器(不包括在代码中的大小)。 我正在 eps32 POST 请求 API 中接收数据。我想更改此设置以便能够使用 esp_now 接收。我正在做一些实验,但是 data receving 由于循环中的 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 && *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  && *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);
    }
}

我假设您正在尝试将您的传感器数据从该设备发送到另一个设备,同时或多或少准确地保持 5 秒的采样间隔。您可以使用 2 个线程自己创建一个简单的异步架构。

现有线程(由 Arduino 创建)运行您当前的 loop(),它每 5 秒读取一次传感器。您添加第二个线程来处理将示例传输到其他设备。第一个线程通过 FreeRTOS 队列将样本发布到第二个线程;第二个线程立即开始传输。第一个线程继续处理自己的事情,无需等待传输完成。

使用 FreeRTOS 文档创建 tasks and queues:

#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*>(&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, &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, &temp_check, 0);
    if (!res) {
      Serial.println("Error: TX queue full!");
    }
    // ... Rest of your loop code
  }
}