STM32, FreeRTOS를 기반으로 온습도 및 수위 데이터를 실시간 모니터링하고, 환경 변화에 따라 팬(Fan)과 펌프(Pump)를 자동 제어하여 최적의 환경을 조성하는 스마트팜 시스템 개발
- Main Controller (STM32): FreeRTOS 기반으로 센서 데이터 수집 및 액추에이터 제어 태스크 스케줄링
- Sensor: 온습도 센서(DHT11)와 물 수위 센서(ADC)를 통한 실시간 환경 데이터 수집
- Actuator: 온도에 따른 스텝모터(선풍기) 속도 제어, 수위에 따른 서보모터(물 펌프) 구동
- Monitoring: I2C LCD를 통한 데이터 시각화 및 RGB LED/Buzzer를 통한 직관적인 상태 알림
DHT11 센서를 통해 실내 환경 데이터를 정밀하게 수집하고, 상황에 맞춰 능동적으로 대처합니다.
- 정밀 데이터 수집: 센서로부터 40bit 데이터(16bit 온도 + 16bit 습도 + 8bit 체크섬)를 읽어오고, 이를 10진수로 변환하여 LCD 디스플레이에 실시간으로 표시합니다
- 자동 온도 조절: 온도가 30℃ 이상으로 상승하면 스텝모터(선풍기)의 회전 속도를 자동으로 증가시켜 쾌적한 환경을 유지합니다
물 수위 센서값을 분석하여 식물에 필요한 물을 자동으로 공급하거나 위험 상황을 알립니다.
- 지능형 급수: 수위 부족 감지 시 서보모터(펌프)가 작동하며, 부족한 정도에 따라 2회, 3회, 4회 등 횟수를 조절하여 최적의 급수를 수행합니다
- 만수 경고: 수위가 기준치 이상으로 높아져 넘칠 위험이 있을 경우, **부저(Buzzer)**를 울려 관리자에게 즉각 알림을 보냅니다
- RGB LED로 시스템 전체 상태 표시
- 🟢 정상: 수위 정상 및 온도 30℃ 미만
- 🟡 경계: 수위 낮음 또는 온도 30~32℃ 구간
- 🔴 경고: 수위 높음 또는 온도 33℃ 이상
- 안정적 멀티태스킹: 센서, LCD, 펌프, 팬 제어를 각각 독립적인 태스크로 분리하고 우선순위를 최적화하여, 특정 작업 부하로 인해 LCD가 갱신되지 않는 문제를 해결했습니다
FreeRTOS를 적용하여 각 기능을 독립적인 태스크로 분리하고 효율적인 멀티태스킹을 구현
- Task 분리:
WaterLevel,ServoBuzzer,DHT(온습도),LCD,StepMotor,RGB등으로 기능별 태스크 생성 - 우선순위 관리: 센서 데이터 처리와 모터 제어 등 중요도에 따라 태스크 Priority(우선순위)를 차등 부여하여 시스템 안정성 확보
- 시나리오: 온습도 센서(DHT11)에 열을 가해 온도가 30℃ 이상으로 상승
- 동작: 설정 온도를 초과하자 스텝모터(선풍기)가 회전을 시작하여 온도를 낮춤
1.mp4
- 시나리오: 물 수위 센서를 물에 담가 수위 변화를 감지
- 동작:
- 물 부족 시: 서보모터(펌프)가 작동하여 급수 시뮬레이션
- 만수 시: 부저(Buzzer)가 울리며 경고 알림 발생
_.2.mp4
| 구성 요소 | 역할 및 기술 |
|---|---|
| STM32F411RE | 메인 컨트롤러, ADC, PWM, Timer, GPIO, I2C 통신 제어 |
| FreeRTOS | 실시간 운영체제 적용, 태스크 스케줄링 및 자원 관리 |
| Sensors | DHT11(1-wire 통신 프로토콜), 물 수위 센서(ADC) 데이터 처리] |
| Actuators | 스텝모터(1-2상 여자 방식 제어), 서보모터(PWM Duty Cycle 제어) |
| Display | I2C 통신을 활용한 LCD 데이터 출력 및 커서 제어 |
[FreeRTOS 태스크 우선순위 문제]
- 현상: 온습도 센서의 값이 LCD에 업데이트되지 않고 멈추거나 동작하지 않는 현상 발생
- 원인:
DHT_Task의 우선순위(Priority)가 낮게 설정되어 있어, 다른 태스크에 밀려 센서 값을 제때 읽어오지 못함 - 해결: 센서 데이터 처리 태스크의 우선순위를
Normal로 상향 조정하여 정상 작동 확인. RTOS 환경에서 필수 작업의 실행 보장을 위한 우선순위 설계의 중요성을 체감했습니다.
[스텝모터 속도 제어 불안정 문제]
- 현상: 팬(선풍기) 역할로 스텝모터를 사용했으나, 속도 조절이 원활하지 않고 모터가 떨리거나 멈추는 현상 발생.
- 원인: 스텝모터는 정확한 각도 제어가 목적임에도 불구하고, 일반 DC 모터처럼 PWM(Duty Cycle)으로 단순 속도 제어를 시도함.
- 해결:
- 제어 방식 변경: PWM 제어가 아닌 **펄스 간 딜레이(Delay)**를 조절하는 주파수 기반 제어 방식을 도입.
- 한계 주파수 분석: 데이터시트를 통해
Idle Out-traction Frequency(정지 상태에서 기동 가능한 최대 주파수, 약 1000Hz)를 확인. 1000Hz 이상의 빠른 펄스를 주면 모터가 구동을 따라가지 못해 토크를 잃음을 파악. - 파라미터 최적화: 펄스 간 딜레이를 900μs(약 1111Hz) 근사치로 설정하여, 모터가 탈조 없이 낼 수 있는 최대 속도 구간을 찾아 적용.
- 배운 점: 스텝모터의 속도는 'PWM 비율'이 아닌 **'펄스 주기'**로 결정된다는 점을 명확히 이해했습니다. 또한, 단순 구현에 앞서 데이터시트의 주파수/토크 특성을 먼저 파악해야 진동과 토크 손실 없는 안정적인 제어가 가능하다는 것을 배웠습니다.
하드웨어 제어에 대한 이해:
스텝 모터의 데이터시트를 분석하여 주파수 한계(Idle In-traction Frequency)를 파악하고, 이를 코드의 딜레이 값(900us)에 반영함으로써 탈조 없이 최대 속도로 제어하는 최적화 과정을 경험했습니다.
시스템 통합 역량:
개별적으로 동작하는 센서와 모듈들을 FreeRTOS 환경에서 통합하고, 태스크 간의 간섭을 줄이며 유기적으로 동작시키는 임베디드 소프트웨어 구조를 설계하는 능력을 키웠습니다.