1. 더블클릭 오류 해결
- 1번 int 일어나면 gap을 두도록(0.2초정도)
=> 0.2초 내에 신호가 들어오면 그 신호는 무시하도록 - m_button_before_time = HAL_GetTick(); 추가
( 이때 200으로 수정 )


2. on 스위치 키면 led 켜지도록
- PB12_START-SW-PIN를 gpio input으로
- buttonController.c에서 getSwState 함수 생성(이때, 헤더파일엔 controlType.h include)
- 이 함수는 TIM3에서 온도 정보를 읽어올 때 호출되도록 (사진3처럼)







3. fix 스위치를 누르면 화면이 깜빡이도록
- 사진1~4처럼 소스코드 작성 후 defines.h에 #define TOGGLE_TIME 10000 지정




- 계속 깜빡이기때문에 4번정도만 깜빡이도록 사진1처럼 작성 후 헤더파일에도 함수 원형 추가
- 사진2처럼 주석처리 후 startToggle();로 대체
- 이때, oledController.c에서 static uint8_t m_toggle_count = 0; 선언
- 실행하면 m_toggle_count의 overflow 발생하므로 사진3처럼 수정



- m_toggle_count가 1 감소한 상태에서 바로 다시 스위치가 더블클릭이 되면 startToggle이 호출되어서 계속해서 껌뻑이는 버그가 발생 가능하므로 사진1처럼 수정
- printDefault함수가 처음 킬 때만 동작하도록 하기 위해 사진2처럼 함수 추가
- 사진3처럼 함수 추가 후 heaterController.h include시키기



4. 현재 동작상태를 oled에 표현하는 코드
- oledController.h에 "controlType.h" include
- 사진1처럼 함수 추가 후 해당 파일에서 내부적으로 쓰기 위해 void printTemperNoUpdate(int temper); 선언
- 일단은 잘 작동하는지 확인하기 위해 사진3처럼 소스코드 작성



- 추가로, oled 초기화면에 00.0도가 아닌 우리가 디폴트로 설정한 온도가 뜨도록 사진1처럼 작성
- 히터를 끄고 킬 때 led도 껐다켜지고 oled에도 표시되도록 설정
(이때, #include "ledController.h"해주기)


cf. 온도 가져오는데 시간이 너무 오래걸려서 아래사진과 같이 소스코드 수정

5. 스위치 on/off 제어
- 스위치를 켰을 때만 온도가 낮을 때 히터가 돌아가도록 설정
- 만약 히터가 돌아가고 있다가 내가 그냥 스위치를 끄는 경우 히터가 동작 하지 않도록

6. 히터 제어
ex) 만약 30도로 설정했는데 보니까 40도까지 올라간 상황을 방지하기위해 미리 끄도록 설정
- 히터가 켜져있는 상태일 때, 현재 온도가 목표 온도와의 차이가 5도 이하일 때 히터를 끄도록
- 그 이외엔 히터를 키도록

7. 최종 결과
- 처음 디폴트 설정 온도인 25도가 화면에 출력이 되고 히터상자 내부에 온도센서를 넣어놔서 실시간 내부 온도를 측정하여 fnd 모듈에 표시한다
- start switch를 통해 히터 동작을 on시키고 oled에 온도 초기 설정화면이 뜨면 up/down/fix 스위치를 통해 원하는 히터 내부 온도를 설정한다
- 오차범위 ±2~3도 정도로 내가 원하는 온도를 설정하고 fix 스위치를 누르면 현재 내부온도와 목표 온도의 차이를 측정하여 릴레이의 동작을 on/off 시킨다
- 만약 목표 온도와 현재 내부온도의 차이가 오차범위를 벗어나는 경우 릴레이를 동작시켜 드라이기를 키도록 제어한다
- 예를 들어, 현재 내부온도가 30도인 상황에서 목표 온도를 35도로 설정할 경우 현재 측정되는 내부온도가 목표 온도와의 차이가 3 이하가 되기 전까지 드라이기를 계속해서 동작시킨다. 이때 oled의 화면에도 현재 동작중임을 알리는 "on"이 표시가 된다
- 만약 목표 온도와의 오차범위 내에 속하게 되면 릴레이의 switching이 동작하여 드라이기가 꺼지고 히터상자 내부의 온도도 점점 내려가게 되어 내부온도를 측정하는 온도센서의 온도도 내려가는 것을 fnd를 통해 관측할 수 있다.
- 그러다가 목표 온도와 현재 내부온도와의 차이가 3 이상이 되면, 다시 내부온도를 목표 온도로 조절하기 위해 드라이기의 동작이 on이 되고 다시 목표 온도가 될 때까지 드라이기를 제어한다
- 계속해서 현 내부온도와 목표 온도의 차이를 측정하고 이를 fnd를 통해 관측하며 히터 상자 내부 온도가 내가 원하는 목표 온도가 유지될 수 있도록 동작된다.
'임베디드' 카테고리의 다른 글
[오제이 튜브의 임베디드 강의] 37강. 보드 완성까지 딱 두걸음! (0) | 2025.02.20 |
---|---|
[오제이 튜브의 임베디드 강의] 36강. 전부 합체! 완전체 보드 만들기! (0) | 2025.02.19 |
[오제이 튜브의 임베디드 강의] 35강. 내 로고는 내가 만든다! (0) | 2025.02.14 |
[오제이 튜브의 임베디드 강의] 34강. I2C로 OLED를 제어해보자. (0) | 2025.02.14 |
[오제이 튜브의 임베디드 강의] 33강. 이제는 쉬워진 I2C 통신 (0) | 2025.02.14 |