반응형
아래 테스트는 STM32CubeIDE 1.6.1/STM32Cube_FW_F7_V1.16.1를 사용하여 테스트 되었습니다.
이전 게시글에서 ADC1_IN18을 사용하여 칩 내부의 온도센서를 사용해 보았습니다.
2024.07.06 - [Hardware/STM32] - [STM32F746G-DISCO] 칩 내부 온도센서 사용하기
STemWin의 Graph widget을 사용하여 이 데이터를 디스플레이해 보겠습니다.
시뮬레이터에서는 온도 값을 읽어오지 못하므로 랜덤 값으로 시뮬레이션을 해 보았습니다.
구성은 GUIBuilder에서 WINDOW/GRAPH/TEXT 3개의 위젯으로 구성된 간단한 화면입니다.
온도 데이터가 업데이트시 우상단에 현재 측정된 온도 값을 표시하도록 하였습니다.
프로젝트의 메인 함수입니다.
static void _cbDialog(WM_MESSAGE * pMsg) {
WM_HWIN hItem;
// USER START (Optionally insert additional variables)
static GRAPH_SCALE_Handle hScale;
// USER END
switch (pMsg->MsgId) {
case WM_INIT_DIALOG:
//
// Initialization of 'Graph'
//
hItem = WM_GetDialogItem(pMsg->hWin, ID_GRAPH_0);
GRAPH_SetBorder(hItem, 60, 5, 5, 5);
hGraphData = GRAPH_DATA_YT_Create(GUI_RED, 400, NULL, 0);
GRAPH_AttachData(hItem, hGraphData);
hScale = GRAPH_SCALE_Create(55, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, 10);
GRAPH_SCALE_SetTextColor(hScale, GUI_BLACK);
GRAPH_SCALE_SetFactor(hScale, 1.0/scale_factor);
GRAPH_SCALE_SetFont(hScale, &GUI_Font16_ASCII);
GRAPH_SCALE_SetTickDist(hScale, 50);
GRAPH_AttachScale(hItem, hScale);
GRAPH_SetGridVis(hItem, 1);
GRAPH_SetLineStyleH(hItem, GUI_LS_DOT);
GRAPH_SetLineStyleV(hItem, GUI_LS_DOT);
GRAPH_SetUserDraw(hItem, _UserDraw);
WM_SetCallback(hItem, _cbGraph);
//
// Initialization of 'STM32F746G-Disovery ADC1 Temperature'
//
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
TEXT_SetFont(hItem, GUI_FONT_24B_ASCII);
TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FF0000));
TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
// USER START (Optionally insert additional code for further widget initialization)
// USER END
break;
// USER START (Optionally insert additional message handling)
// USER END
default:
WM_DefaultProc(pMsg);
break;
}
}
MainTask에서 ADC1_IN18으로 읽어들인 온도 데이터는 아래 함수를 사용하여 업데이트됩니다.
GRAPH_DATA_YT_AddValue(hData, (int)adc1_temp*(int)scale_factor);
Graph widget의 업데이트는 _UserDraw callback 함수를 등록하여 업데이트되도록 하였습니다.
static void _UserDraw(WM_HWIN hWin, int Stage) {
if (Stage == GRAPH_DRAW_LAST) {
char acText[] = "Temperature(C)";
char szbuf[10];
GUI_RECT Rect;
GUI_RECT RectInvalid;
int FontSizeY;
GUI_SetFont(&GUI_Font16B_ASCII);
FontSizeY = GUI_GetFontSizeY();
WM_GetInsideRect(&Rect);
WM_GetInvalidRect(hWin, &RectInvalid);
Rect.x0 = 7;
Rect.x1 = Rect.x0 + FontSizeY;
GUI_SetColor(GUI_RED);
GUI_DispStringInRectEx(acText, &Rect, GUI_TA_HCENTER, strlen(acText), GUI_ROTATE_CCW);
sprintf(szbuf, "%5.1f ('C)", adc1_temp);
GUI_SetFont(&GUI_Font24_ASCII);
FontSizeY = GUI_GetFontSizeY();
WM_GetInsideRect(&Rect);
WM_GetInvalidRect(hWin, &RectInvalid);
Rect.x0 = Rect.x1 - 130;
Rect.y0 = Rect.y0 + 15;
Rect.x1 = Rect.x0 + 100;
GUI_SetColor(GUI_YELLOW);
GUI_DispStringInRectEx(szbuf, &Rect, GUI_TA_RIGHT, strlen(szbuf), GUI_ROTATE_0);
}
}
자세한 내용은 emWin - User & Reference Guide 문서를 참고하였습니다.
아래는 동작영상입니다. (GIF로 변환했더니 화질이 많이 안 좋습니다.)
반응형
'Hardware > STM32' 카테고리의 다른 글
[STM32F746G-DISCO] USB 키보드로 사용하기 (Device Mode) (0) | 2024.07.15 |
---|---|
[STM32F746G-DISCO] USB 마우스로 사용하기 (Device Mode) (1) | 2024.07.15 |
[STM32F746G-DISCO] 칩 내부 온도센서 사용하기 (0) | 2024.07.14 |
[STM32F746G-DISCO] STemWin 사용하기 (Image widget) (0) | 2024.07.13 |
[STM32F746G-DISCO] STemWin 사용하기 (Button widget) (0) | 2024.07.13 |
댓글