arduino_mlx90640_lcd_dht20_freertos

这章主要优化上章的例子,采用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

相关推荐
吃米饭9 小时前
HC32L021C8UB 移植 FreeRTOS
stm32·嵌入式·freertos·rtos
嵌入式Q1 天前
FreeRTOS源码解析(4)任务状态查询
stm32·单片机·freertos
危桥带雨1 天前
Freertos——使用队列集优化数据传输
stm32·单片机·嵌入式硬件·freertos
济6172 天前
FreeRTOS 控制任务设计 (3)--- 闭环控制验证:仿真电机模型与软反馈实现
嵌入式·freertos
青鱼296 天前
时间片在FreeRTOS中的含义解析
freertos·时间片轮转
济6176 天前
FreeRTOS 控制任务设计 (2)--- 运动学逆解 + PID 闭环 + PWM 驱动全流程实现
stm32·单片机·嵌入式·freertos
济6177 天前
FreeRTOS 控制任务设计 (1)--- 双模式闭环控制:IDLE/RUN 状态机与任务通知机制
stm32·单片机·嵌入式·freertos
W.W.H.10 天前
FreeRTOS移植(保姆级教程)
经验分享·单片机·操作系统·freertos·rtos
波特率11520014 天前
FreeRTOS当中的Mail Queue使用教程(CMSIS_v1)
单片机·操作系统·freertos