0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FreeRTOS+LVGL V8智能家居儀表盤(pán)設(shè)計(jì)

瑞薩MCU小百科 ? 來(lái)源:瑞薩MCU小百科 ? 2024-01-22 14:10 ? 次閱讀

野火啟明6M5開(kāi)發(fā)板制作了一個(gè)基于FreeRTOSLVGL V8的智能家居儀表盤(pán),顏值較高,也可以作為桌面擺件使用,具體特點(diǎn)如下:

采用SPI+DTC驅(qū)動(dòng)1.8寸SPI屏幕,超高幀率刷屏

采用LVGL V8界面庫(kù)繪制界面,有豐富控件、動(dòng)畫(huà)(FPS穩(wěn)定50以上?。?/p>

采用ESP8266聯(lián)網(wǎng),使用心知天氣API獲取當(dāng)前天氣并顯示到屏幕

采用ESP8266聯(lián)網(wǎng),通過(guò)MQTT協(xié)議連接到云服務(wù)器,上傳狀態(tài)數(shù)據(jù)

采用魯班貓2安裝EMQ作為MQTT服務(wù)器,接收啟明6M5上傳數(shù)據(jù)

采用Node-RED + Homeassistant接入家庭自動(dòng)化,與智能家居設(shè)備完美聯(lián)動(dòng)

dd593a4e-b8ec-11ee-8b88-92fbcf53809c.jpg

01

硬件平臺(tái)介紹

野火啟明6M5開(kāi)發(fā)板

使用野火啟明6M5開(kāi)發(fā)板來(lái)進(jìn)行開(kāi)發(fā),開(kāi)發(fā)板采用R7FA6M5BH3CFC作為主控芯片,有2MB Flash,2MB!!拿來(lái)開(kāi)發(fā)GUI時(shí)的可發(fā)揮空間很大,接口SD卡、以太網(wǎng)、PMOD、USB等等,接口很豐富,功能模塊有ESP8266、電容按鍵和實(shí)體按鍵等,功能十分的豐富。

dd5d0fac-b8ec-11ee-8b88-92fbcf53809c.png

外接模塊

由于開(kāi)發(fā)板板載的模塊已經(jīng)十分豐富,這里只外接了一個(gè)SPI屏幕和溫濕度傳感器模塊

采用1.8寸的液晶顯示屏,驅(qū)動(dòng)芯片為ST7735S,SPI接口。

溫濕度傳感器采用瑞薩的HS3003溫濕度傳感器,I2C接口。

外設(shè)使用情況

本次使用到了許多的外設(shè),其中有如下外設(shè)

串口4 (SCI_UART4) 作為調(diào)試串口使用

串口9 (SCI_UART9) 連接到ESP8266-AT模塊

SDHI連接到SD卡,提供文件系統(tǒng)的支持

AGT定時(shí)器為L(zhǎng)VGL提供計(jì)時(shí)器

RTC提供實(shí)時(shí)的時(shí)間 (需要安裝CR1220電池)

SPI+DTC來(lái)實(shí)現(xiàn)屏幕的驅(qū)動(dòng),SPI以最大速度50MHz運(yùn)行

TOUCH提供電容按鍵

I2C (SCI_I2C6) 連接到HS3003溫濕度傳感器

dd798e84-b8ec-11ee-8b88-92fbcf53809c.png

02

軟件設(shè)計(jì)方案

① 采用FreeRTOS作為本作品使用的RTOS

② 采用LVGL V8界面庫(kù)來(lái)進(jìn)行界面開(kāi)發(fā)

③ 采用letter-shell終端組件方便開(kāi)發(fā)調(diào)試

④ 采用easylogger日志組件方便調(diào)試

⑤ 采用cJSON組件配合來(lái)完成網(wǎng)絡(luò)數(shù)據(jù)包打包與解包

多線程

由于代碼較多,所以不作全面的介紹,只介紹幾個(gè)線程的任務(wù)內(nèi)容和軟件包的使用,文末有開(kāi)源鏈接,作品的代碼全部開(kāi)源,線程列表如下圖,下面依次介紹。

dd8a25aa-b8ec-11ee-8b88-92fbcf53809c.png

調(diào)試線程(debug_thread

該線程使用了letter-shell和easylogger軟件包,提供完整的終端操作支持,同時(shí)支持日志打印,例如打印esp8266線程的調(diào)試日志。

dd9d619c-b8ec-11ee-8b88-92fbcf53809c.png

使用自定義的命令來(lái)打印當(dāng)前運(yùn)行的任務(wù)列表

ddacccd6-b8ec-11ee-8b88-92fbcf53809c.png

ESP8266線程(esp8266_thread)

該線程使用AT指令,實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)連接Wi-Fi、自動(dòng)連接MQTT服務(wù)器、訂閱主題。當(dāng)收到消息隊(duì)列的數(shù)據(jù)后,更新溫濕度數(shù)據(jù)、LED狀態(tài),然后使用cJSON來(lái)打包為JSON數(shù)據(jù)包,發(fā)布到MQTT服務(wù)器的指定主題。當(dāng)收到MQTT發(fā)來(lái)的數(shù)據(jù)后,使用cJSON來(lái)解析JSON數(shù)據(jù)包,更新當(dāng)前天氣等。

(觸摸)按鍵、LED、RTC線程(misc_thread)

該線程使用了MultiButton軟件包,可以實(shí)現(xiàn)一個(gè)按鍵的單擊、雙擊、連擊、長(zhǎng)按等事件的處理,這里使用觸摸按鍵來(lái)搭配這個(gè)軟件包實(shí)現(xiàn)觸摸按鍵控制板載的LED亮滅,并且發(fā)送狀態(tài)信息到消息隊(duì)列中,交由ESP8266線程上傳到服務(wù)器端。

該線程同時(shí)也使用了RTC時(shí)鐘,每秒觸發(fā)一次中斷,發(fā)送當(dāng)前時(shí)間到消息隊(duì)列中,交由LCD線程來(lái)顯示當(dāng)前時(shí)間。

SD卡線程

該線程使用了Fatfs來(lái)掛載文件系統(tǒng),自動(dòng)將SD卡掛載到1: 分區(qū)下,提供給LVGL FS接口,實(shí)現(xiàn)LVGL加載SD卡中的文本、圖片等文件。

屏幕驅(qū)動(dòng)線程(lcd_thread)

屏幕驅(qū)動(dòng)使用硬件SPI+DTC的方案,這里沒(méi)有使用SCI上的SPI接口,因?yàn)楦鶕?jù)瑞薩6M5的文檔得知掛在SCI上的SPI最大時(shí)鐘頻率為25Mhz,而直接連接的SPI最大時(shí)鐘頻率為50Mhz,顯然使用直連SPI接口可以獲得更快的刷屏速度。

