首页 > 解决方案 > ESP32-WROOM - 使用多核的问题

问题描述

我的 ESP32 Wroom 代码有问题。我正在尝试使用 esp 上的两个内核来加速并为设备创建一个高效的进程;一个核心检查来自网站页面的更改/响应。另一个根据收到的响应更改 LED 模式。

Core 0(得到响应)应该不断更新一个名为“payload”的字符串,其中包含来自网站的最新接收信息。这发生在另一个核心显示模式直到它接收到“有效负载”的变化时;并相应改变。

我遇到的问题是 esp 在上传和第一次启动后每 1-2 秒打印一次以下消息:

rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4 
load:0x3fff001c,len:1044 
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac

这也打印在一些消息中:

大师冥想错误:核心 0 恐慌(双重例外)

我是 ESP32 的新手,对 Arduino 没有太多经验,有人知道我做错了什么或避免当前问题实现相同目标的方法吗?提前致谢。

这是我的项目的代码。

TaskHandle_t Task1;

#include <WiFi.h>
#include <Wire.h>
#include <HTTPClient.h>
#include "FastLED.h"
#define NUM_LEDS 50
#define PIN 27

uint8_t hue[NUM_LEDS];
CRGBArray<NUM_LEDS> leds;

const char* ssid     = "Username";
const char* password = "Password";

const char* serverName = "https://example.com/page.php";

String apiKeyValue = "tPmAT5Ab3j7F9";
String payload;

void codeForTask1( void * parameter )
{
  for (;;) 
  {   
    if(WiFi.status() == WL_CONNECTED)
    {
      HTTPClient http;
      
      // Your Domain name with URL path or IP address with path
      http.begin(serverName);
      
      // Specify content-type header
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");
      
      // Prepare your HTTP POST request data
      String httpRequestData = "api_key=" + apiKeyValue;
      
    
      // Send HTTP POST request
      int httpResponseCode = http.GET();
      
          
      if (httpResponseCode>0)
      {
        payload = http.getString();
      }
    }
    delay(1000);    
  }
}

void setup() 
{
  Serial.begin(115200);
  
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) { 
    delay(500);
  }
  
  
  FastLED.addLeds<NEOPIXEL, PIN>(leds, NUM_LEDS);
  for (int i = 0; i < NUM_LEDS; i++)
  {
    hue[i] = 255 / NUM_LEDS * i;
  }
  
  xTaskCreatePinnedToCore(
    &codeForTask1,
    "led1Task",
    2000,
    NULL,
    1,
    &Task1,
    0);
  delay(500);  // needed to start-up task1
}

void loop() 
{
  String payload2 = payload;
  if(payload2.indexOf("rainbow") >= 0)
  {
    while(payload2.indexOf("rainbow") >= 0)
    {
      for(int i=0; i<NUM_LEDS; i++)
      {
        leds[i] = CHSV(hue[i]++, 255, 255);
      }            
      delay(100);
      FastLED.show();  
    }
    Serial.print(payload2 + " || Rainbow \n");
  }
  else if(payload2.indexOf("worm") >= 0)
  {
    
    for(int i=0; i<NUM_LEDS; i++)
    {
        for(int e=0; e<=1; e++)
        {
          if(e == 0){
            leds[i] = CRGB(255, 255, 255);
            leds[i+2] = CRGB(255, 255, 255);
            leds[i+4] = CRGB(255, 255, 255);
            leds[i+6] = CRGB(255, 255, 255);
            FastLED.show();
          }else{
            leds[i] = CRGB(0, 0, 0);
            leds[i+2] = CRGB(0, 0, 0);
            FastLED.show();
          }
          delay(100);
        }
    }      
    Serial.print(payload2 + " || Worm \n");
  }
  else if(payload2.indexOf("ant") >= 0)
  {
    
    for(int i=0; i<NUM_LEDS; i++)     // loop
    {    
      for(int e=0; e<=1; e++)
      {
        if(e == 0)
        {
          leds[i] = CRGB(255, 255, 255);
          leds[i+1] = CRGB(255, 255, 255);
          leds[i+2] = CRGB(0, 0, 0);
          leds[i+4] = CRGB(255, 255, 255);
          leds[i+5] = CRGB(255, 255, 255);
          leds[i+3] = CRGB(0, 0, 0);
  
          FastLED.show();
        }
        else
        {
          leds[i] = CRGB(0, 0, 0);
          leds[i+1] = CRGB(0, 0, 0);
          FastLED.show();
        }
        delay(50);
      }
    }
    Serial.print(payload2 + " || Ant \n");
  }
  else if(payload.indexOf("off") >= 0)
  {
    Serial.print(payload2 + " || Off \n" );
  }
  else if(!payload2.isEmpty())
  {
    String dab = payload;
    String hexstring = dab;
    long number = (long) strtol( &hexstring[0], NULL, 16 );
    int r = number >> 16;
    int g = number >> 8 & 0xFF;
    int b = number & 0xFF;
    
    for(int i=0; i<NUM_LEDS; i++){
      leds[i] = CRGB(r, g, b);
    }
    FastLED.show();               // start new rgb led strip assignment/patterns
    Serial.print(payload2 + " || CUSTOM COLOR \n");
  } 
  delay(1000);
  Serial.print("Task 1: Done \n");
}

标签: arduinoesp32

解决方案


推荐阅读