使用 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
}
}
我正在尝试从一个 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
}
}