ddc7f420-b8ec-11ee-8b88-92fbcf53809c.pngdde77868-b8ec-11ee-8b88-92fbcf53809c.png

該線程會(huì)接收多個(gè)線程傳入的消息隊(duì)列:接收RTC時(shí)鐘中斷發(fā)來(lái)的消息隊(duì)列,在LVGL中注冊(cè)的timer callback函數(shù)中讀取后顯示到屏幕上,每秒刷新一次時(shí)間數(shù)據(jù);接收溫濕度線程發(fā)來(lái)的消息隊(duì)列,讀取后更新當(dāng)前屏幕上的溫濕度數(shù)值和進(jìn)度條控件。

溫濕度傳感器線程(sensor_thread)

該線程每隔十秒使用硬件I2C來(lái)讀取HS3003的數(shù)據(jù)并解算出溫濕度數(shù)據(jù),發(fā)送溫濕度數(shù)據(jù)到消息隊(duì)列中,交由ESP8266線程來(lái)上傳到服務(wù)器和LCD線程來(lái)顯示到屏幕。

LVGL移植、界面設(shè)計(jì)LVGL移植

在本作品中對(duì)LVGL的顯示接口和文件系統(tǒng)接口做了移植,下面對(duì)LVGL的顯示接口移植做介紹,LVGL的顯示接口只有三個(gè)函數(shù)需要修改,分別是緩沖區(qū)的初始化、屏幕的初始化和刷屏函數(shù)的接口,對(duì)于屏幕的初始化在lcd_thread中已經(jīng)完成過(guò),所以只需完成緩沖區(qū)的初始化和刷屏函數(shù)接口的適配。

