一、項目名稱:
基于STM32F746-DISO的車內環(huán)境狀態(tài)控制顯示儀表盤。
二、項目概述:
本項目主要是基于STM32F746高性能MCU的STM32F746-DISC開發(fā)板,實現(xiàn)車內溫濕度監(jiān)測。以及控制車內燈光。STM32F746-DISC板載4.3寸電容觸摸LCD,使用LCD顯示GUI畫面是基于ST的GUI設計器TouchGFX設計,并且使用FreeRTOS嵌入式操作系統(tǒng)內核進行任務調度。做這個項目主要是為了方便車內乘客了解車內環(huán)境狀況,以及方便乘客對車內一些無關駕駛方面的控制。目前車內屏幕控制和顯示都在司機前面板,對于后排乘客操作任何東西都需要經(jīng)過司機來處理,非常不方便。這個項目設備可以放在后排,方便后面乘客,既減輕了司機壓力又方便了乘客坐車體驗。
通過本設備可以查看車內溫濕度,就可以調整車內空調溫度高低。還可以控制車上照明燈,方便晚上坐車時,給后面乘客車頂照明。還有座椅下方照明。
三、整體設計方案
3.1、硬件方案
整體使用STM32F746-diso開發(fā)板,利用板載觸摸lcd作為顯示和界面操控。外擴有溫濕度傳感器,IO輸出和彩燈控制等等。
整體框圖如下:
下面是設計的擴展板:利用板上ARDUINO接口,直接插在板子上。使用I2C接口的溫濕度傳感器SHTC3,以及燈光控制部分。
如下圖所示:
實物如下:
電路圖如下:
整體硬件如下:
3.2、軟件驅動
下面是溫濕度傳感器驅動程序部分。
int SHTC3_CalcTemperature(uint16_t rawValue)
{
// calculate temperature
// T = -45 + 175 * rawValue / 2^16
return (((175*1 * rawValue)>>16) - 45*1); //放大100倍
}
int SHTC3_CalcHumidity(uint16_t rawValue)
{
// calculate relative humidity
// RH = rawValue / 2^16 * 100
return ((100 * 1 * rawValue)>>16); //放大100倍
}
static uint8_t SHTC3_CheckCRC(uint8_t *buff, uint32_t nbyte)
{
uint32_t i; // byte counter
uint8_t bit; // bit mask
uint8_t crc = 0xFF; // calculated checksum
// calculates 8-Bit checksum with given polynomial
for(i = 0; i < nbyte; i++)
{
crc ^= (buff[i]);
for(bit = 8; bit > 0; --bit)
{
if(crc & 0x80) {
crc = (crc << 1) ^ SHTC3_CRC_POLYNOMIAL;
} else {
crc = (crc << 1);
}
}
}
return crc;
}
uint16_t shtc3_id;
uint16_t SHTC3_Init(void)
{
uint8_t buff[4]={0};
shtc3_id = 0;
shtc3_gpio_init();
HAL_Delay(1);
SHTC3_ReadData(SHTC3_REG_ID,buff,3);
if(buff[2] != SHTC3_CheckCRC(buff,2))
{
return -1;
}
HAL_Delay(10);
SHTC3_WriteCmd(SHTC3_REG_WAKEUP);
shtc3_id = (buff[0]<<8)|buff[1];
return shtc3_id;
}
uint8_t SHTC3_GetMode1_TempRH(int *temp, int *humi)
{
uint8_t buff[8]={0};
SHTC3_ReadData(SHTC3_REG_CELPM_TEMP_RH,buff,6);
if((buff[2] != SHTC3_CheckCRC(buff,2))||(buff[5] != SHTC3_CheckCRC(&buff[3],2)))
{
return 1;
}
*temp = SHTC3_CalcTemperature((buff[0]<<8)|buff[1]);
*humi = SHTC3_CalcHumidity((buff[3]<<8)|buff[4]);
return 0;
}
復制代碼
界面實時時間顯示驅動,RTC使用ST的HAL庫API獲取。
HAL_RTC_GetTime(&hrtc,&GetTime,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&GetDate,RTC_FORMAT_BIN);
Hours = GetTime.Hours;
Minutes = GetTime.Minutes;
Seconds = GetTime.Seconds;
Years = GetDate.Year;
Months = GetDate.Month;
Days = GetDate.Date;
Weeks = GetDate.WeekDay;
xprintf("%d-%d-%d %d rn",Years,Months,Days,Weeks);
xprintf("%d:%d:%d rn",Hours,Minutes,Seconds);
復制代碼
使用RTC有點要注意的地方就是HAL_RTC_GetTime()和HAL_RTC_GetDate()都要調用,而且要先調用HAL_RTC_GetTime(),再調用HAL_RTC_GetDate()。
開始沒注意,導致RTC時鐘不動。下面是我找到原因
所有GUI使用ST的TouchGFX 4.23軟件設計。
四、作品實物圖及演示視頻展示
演示視頻
https://www.bilibili.com/video/BV1f94y1K7vv/