这章主要优化上章的例子,采用freertos处理
1:硬件及环境
arduino2.3.8
ESP32-S3-DevKitC-1( WROOM N16R8 模组)
MLX90640 BAB
dht20 (用于修正MLX的自带的温差计算值)
LCD2.4inch(TTF_st7789_240*320)
freertos
GPIO 跟上章一样,不需要任何改动
1:上代码
ino代码
cpp
#include <freertos/FreeRTOS.h>
#include <freertos/semphr.h>
#include <freertos/task.h>
#include <queue.h>
#include "ShareHead.h"
#include "LCDST7789.h"
#include "Mlx90640.h"
#include "DHT20.h"
#include "Buttonisr.h"
#include "FSlog.h"
#include "esp_heap_caps.h"
volatile bool isRecording =false;
bool GetRecordStatus() {return isRecording;}
#define QUEUE_SIZE 5
QueueHandle_t xQueue; // 定义消息队列
StaticQueue_t xStaticQueue;
void *ptr =NULL;
void createQueueMemory(){
size_t buf_size = sizeof(QueueInfoStr)*QUEUE_SIZE; // 1MB
ptr = heap_caps_aligned_alloc(4, buf_size, MALLOC_CAP_SPIRAM);
if(ptr){
xQueue = xQueueCreateStatic(
QUEUE_SIZE,
sizeof(QueueInfoStr),
(uint8_t*)ptr,
&xStaticQueue);
if(!xQueue){
Serial.println("xQueueCreateStatic fail");
}
}else{
Serial.println("heap_caps_aligned_alloc fail");
}
// uint8_t *dma_buffer = (uint8_t*)heap_caps_aligned_alloc(
// 16,
// BUFFER_SIZE,
// MALLOC_CAP_SPIRAM | MALLOC_CAP_32BIT | MALLOC_CAP_DMA
// );
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
createQueueMemory();
//为5,每个数据项的大小为sizeof(int)
// xQueueCreate(QUEUE_SIZE, sizeof(QueueInfoStr)); // 创建消息队列)
Serial.println("setup");
/////////////////////////////////////////////////////
xTaskCreatePinnedToCore(taskMlx, "Mlx_Task", 1024*8, NULL, 1, NULL,0);
// 创建电机控制任务,绑定到核心1,高优先级
// xTaskCreatePinnedToCore(
// motor_control_task, // 参数1:任务函数指针
// "MotorCtrl", // 参数2:任务名字符串
// 3072, // 参数3:d:\code\Arduino_code\st7789\mlx_lcd_rtos\mlx_lcd_rtos\ShareHead.h栈深度(单位:字)
// (void*)&motor_cfg, // 参数4:传递给任务函数的参数
// 12, // 参数5:任务优先级
// &motor_control_task_handle, // 参数6:任务句柄指针
// 1 // 参数7:指定核心编号(1)
// );
///////////////////////////////////////////////////
xTaskCreatePinnedToCore(taskLog, "Log_Task", 1024*8, NULL, 1, NULL,1);
}
void loop() {
// put your main code here, to run repeatedly:
}
// 任务1:
void taskMlx(void *pvParameters)
{
dht_setup();
lcd_setup();
mlx90640_setup();
float curtemp =0.0f;
float curVdd=0.0f;
QueueInfoStr queueinfo;
queueinfo.Ta =0.0f;
long curtime =0;
float* pmlx90640data = NULL;
while(1)
{
curtime =millis();
curtemp= dth_get_temp(curtime);
curVdd = mlx90640_loop(curtemp);
pmlx90640data = getml90640data();
lcd_loop(pmlx90640data,curVdd,curtemp);
if(GetRecordStatus())
{
// 发送数据到队列
memcpy(queueinfo.mlx90640data,pmlx90640data,sizeof(float)*VAILD_MLX_DATA_LEN);
queueinfo.Vdd = curVdd;
queueinfo.Tcur = curtemp;
if (xQueueSend(xQueue, &queueinfo, pdMS_TO_TICKS(200)) != pdPASS)
{
// 处理发送失败的情况
Serial.print("xQueueSend fail\n");
}
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}
// 任务1:
void taskLog(void *pvParameters)
{
button_setup();
fs_setup();
bool bRecording = false;
QueueInfoStr queueinfo;
while(1)
{
bRecording = is_recording();
if(bRecording != isRecording){
isRecording = bRecording;
Serial.print("isRecording");
Serial.println(isRecording);
fs_loop(bRecording);
}
handleSerialCommands();
if(bRecording)
{
// 从队列接收数据 //pdMS_TO_TICKS(100)portMAX_DELAY
if (xQueueReceive(xQueue, &queueinfo,pdMS_TO_TICKS(100) ) == pdPASS) {
// 处理接收到的数据
fs_processData(&queueinfo);
}
}
vTaskDelay(pdMS_TO_TICKS(50));
}
}
/////////////////////////////////////////////////////////////////////
项目文件如下

2:测试结果

3:如果觉得有用,麻烦点个赞,加个收藏
工程代码 下载地址
解码密码:123