為了實(shí)現(xiàn)更快的刷屏速度,使用官方提供的example2程序,并且給LVGL申請(qǐng)一個(gè)全屏緩沖區(qū),搭配SPI+DTC的全屏緩沖區(qū),需要更新屏幕上的數(shù)據(jù)時(shí)只需要搬運(yùn)數(shù)據(jù)即可。

上下滑動(dòng)查看完整內(nèi)容

左右滑動(dòng)即可查看完整代碼

#if 1


/*********************
 *   INCLUDES
 *********************/
#include "lv_port_disp.h"
#include 


/*********************
 *   DEFINES
 *********************/
#ifndef MY_DISP_HOR_RES
  #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen width, default value 320 is used for now.
  #define MY_DISP_HOR_RES  128
#endif


#ifndef MY_DISP_VER_RES
  #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen height, default value 240 is used for now.
  #define MY_DISP_VER_RES  160
#endif


/**********************
 *   TYPEDEFS
 **********************/


/**********************
 * STATIC PROTOTYPES
 **********************/
static void disp_init(void);


static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);


/**********************
 * STATIC VARIABLES
 **********************/


/**********************
 *   MACROS
 **********************/


/**********************
 *  GLOBAL FUNCTIONS
 **********************/


void lv_port_disp_init(void)
{
  /*-------------------------
   * Initialize your display
   * -----------------------*/
  disp_init();


  /*-----------------------------
   * Create a buffer for drawing
   *----------------------------*/


  /* Example for 2) */
  static lv_disp_draw_buf_t draw_buf_dsc_2;
  static lv_color_t buf_2_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];  
  lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, NULL, MY_DISP_HOR_RES * MY_DISP_VER_RES);  /*Initialize the display buffer*/


  /*-----------------------------------
   * Register the display in LVGL
   *----------------------------------*/


  static lv_disp_drv_t disp_drv;             /*Descriptor of a display driver*/
  lv_disp_drv_init(&disp_drv);          /*Basic initialization*/


  /*Set up the functions to access to your display*/


  /*Set the resolution of the display*/
  disp_drv.hor_res = MY_DISP_HOR_RES;
  disp_drv.ver_res = MY_DISP_VER_RES;


  /*Used to copy the buffer's content to the display*/
  disp_drv.flush_cb = disp_flush;


  /*Set a display buffer*/
  disp_drv.draw_buf = &draw_buf_dsc_2;


  /*Required for Example 3)*/
  //disp_drv.full_refresh = 1;


  /* Fill a memory array with a color if you have GPU.
   * Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.
   * But if you have a different GPU you can use with this callback.*/
  //disp_drv.gpu_fill_cb = gpu_fill;
 
  /*Finally register the driver*/
   lv_disp_drv_register(&disp_drv);
 }


/**********************
 *  STATIC FUNCTIONS
 **********************/


/*Initialize your display and the required peripherals.*/
static void disp_init(void)
{
  /*You code here*/
}


volatile bool disp_flush_enabled = true;


/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL
 */
void disp_enable_update(void)
{
  disp_flush_enabled = true;
}


/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL
 */
void disp_disable_update(void)
{
  disp_flush_enabled = false;
}


/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
extern uint8_t lcd_buff[160][128][2];
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
  if(disp_flush_enabled) {
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/


    int32_t x;
    int32_t y;
    for(y = area->y1; y <= area->y2; y++) {
      for(x = area->x1; x <= area->x2; x++) {
        /*Put a pixel to the display. For example:*/
        /*put_px(x, y, *color_p)*/
        lcd_buff[y][x][0] = color_p->full >> 8;
        lcd_buff[y][x][1] = color_p->full;
        color_p++;
      }
    }
  }


  /*IMPORTANT!!!
   *Inform the graphics library that you are ready with the flushing*/
  lv_disp_flush_ready(disp_drv);
}


