STM32F103rb 보드와 SHT20 온습도 측정 모듈을 I2C로 통신하고, 통신하는 파형을 Logic Analyzer로 캡처했습니다. 추가로 온습도 측정 결과를 UART를 사용해 putty로 출력합니다.
개발 환경 구성부터, ioc(input/output configuration)에서 I2C 및 UART 설정, 파형을 Logic Analyzer로 찍는 것을 다룹니다.
제가 참고한 자료들의 링크를 첨부하니 참고하시길 바랍니다.
목차
- 하드웨어 및 개발 환경
- STM32CubeIDE 설정
- 회로 구성
- 결과
- 유의할 점
하드웨어 및 개발 환경
2025.02.18 - [Electrical Study] - STM Project 사용된 하드웨어 및 개발 환경
STM Project 사용된 하드웨어 및 개발 환경
개발 보드 : NUCLEO-F103RB (내돈내산)https://smartstore.naver.com/muwonkorea/products/10807059000?nl-query=stm32+nucleo-64&nl-ts-pid=iI2r6wqVN8oss6q76kGssssstUw-516721&NaPm=ct%3Dm732kqqo%7Cci%3Dd457cba2010db1ab1f95e32278f0c7d6b24d79ad%7Ctr%3Dsls%7C
semiconwide.tistory.com
STM32CubeIDE 설정
환경을 구성하면 맨 처음 [project 이름].ico에서 아래와 같은 화면이 나옵니다.
I2C를 사용해야 하므로 Connectivity → I2C1에서 아래와 같이 설정해 줍니다. 아무것도 건드리지 않은 default입니다.
온습도 측정 결과를 UART를 사용해 terminal로 보내 확인할 예정이므로 UART도 활성화해 줍니다.
저는 USART2를 아래와 같이 설정했습니다.
Ctrl + s를 눌러 코드를 생성하고,
또 Yes를 눌러줍니다.
코드 작성
main.c를 들어갑니다.
아래의 코드를 작성해 줍니다.
//line 23 ~
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */
// line 34 ~
/* USER CODE BEGIN PD */
#define SHT20_ADDR 0x80
#define TRIG_TEMP 0xE3
#define TRIG_HUMI 0xE5
/* USER CODE END PD */
Slave인 SHT20의 Address가 0x80인 이유는 아래의 데이터 시트에서 제공합니다.
온도와 습도의 Trigger가 각각 0xF3, 0xF5인 이유도 나와 있습니다.
// line 60 ~
/* USER CODE BEGIN PFP */
// SHT20에서 데이터 읽기
uint8_t read_sht20(uint8_t command, uint16_t *data)
{
uint8_t buf[3];
// 측정 명령 전송
if (HAL_I2C_Master_Transmit(&hi2c1, SHT20_ADDR, &command, 1, HAL_MAX_DELAY) != HAL_OK)
return 1;
HAL_Delay(85); // 측정 대기 (85ms)
// 데이터 수신
if (HAL_I2C_Master_Receive(&hi2c1, SHT20_ADDR, buf, 3, HAL_MAX_DELAY) != HAL_OK)
return 1;
*data = (buf[0] << 8) | buf[1];
*data &= ~0x0003; // 하위 2비트 제거 (오차 방지)
return 0;
}
// 온도 값 변환
float sht20_get_temperature()
{
uint16_t raw_temp;
if (read_sht20(TRIG_TEMP, &raw_temp) != 0)
return -999.0; // 에러 값
return -46.85 + 175.72 * ((float)raw_temp / 65536.0);
}
// 습도 값 변환
float sht20_get_humidity()
{
uint16_t raw_humi;
if (read_sht20(TRIG_HUMI, &raw_humi) != 0)
return -999.0; // 에러 값
return -6.0 + 125.0 * ((float)raw_humi / 65536.0);
}
// printf 리다이렉트 → UART로 출력
int _write(int file, char *ptr, int len)
{
HAL_UART_Transmit(&huart2, (uint8_t*)ptr, len, HAL_MAX_DELAY);
return len;
}
/* USER CODE END PFP */
main에서 SHT20을 찾는 여부부터 확인합니다.
// line 146 ~
/* USER CODE BEGIN 2 */
printf("SHT20 Sensor Initialized!\r\n");
if (HAL_I2C_IsDeviceReady(&hi2c1, SHT20_ADDR, 3, HAL_MAX_DELAY) != HAL_OK)
{
printf("❌ SHT20 Not Found! Check Wiring!\r\n");
}
else
{
printf("✅ SHT20 Detected!\r\n");
}
/* USER CODE END 2 */
while문 안에서 해당 코드를 무한 반복합니다.
// line 165 ~
/* USER CODE BEGIN 3 */
float temp = sht20_get_temperature();
float humi = sht20_get_humidity();
printf("Temperature: %.2f °C, Humidity: %.2f %%RH\r\n", temp, humi);
HAL_Delay(10000); // 10초마다 측정
/* USER CODE END 3 */
UART를 통해 온습도 결과를 putty에 출력하기 위해 printf 설정을 해줘야 합니다.
Project name에 우클릭해서 Properties를 들어갑니다.
아래 사진처럼 세팅해 줍니다.
회로 구성
산 구성품들은 위의 하드웨어 및 개발 환경에 모두 있습니다.
브레드 보드에 배선을 다음과 같이 연결했습니다.
사용 툴은 다음과 같습니다.
https://softfamous.com/fritzing/
Fritzing - Soft Famous
The tough part of an engineer or an artist is developing a project on a sheet of paper. Fritzing eases the work of these professionals by developing a PCB for project implementation. Showcases the PCBs The main interface the application
softfamous.com
무료 버전은 자꾸 꺼져서 저장 자주 하시는 것을 추천드립니다. (전 3번 꺼졌습니다)
VCC(3.3V) : 빨간색
GND : 초록색
SDA : 주황색
SCL : 노란색
사용된 저항은 pull up 용으로 10k 옴이며, 데이터 시트에서 요구한 값입니다.
아까 ioc에서 I2C는 PB7이 SDA, PB6이 SCL입니다.
이는 datasheet에서 확인할 수 있으며 이를 따라 브래드 보드를 구성했습니다.
실행 및 결과
Project에 우클릭한 후 Build_Project를 해줍니다.
Build란 소스 코드를 실행 가능한 바이너리 파일로 변환하는 것입니다.
그리고 아래의 Run을 클릭해 줍니다.
아래 사진과 같은 창이 나타나는데 따라서해 줍니다.
UART를 이용한 Serial 통신이니 Baud Rate를 확인해 줍니다.
장치관리자에 들어가서 STM32가 어떤 포트와 연결되어 있는지 확인하고,
Putty를 켜서 해당 포트와 Speed(Baud Rate)를 설정해 줍니다.
유의할 점
SHT20의 datasheet와의 차이
아래의 define은 hold master에 대한 것입니다.
#define TRIG_TEMP 0xE3
#define TRIG_HUMI 0xE5
그리고 hold master protocol은 다음과 같습니다.
먼저 Start → I2C address(0x40) + write(0) → ACK → Command → ACK → START인데
파형 사진에서는 tart → I2C address(0x40) + write(0) → ACK → Command → ACK → STOP → START입니다.
이는 STM library 중 HAL_I2C_Master_Transmit에서 STOP이 있기 때문이며, ReStart 시 Stop이 있기 때문입니다.
2025/03/17 ver 0
2025/03/20 ver 1, 설명 추가 밑 cmd F → E 변경
'Electrical Study' 카테고리의 다른 글
한 장으로 정리하는 CPU 동작 (0) | 2025.04.17 |
---|---|
STM32CubeIDE로 UART 파형 관측 및 Protocol 파악하기 (0) | 2025.03.14 |
STM32CubeIDE로 UART Interrupt Debugging 하기 (4) | 2025.02.26 |
STM32CubeIDE에서 PWM 설정하고 출력하기 (0) | 2025.02.24 |
STM32CubeIDE에서 RTC 설정하고 UART와 printrf로 출력하기 (2) | 2025.02.21 |