#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. Хорошо, тогда получайте удовольствие!