#else /*Enable this file at the top*/


/*This dummy typedef exists purely to silence -Wpedantic.*/
typedef int keep_pedantic_happy;
#endif

對(duì)于刷屏函數(shù)的移植只需實(shí)現(xiàn)數(shù)據(jù)的搬運(yùn),代碼如下:

extern uint8_t lcd_buff[160][128][2];
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
  if(disp_flush_enabled) {
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/


    int32_t x;
    int32_t y;
    for(y = area->y1; y <= area->y2; y++) {
      for(x = area->x1; x <= area->x2; x++) {
        /*Put a pixel to the display. For example:*/
        /*put_px(x, y, *color_p)*/
        lcd_buff[y][x][0] = color_p->full >> 8;
        lcd_buff[y][x][1] = color_p->full;
        color_p++;
      }
    }
  }


  /*IMPORTANT!!!
   *Inform the graphics library that you are ready with the flushing*/
  lv_disp_flush_ready(disp_drv);
}

在lcd_thread線程的while循環(huán)中只需使用SPI發(fā)送全屏緩沖到屏幕,代碼如下:

void lcd_push_buff(void) {
  R_SPI_Write(spilcd_spi0.p_ctrl, lcd_buff, LCD_W * LCD_H * 2, SPI_BIT_WIDTH_8_BITS);
}
/* 下面是主函數(shù)調(diào)用 */
void lcd_thread_entry(void* pvParameters) {
  FSP_PARAMETER_NOT_USED(pvParameters);
  lcd_setup();


  while (1) {
    lcd_push_buff();
    lv_task_handler();
  }
}

界面設(shè)計(jì)與仿真

采用NXP的GUI Guider作為PC端的設(shè)計(jì)器和仿真器,GUI Guider可以在PC端完成一站式的LVGL界面設(shè)計(jì)與仿真,例如下圖所示:

de06ced4-b8ec-11ee-8b88-92fbcf53809c.png

在GUI Guider中對(duì)兩個(gè)頁(yè)面分別創(chuàng)建了一個(gè)定時(shí)器,并且實(shí)現(xiàn)了兩個(gè)回調(diào)函數(shù),代碼如下,通過(guò)這個(gè)定時(shí)器回調(diào)函數(shù)來(lái)實(shí)現(xiàn)周期性的刷新屏幕顯示的內(nèi)容,更新網(wǎng)絡(luò)連接狀態(tài)、當(dāng)前溫濕度、當(dāng)前時(shí)間、當(dāng)前天氣等數(shù)據(jù)。

左右滑動(dòng)即可查看完整代碼

void timer_main_reflash_cb(lv_timer_t *t)
{
  static uint32_t tick;
  lv_ui * gui = t->user_data;
#ifdef __ARMCC_VERSION
  float sensor_info[2];
  if (pdTRUE == xQueueReceive(g_sensor2lcd_queue, sensor_info, pdMS_TO_TICKS(0))) {
    lv_bar_set_value(gui->main_bar_humi, (uint32_t) sensor_info[0], LV_ANIM_ON);
    lv_bar_set_value(gui->main_bar_temp, (uint32_t) sensor_info[1], LV_ANIM_ON);
    lv_label_set_text_fmt(gui->main_label_humi, "%2d%%", (uint32_t) sensor_info[0]);
    lv_label_set_text_fmt(gui->main_label_temp, "%2d'C", (uint32_t) sensor_info[1]);
  }
  rtc_time_t get_time;
  if (pdTRUE == xQueueReceive(g_clock2lcd_queue, &get_time, pdMS_TO_TICKS(0))) {
    lv_label_set_text_fmt(gui->main_label_hour, "%02d", get_time.tm_hour);
    lv_label_set_text_fmt(gui->main_label_min, "%02d", get_time.tm_min);
    lv_label_set_text_fmt(gui->main_label_sec, "%02d", get_time.tm_sec);
  }
  uint32_t num = 0;
  if (pdTRUE == xQueueReceive(g_esp2lcd_queue, &num, pdMS_TO_TICKS(0))) {
    if (num > 38) {
      num = 99;
    }
    char path [30];
    sprintf(path, "1lvgl/weather/%d.jpg", num);
    lv_img_set_src(gui->main_img_weather, path);
  }
#endif
}


