многозадачность esp32 отправляет httpclient всегда после 10 раз - PullRequest
0 голосов
/ 22 марта 2020

Я написал несколько кодов о параллельной обработке, одно ядро ​​считывает данные dht11, а другое ядро ​​отправляет данные в thingpeak.

Я использую IDE Arduino и использую функцию: xTaskCreatePinnedToCore для выполнения этой работы.

Но httpclient всегда 10 раз успешно выполняется и постоянно выдает ошибку.

Когда я традиционно использую его в l oop, он работает хорошо.

httpcode = -1, это то, что я получил.

#include <WiFi.h>
#include <HTTPClient.h>
#include <SimpleDHT.h>

char ssid[] = "ssid";
char password[] = "pws";
//
String url = "http://api.thingspeak.com/update?api_key=yourAPIKey";
int pinDHT11 = 14;

SimpleDHT11 dht11(pinDHT11);

byte temperature = 0;
byte humidity = 0;
//Task1
TaskHandle_t Task1;
int count = 1;
void senddata(void * pvParameters ) {
  //Sending to thingspeak
  for ( ;; ) {
    Serial.print("Sending via core:");
    Serial.println(xPortGetCoreID());
    Serial.println("Start sending");
    HTTPClient http;

    String url1 = url + "&field1=" + (int)temperature + "&field2=" + (int)humidity;
    Serial.println(url1);
    Serial.println(WiFi.status());
    //http client
    http.begin(url1);
    int httpCode = http.GET();
    Serial.println(httpCode);
    if (httpCode == HTTP_CODE_OK) {
      //payload
      String payload = http.getString();
      Serial.print("payload=");
      Serial.println(payload);
      Serial.println("count=" + String(count++));
    } else {
      //Fail
      Serial.println("Send fail");
    }
    //http.end();
    Serial.println("deleting");
    vTaskDelete(Task1);//vTaskDelete(NULL) is the same fail after 10 times

  }

}

void setup()
{
  Serial.begin(115200);
  Serial.print("connecting SSID:");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("connected");
}

void loop()
{
  Serial.print("reading dht11 via core:");
  Serial.println(xPortGetCoreID());  
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read error="); Serial.println(err); delay(1000);
    return;
  }
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" H");

  xTaskCreatePinnedToCore(
    senddata,  /*Function*/
    "Task1",   /**/
    100000,     /*1000,10000,100000 all sended http 10 times, and fail*/
    NULL,      /**/
    0,         /**/
    &Task1,    /**/
    0);        /**/

  delay(20000);//20s
}
...