Enginursday:使用两个ESP32核

在本周的引擎日,我们将探索如何使用这两个核心的ESP32,以及你为什么想这么做。

喜爱的 最喜欢的

在过去的一年里,我一直在开发我的OLED时钟代码。如果你没有读过我之前的博文,你可以读到第一部分,和A跟进这。但是作为一个快速的概述,我一直在用我们的ESP32事与网络时间协议(NTP)服务器通信以获取当前时间并将其显示在my上OLED显示器。有了WiFi收音机,我还可以扫描可用的访问点,并提供我试图连接的访问点的密码。问题是扫描需要几秒钟完成,在那段时间里,显示冻结,直到扫描完成。

无线网络配置页面

偶尔,一些来自NTP的服务器这个列表可以在没有警告的情况下脱机。作为备份,我检查所有的服务器,直到我收到一个UDP包。有1000ms超时,如果我失去了网络连接,我必须等14秒才能再次更新时间。作为一个解决方案,我尝试在每次尝试失败后更新时间,但我所尝试的一切都导致了ESP32的崩溃和重启。

NTP代码

那是我有同伴的时候功能工程师安迪建议我使用ESP32的另一个核心。老实说,我没想到。在挖掘之后,我偶然看到这个教程randomnerdtutorials.com网站。上传Duel LED闪烁代码后,我开始懂得如何使用它。

/****** Rui Santos在http://randomn必威娱乐登录平台erdtutorials.com ********/TaskHandle_t Task1;TaskHandle_t Task2;// LED pinsconst int led1 = 2;const int led2 = 4;void setup() {Serial.begin(115200);PNMODE(LeD1,输出);pinMode(led2输出);//创建将在task1code()函数中执行的任务,优先级为1并在core 0上执行xTaskCreatePinnedToCore(Task1code,/ *函数的任务。* /“Task1”,/*任务名称。* / 10000,/*任务栈大小*/ NULL,/*任务的参数*/1,/*任务优先级*/ &任务1,/*任务句柄,跟踪创建的任务*/ 0);/*针任务到核心0*/延迟(500);//创建将在task2code()函数中执行的任务,优先级为1,并在核心1 XtaskCreatePonnedtoCore上执行(任务2代码,/ *函数的任务。*/“任务2”,/*任务名称。* / 10000,/*任务栈大小*/ NULL,/*任务的参数*/1,/*任务优先级*/ &任务2,/*任务处理以跟踪创建的任务*/1);/*针任务到核心1*/延迟(500);}//task1code:每1000 msvoid task1code(void*pvParameters)serial.print(“task1在核心上运行”)闪烁一个LED。serial.println(xportgetcoreid());(;;){digitalWrite (led1高);延迟(1000);digitalWrite(led1低);延迟(1000);}}//task2code:每700 msvoid task2code(void*pvParameters)serial.print(“task2在核心上运行”)闪烁一个LED。serial.println(xportgetcoreid());(;;){ digitalWrite(led2高);延迟(700);digitalWrite (led2低);延迟(700);} }无效循环(){ }

对于我的应用程序,我想让所有WiFi都与core0相关,更新显示由core1处理。您可以在我的GitHub库,这里是我添加的快照。

task1代码的快照

您可以或多或少地将while循环视为第二个主循环。通过将我的webserver handleClient()函数移动到Task1的循环中,每个客户端都由core0自动处理。对我来说有一些陷阱,然而。时间库可以自动更新时间,但它将使用core1。我可以通过非阻塞手动更新时间,延迟10秒并调用NTP请求函数。我还遇到了创建任务导致ESP32崩溃的问题,我可以使用vTaskDelay()函数来解决这个问题。这个问题也可能是由于在设置中没有更改堆栈的大小造成的。

我一直在缓慢而稳定地进步,包括使用我们的新时钟工作LuMini 8x8矩阵led我希望在不久的将来能够炫耀一下。但与此同时,您是否使用了两个核心来并行执行ESP32项目的任务?必威娱乐登录平台如果这是您第一次听说在您的ESP32上使用这两个核心,你认为它对什么有用?在下面的评论中告诉我们吧!


评论4评论

  • 我想试试这段代码!

  • 我在设计时钟代码时也有同样的想法:https://github.com/dwaq/super7seg/tree/master/firmware-esp32不幸的是,它仍然没有同步到亚秒级的精度。我想深入挖掘time()库,看看是否有我能做的事情,但是我需要用比Arduino IDE更好的东西来编写代码。

  • 我做了一个叫做TinyUPnP的Arduino包,它可以在任何路由器中自动打开端口,这在我做的一个示例中非常有用。非常感谢!

  • _t您能在单独的线程上运行阻塞操作吗?

相关的帖子

Enginwedginursday:破解童年记忆

一切都是封闭的…

烫伤

近期职位

春季清仓大甩卖正在进行!

工程日:制造商社区IRL

标签


所有标签