const char str_ch[][40] = {
  "連接WI-Fi...",
  "連接WI-Fi失敗!",
  "連接WI-Fi成功!",
  "連接MQTT服務(wù)器...",
  "連接MQTT服務(wù)器失敗",
  "訂閱MQTT主題...",
};


void timer_loading_reflash_cb(lv_timer_t *t)
{
  static uint32_t num = 0;
  lv_ui * gui = t->user_data;
#ifdef __ARMCC_VERSION
  if (pdTRUE == xQueueReceive(g_esp2lcd_queue, &num, pdMS_TO_TICKS(0))) {
    lv_label_set_text(gui->loading_tip, str_ch[num]);
    lv_bar_set_value(gui->loading_process, num * 20, LV_ANIM_ON);
    if (num >= 5) {
      setup_scr_main(gui);
      lv_scr_load(gui->main);
    }
  }
#else
  num += 3;
  lv_label_set_text(gui->loading_tip, str_ch[num / 20]);
  lv_bar_set_value(gui->loading_process, num, LV_ANIM_ON);
  if (num >= 100) {
    setup_scr_main(gui);
    lv_scr_load(gui->main);
  }
#endif
}

MQTT與服務(wù)器解析

使用ESP8266模塊連接到MQTT服務(wù)器,因?yàn)镸QTT也是自建的EMQX服務(wù)器,自由度相對(duì)onenet平臺(tái)要大很多,這里的上傳數(shù)據(jù)、下載數(shù)據(jù)都是統(tǒng)一由MQTT服務(wù)器搭配node-red來(lái)完成,避免來(lái)回地將ESP8266切換為透?jìng)髂J絹?lái)實(shí)現(xiàn)HTTP訪問(wèn),全由服務(wù)器來(lái)進(jìn)行數(shù)據(jù)的處理與打包,拖拽化開(kāi)發(fā)自定義的MQTT消息處理流程不香嗎?

例如上傳當(dāng)前溫濕度、LED狀態(tài)、知心天氣API獲得當(dāng)前的天氣數(shù)據(jù)的流程設(shè)置如下:

de1cebd8-b8ec-11ee-8b88-92fbcf53809c.png

服務(wù)器端解析溫濕度數(shù)據(jù)時(shí),上傳的數(shù)據(jù)包格式為 JSON 數(shù)據(jù),形如

{“hum”:51.498504638671872,”tem”:30.258193969726564}

為了解析MQTT的數(shù)據(jù)包,需要編寫(xiě)一段代碼來(lái)實(shí)現(xiàn)數(shù)據(jù)類型的限定,這里還加了保留到兩位小數(shù),其中的 “get humidity” 等函數(shù)只需編寫(xiě)如下一段JavaScript代碼,經(jīng)過(guò)解析后得到濕度數(shù)據(jù),傳入后面的 “is null ?” 節(jié)點(diǎn)后若不為空就更新數(shù)據(jù)給Homeassistant的設(shè)備。

var field = msg.payload.hum;
var out;


if (field == null) {
  out = { payload: null };
} else {
  if (typeof field === 'number') {
    if (Number(field) === Math.round(field)) {
      /* 整數(shù) */
      out = { payload: field };
    } else {
      /* 小數(shù) */
      out = { payload: field.toFixed(2) };
    }
  } else if (typeof field === 'boolean') {
    /* 布爾 */
    out = { payload: field };
  } else if (typeof field === 'string') {
    /* 字符串 */
    out = { payload: field };
  }
}
return out;

經(jīng)過(guò)HTTP訪問(wèn)知心天氣的API后,耶對(duì)得到的JSON結(jié)果進(jìn)行解析,消息形如:

