arduino - 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");
}
解决方案
推荐阅读
- .htaccess - 替换 URL 中的字符
- javascript - 编写一个脚本自动运行通过我的注册页面反应
- javascript - 在条带中添加自己的 CardHolder 名称
- c++ - 朋友模板运算符
- visual-studio-code - vscode 从以前的同步中恢复扩展
- git - 从原始提交更改提交日期
- multithreading - Tkinter 滚动条干扰线程打印到文本小部件
- sql - SQL/ACCESS 单向一对一关系数据完整性
- java - 带有 Java Hibernate 和 Jersey 后端的 AWS Cognito
- ios - SwiftUI Group of Text + Link -> 编译器错误