{
  "results": [
    {
      "location": {
        "id": "WTW3SJ5ZBJUY",
        "name": "Shanghai",
        "country": "CN",
        "path": "Shanghai,Shanghai,China",
        "timezone": "Asia/Shanghai",
        "timezone_offset": "+08:00"
      },
      "now": {
        "text": "Cloudy",
        "code": "4",
        "temperature": "35"
      },
      "last_update": "2023-08-13T1214+08:00"
    }
  ]
}

解析代碼也非常簡(jiǎn)單,text為當(dāng)前的天氣文本,code為當(dāng)前的天氣代碼:

var text = msg.payload.results[0].now.text;
var code = msg.payload.results[0].now.code;


return { payload: code };

然后發(fā)送最終的天氣碼到主題 /test/esp8266/sub,這個(gè)主題是ESP8266已經(jīng)訂閱的,ESP8266線程完成數(shù)據(jù)的獲取,然后發(fā)送天氣碼到消息隊(duì)列,LCD讀取消息隊(duì)列,得到天氣碼,然后讀取SD卡中的天氣圖標(biāo),顯示到屏幕上,完成天氣圖標(biāo)的更新。

03

最終效果

聯(lián)網(wǎng)進(jìn)度顯示界面

開(kāi)機(jī)自動(dòng)聯(lián)網(wǎng)、進(jìn)度條提示,F(xiàn)PS最低50!這個(gè)瑞薩的MCU跑LVGL完全無(wú)壓力

de2f505c-b8ec-11ee-8b88-92fbcf53809c.gif

實(shí)時(shí)溫濕度、時(shí)間數(shù)據(jù)顯示?

de580330-b8ec-11ee-8b88-92fbcf53809c.gif

接入Homeassistant記錄溫濕度數(shù)據(jù)

通過(guò)node-red接入到HA作為一個(gè)設(shè)備顯示當(dāng)前的溫濕度數(shù)據(jù)和板載LED的狀態(tài)

de8be2c2-b8ec-11ee-8b88-92fbcf53809c.png

溫度數(shù)據(jù)的歷史曲線(開(kāi)了空調(diào)溫度是直線下降?。?/p>

de9db290-b8ec-11ee-8b88-92fbcf53809c.png

濕度數(shù)據(jù)的歷史曲線

deb4f3ec-b8ec-11ee-8b88-92fbcf53809c.png

天貓精靈獲取板載LED狀態(tài)

設(shè)置了單擊觸摸按鍵開(kāi)關(guān)LED2亮滅的邏輯操作,然后會(huì)自動(dòng)上傳這個(gè)LED2的開(kāi)關(guān)狀態(tài)到MQTT服務(wù)器上,通過(guò)node-red來(lái)上傳到Homeassistent,搭配巴法云平臺(tái)接入到語(yǔ)音助手,我用的是天貓精靈,可以通過(guò)語(yǔ)音助手獲取到當(dāng)前LED2的狀態(tài),當(dāng)然只是做一個(gè)演示,可以實(shí)現(xiàn)的自動(dòng)化智能家居當(dāng)然還有很多的玩法。

04

視頻展示

05

總結(jié)

本作品開(kāi)發(fā)過(guò)程中體會(huì)到了瑞薩的開(kāi)發(fā)軟件十分的易用,方便,也學(xué)習(xí)到了LVGL V8、MQTT服務(wù)器數(shù)據(jù)包的收發(fā),node-red橋接MQTT消息包到HA的知識(shí)。

完成以上所有的功能后Flash使用了1MB出頭(主要是GUI的資源文件),這個(gè)單片機(jī)是有2MB的Flash,界面開(kāi)發(fā)還有很大的發(fā)揮空間。

1.8寸的小屏比較小,可以換成更大的屏和增加觸摸,但是RA6M5沒(méi)有專門(mén)的屏幕驅(qū)動(dòng)外設(shè),如果要拓展成并口MCU屏或者RGB屏還是有點(diǎn)受限的。

使用到了如下第三方軟件包,除FatFs使用BSD外別的均為MIT開(kāi)源協(xié)議

CJSON

EasyLogger

FatFs

letter-shell

MultiButton

LVGL V8

FreeRTOS







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1706

    瀏覽量

    91581
  • 智能家居
    +關(guān)注

    關(guān)注

    1928

    文章

    9562

    瀏覽量

    185114
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62178
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    962

    瀏覽量

    45008
  • LVGL
    +關(guān)注

    關(guān)注

    1

    文章

    83

    瀏覽量

    2969

原文標(biāo)題:【瑞薩RA MCU創(chuàng)意氛圍賽】項(xiàng)目23——基于FreeRTOS+LVGL V8智能家居儀表盤(pán)

文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    原裝IC網(wǎng)基于瑞薩單片機(jī)的儀表盤(pán)(總線型)解決方案

    故障,已經(jīng)遠(yuǎn)不能滿足現(xiàn)代汽車中美觀精確度高的要求,于是數(shù)字式儀表盤(pán)應(yīng)運(yùn)而生。NEC電子正對(duì)中國(guó)汽車儀表市場(chǎng)開(kāi)發(fā)了CAN3+、V850e/Dx3等一系列高性能MCU,為汽車低、中、高端儀表盤(pán)
    發(fā)表于 02-26 14:48

    汽車儀表盤(pán)解決方案

    汽車儀表盤(pán)解決方案 TMS470PLF221RFPQ1 是 TI 基于 ARM7 內(nèi)核,專門(mén)用來(lái)開(kāi)發(fā)汽車儀表盤(pán)的一款 MCU,其內(nèi)帶6個(gè)步進(jìn)電機(jī)驅(qū)動(dòng)器,可以同時(shí)對(duì)六個(gè)儀表電機(jī)進(jìn)行細(xì)分控制,同時(shí)芯片上
    發(fā)表于 01-07 16:04

    虛擬儀表盤(pán)是未來(lái)的趨勢(shì)嗎?

    `昨天聽(tīng)了一場(chǎng)富士通半導(dǎo)體的虛擬儀表盤(pán)解決方案,曾經(jīng)高大上的虛擬儀表盤(pán)正在低成本、低設(shè)計(jì)難度地走入國(guó)產(chǎn)汽車的design in日程,據(jù)富士通的Speaker說(shuō)捷豹XJL和路虎攬勝就用很早用了他們
    發(fā)表于 09-25 09:43

    OBD車速和儀表盤(pán)車速的對(duì)應(yīng)?

    最近在做OBD類產(chǎn)品,根據(jù)國(guó)家標(biāo)準(zhǔn)儀表盤(pán)車速是高于實(shí)際車速的。請(qǐng)問(wèn)哪位有一般車廠的對(duì)應(yīng)關(guān)系?
    發(fā)表于 03-03 11:16

    基于labview汽車儀表盤(pán)的設(shè)計(jì)

    求利用labview軟件設(shè)計(jì)汽車儀表盤(pán)
    發(fā)表于 06-01 08:47

    汽車儀表盤(pán)MCU背后的故事

    隨著汽車電子技術(shù)的飛速發(fā)展,傳統(tǒng)的車用機(jī)械儀表盤(pán)已呈現(xiàn)出向數(shù)字儀表過(guò)度的趨勢(shì),與之對(duì)應(yīng)的全部功能顯示也將被渲染后的高清畫(huà)面所取代。而引起這一巨大變革的根源,卻是一個(gè)只有一元硬幣大小的集成電子芯片--圖形儀表盤(pán)MCU(圖形
    發(fā)表于 07-09 06:27

    汽車儀表盤(pán)MCU背后的故事

    隨著汽車電子技術(shù)的飛速發(fā)展,傳統(tǒng)的車用機(jī)械儀表盤(pán)已呈現(xiàn)出向數(shù)字儀表過(guò)度的趨勢(shì),與之對(duì)應(yīng)的全部功能顯示也將被渲染后的高清畫(huà)面所取代。而引起這一巨大變革的根源,卻是一個(gè)只有一元硬幣大小的集成電子芯片--圖形儀表盤(pán)MCU(圖形
    發(fā)表于 07-16 07:56

    一文淺析汽車儀表盤(pán)

      汽車儀表盤(pán)  汽車儀表盤(pán)是反映車輛各系統(tǒng)工作狀況的裝置。常見(jiàn)的有燃油指示燈、清洗液指示燈、電子油門(mén)指示燈、前后霧燈指示燈及報(bào)警燈?! 〔煌嚨?b class='flag-5'>儀表不盡相同。但是一般汽車的常規(guī)儀表
    發(fā)表于 08-31 06:27

    開(kāi)發(fā)汽車obd數(shù)字儀表盤(pán)的過(guò)程記錄

    各位客官老爺們大家好,這是我第一次申請(qǐng)公眾號(hào),也是第一次發(fā)文章,本著分享與求知的心態(tài),記錄一下自己開(kāi)發(fā)汽車obd數(shù)字儀表盤(pán)的過(guò)程,能對(duì)別人有一絲的幫助,那是最好不過(guò)的,如果沒(méi)有,也求拍磚與批評(píng)指導(dǎo)
    發(fā)表于 12-20 08:00

    集成TPMS功能的儀表盤(pán)設(shè)計(jì)方案解析

    本文為某電動(dòng)汽車的一款集成TPMS功能的儀表盤(pán)設(shè)計(jì)方案,該設(shè)計(jì)將TPMS接收器以子板的形式在儀表盤(pán)上實(shí)現(xiàn),降低了獨(dú)立安裝的成本和不便,同時(shí)可方便安裝和拆卸,以滿足不同電動(dòng)汽車配置的要求。根據(jù)TPMS
    發(fā)表于 11-20 15:34 ?0次下載
    集成TPMS功能的<b class='flag-5'>儀表盤(pán)</b>設(shè)計(jì)方案解析

    集成TPMS功能的電動(dòng)汽車儀表盤(pán)設(shè)計(jì)解析

    筆者為某電動(dòng)汽車設(shè)計(jì)了一款集成TPMS功能的儀表盤(pán),將TPMS接收器以子板的形式在儀表盤(pán)上實(shí)現(xiàn),降低了獨(dú)立安裝的成本和不便,同時(shí)可方便安裝和拆卸,以滿足不同電動(dòng)汽車配置的要求。根據(jù)TPMS、儀表盤(pán)
    發(fā)表于 11-21 10:57 ?2次下載
    集成TPMS功能的電動(dòng)汽車<b class='flag-5'>儀表盤(pán)</b>設(shè)計(jì)解析

    汽車儀表盤(pán)維修_汽車儀表盤(pán)可以修理嗎_汽車儀表盤(pán)維修多少錢(qián)

    汽車儀表盤(pán)是反映車輛各系統(tǒng)工作狀況的裝置。常見(jiàn)的有燃油指示燈、清洗液指示燈、電子油門(mén)指示燈、前后霧燈指示燈及報(bào)警燈。
    發(fā)表于 01-11 10:45 ?6.3w次閱讀

    用于儀表盤(pán)的電源解決方案

    用于儀表盤(pán)的TI模擬和電源解決方案
    的頭像 發(fā)表于 08-20 01:47 ?3777次閱讀

    設(shè)計(jì)全液晶儀表盤(pán)的介紹

    采用9S08LG32的汽車LCD儀表板設(shè)計(jì)全液晶儀表盤(pán)是指將傳統(tǒng)機(jī)械儀表盤(pán)替換成一整塊液晶屏幕向駕駛者展示車輛行駛信息的設(shè)備,取消了傳統(tǒng)的物理指針,全部通過(guò)電子屏幕展示。
    的頭像 發(fā)表于 07-02 08:08 ?3652次閱讀

    克服汽車儀表盤(pán)電源設(shè)計(jì)難題

    克服汽車儀表盤(pán)電源設(shè)計(jì)難題
    發(fā)表于 11-03 08:04 ?3次下載
    克服汽車<b class='flag-5'>儀表盤(pán)</b>電源設(shè)計(jì)難題