modify
This commit is contained in:
1 parent
8d3510c695
commit
b0b8196b11
1 file changed
+59
-79
@@ -1,112 +1,92 @@
|
|||||||
# 빛 추적 스마트 전력 제어 시스템
|
# 빛 추적 스마트 전력 제어 시스템
|
||||||
<!-- <img width="1840" height="777" alt="Image" src="https://github.com/user-attachments/assets/3232f946-62a0-4f54-866c-43c3ea1adb5a" /> -->
|
|
||||||
<!-- <img width="2308" height="685" alt="Image" src="https://github.com/user-attachments/assets/335bddba-67d5-42a7-bbe8-9c78f891ad86" /> -->
|
|
||||||
|
|
||||||
## 1. 프로젝트 개요
|
## 1. 프로젝트 개요
|
||||||
빛 추적 스마트 전력 제어 시스템은 빛 추적 태양패널로 발전 효율을 높이고 스마트 콘센트로 전력을 제어하는 IoT 기반 에너지 관리 프로젝트입니다.
|
본 프로젝트는 태양광 패널의 발전 효율을 향상시키고, 생성된 전력을 사용자 환경에 맞게 제어하기 위한 IoT 기반 통합 전력 관리 시스템이다.
|
||||||
|
|
||||||
기존 고정형 태양광 패널은 태양의 이동이나 주변 장애물에 따른 조도 변화에 대응하지 못해 발전 효율이 떨어집니다.
|
일반적인 고정형 태양광 패널은 태양의 위치 변화나 주변 환경에 따른 조도 차이를 반영하지 못해 효율 저하가 발생한다.
|
||||||
이를 해결하기 위해 CDS 센서 기반 태양광 추적 기능을 구현하는 한편, 효과적으로 에너지를 관리할 수 있도록 패널 관련 정보 실시간 서버 저장, 스마트 콘센트 제어, LCD 시각화 UI 기능을 포함하는 통합 에너지 관리 시스템을 구축했습니다.
|
이를 개선하기 위해 다수의 CDS 센서를 활용한 능동형 태양광 추적 구조를 설계하였고, 수집된 발전 정보를 서버에 저장하여 스마트 콘센트 제어 및 시각화까지 연계되는 시스템을 구현하였다.
|
||||||
|
|
||||||
|
본 시스템은 STM32–Raspberry Pi–Arduino로 구성된 분산 구조를 가지며, 각 장치는 Wi-Fi 및 Bluetooth 통신을 통해 유기적으로 동작한다.
|
||||||
|
|
||||||
|
|
||||||
### 전체 시스템 구성
|
## 2. 시스템 구성 및 역할
|
||||||
<!-- <img width="960" height="540" alt="Image" src="https://github.com/user-attachments/assets/43fa549c-5ee2-49ef-9705-b3aec7b91486" /> -->
|
|
||||||
|
|
||||||
- #### **STM32 Nucleo-F411RE**
|
- #### **STM32 Nucleo-F411RE**
|
||||||
- 8개의 CDS 센서 입력
|
- CDS 센서 8채널 입력을 통한 조도 측정
|
||||||
- 태양광 패널 자동 회전(스텝 모터)
|
- 조도 분포 분석 후 태양광 패널 방향 자동 조정
|
||||||
- 태양광 패널 전압 측정
|
- 태양광 패널 출력 전압 측정
|
||||||
- Wi-Fi(ESP 모듈)로 Raspberry Pi 서버에 데이터 송신
|
- ESP8266 기반 Wi-Fi 통신으로 서버에 데이터 전송
|
||||||
|
|
||||||
- #### **Raspberry Pi 5 (서버)**
|
- #### **Raspberry Pi 5**
|
||||||
- 소켓 서버(iot_server.c)
|
- 다중 클라이언트 소켓 서버 운영
|
||||||
- MariaDB 데이터 저장
|
- 센서 데이터 수신 및 MariaDB 저장
|
||||||
- Bluetooth로 Arduino와 데이터 송수신
|
- Bluetooth 통신을 통해 Arduino와 제어 명령 중계
|
||||||
|
- 시스템 전체 데이터 흐름 관리 허브 역할 수행
|
||||||
|
|
||||||
- #### **Arduino UNO**
|
- #### **Arduino UNO**
|
||||||
- 패널 방향 / 전압 / 콘센트 상태 LCD 출력
|
- 서버로부터 패널 상태 및 전압 정보 수신
|
||||||
- 사용자 콘센트 ON/OFF 제어(릴레이)
|
- LCD를 통한 실시간 상태 표시
|
||||||
- Bluetooth로 명령 수신
|
- 사용자 입력 기반 콘센트 ON/OFF 제어
|
||||||
|
- 릴레이 제어 결과를 서버로 피드백
|
||||||
|
|
||||||
|
|
||||||
### 🔗 통신 구조
|
## 3. 통신 구조
|
||||||
- STM32 ↔ **Wi-Fi** ↔ Raspberry Pi
|
- STM32 ↔ Raspberry Pi : Wi-Fi
|
||||||
- Arduino ↔ **Bluetooth** ↔ Raspberry Pi
|
- Arduino ↔ Raspberry Pi : Bluetooth
|
||||||
|
|
||||||
|
중앙 서버인 Raspberry Pi가 모든 데이터를 중계·관리하는 허브 구조로 설계되었다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. 주요 기능
|
## 4. 주요 기능
|
||||||
|
|
||||||
### 1) STM32 — 태양광 패널 자동 추적 및 센서 데이터 송신
|
### 1) 태양광 자동 추적
|
||||||
- 8개 CDS 센서로 빛의 강도 측정
|
- CDS 센서 간 조도 비교를 통해 최대 광량 방향 계산
|
||||||
- 가장 밝은 방향으로 패널 자동 회전
|
- 스텝 모터를 이용한 패널 회전 제어
|
||||||
- 태양광 패널 전압 측정
|
- 실시간 환경 변화에 따른 패널 각도 갱신
|
||||||
- Wi-Fi(ESP 모듈)로 Raspberry Pi에 실시간 정보 송신
|
|
||||||
<!-- <img width="960" height="540" alt="Image" src="https://github.com/user-attachments/assets/78693961-5826-4d20-9175-7829c63f153f" /> -->
|
|
||||||
|
|
||||||
### 2) Raspberry Pi 5 — IoT 서버 + 데이터베이스 저장
|
### 2) 서버 기반 데이터 처리
|
||||||
- **iot_server.c**
|
- 문자열 기반 센서 데이터 패킷 수신
|
||||||
- 멀티 클라이언트 소켓 연결
|
- 패킷 파싱 후 MariaDB에 실시간 저장
|
||||||
- ID/PW 기반 인증 처리
|
- 장치 ID 기반 메시지 라우팅 지원
|
||||||
- 메시지 라우팅 (ALLMSG, 특정 ID 전송)
|
|
||||||
|
|
||||||
- **sql_client.c**
|
|
||||||
- “[LT_STM_SQL]SENSOR@…” 패킷 파싱
|
|
||||||
- MariaDB(sensor 테이블)에 실시간 INSERT
|
|
||||||
|
|
||||||
- **bt_client.c**
|
|
||||||
- Bluetooth HC-06 모듈 사용
|
|
||||||
- Arduino에 명령 전달
|
|
||||||
- Arduino 상태 재수신하여 서버로 전달
|
|
||||||
<!-- <img width="960" height="540" alt="Image" src="https://github.com/user-attachments/assets/df6e9a35-0a65-4247-82fc-e0819f64ae56" /> -->
|
|
||||||
<!-- <img width="960" height="540" alt="Image" src="https://github.com/user-attachments/assets/64098ebe-fb36-40ef-9fb6-705e0fad388c" /> -->
|
|
||||||
|
|
||||||
### 3) Arduino UNO — LCD UI + 스마트 콘센트 제어
|
### 3) Arduino UNO — LCD UI + 스마트 콘센트 제어
|
||||||
- Raspberry Pi → Bluetooth로 데이터 수신
|
- 서버 명령에 따른 릴레이 제어
|
||||||
- LCD에 패널 방향, 전압, 콘센트 상태 출력
|
- 사용자 입력 이벤트를 서버로 전송
|
||||||
- 사용자 버튼 입력으로 콘센트 ON/OFF
|
- 패널 상태와 콘센트 상태를 LCD로 동시 출력
|
||||||
- 릴레이 제어 + 상태를 Raspberry Pi로 다시 송신
|
|
||||||
<!-- <img width="960" height="540" alt="Image" src="https://github.com/user-attachments/assets/0c44df98-3c01-47f0-9a35-7bc1c6404dd3" /> -->
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. 담당 역할
|
## 5. 담당 역할
|
||||||
|
|
||||||
### Raspberry Pi **IoT 서버 설계 및 구현 (iot_server 계열)**
|
### **IoT 서버 설계 및 구현**
|
||||||
|
|
||||||
#### ① STM32 ↔ ESP8266 Wi-Fi 통신 모듈 연동 개발
|
#### ① IoT 소켓 서버 설계 및 구현
|
||||||
- STM32와 ESP8266 간 UART 통신 제어
|
- 다중 클라이언트 접속을 고려한 TCP 서버 구현
|
||||||
- 서버(Raspberry Pi)와 실시간 센서 데이터 송신 구조 구현
|
- ID/PW 기반 클라이언트 인증 처리
|
||||||
- AT Command 기반 Wi-Fi 설정
|
- 장치별 메시지 분기 및 브로드캐스트 기능 구현
|
||||||
|
|
||||||
#### ② 센서 데이터 패킷 설계 및 송신 로직 구현
|
#### ② STM32 데이터 수신 및 DB 연동
|
||||||
- CDS 센서 값 / 태양광 패널 전압 데이터 패킷 포맷 정의
|
- 센서/전압 데이터 패킷 포맷 정의
|
||||||
- 서버 수신을 고려한 문자열 기반 패킷 구성
|
- 수신 문자열 파싱 로직 구현
|
||||||
- 데이터 손실 방지를 위한 송신 타이밍 및 포맷 안정화
|
- MariaDB 연동 및 실시간 INSERT 처리
|
||||||
|
|
||||||
#### ③ 서버 연동 테스트 및 통신 검증
|
|
||||||
- Raspberry Pi 소켓 서버와 ESP8266 TCP 통신 테스트
|
|
||||||
- 패킷 수신/DB 저장 여부 검증
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. 트러블슈팅
|
## 6. 트러블슈팅
|
||||||
### 1) **데이터 송신 중 스텝 모터 끊김 현상**
|
### 1) **Wi-Fi 통신 중 모터 제어 불안정**
|
||||||
- 원인: Wi-Fi 송신(ESP) 루틴이 블로킹으로 동작
|
- 문제: 통신 루틴이 블로킹 방식으로 동작하며 모터 회전이 끊김
|
||||||
- 해결: **TIM4 기반 논블로킹(non-blocking)방식 스텝 모터 제어 구조 구현**
|
- 해결: 타이머 인터럽트 기반 비동기 모터 제어 구조로 변경
|
||||||
- 결과: 모터 회전 안정성 확보
|
- 결과: 통신과 구동이 독립적으로 동작하며 안정성 확보
|
||||||
|
|
||||||
### 2) **스텝 모터 회전 시 전압 강하 → CDS 값 일시적 하락**
|
### 2) **모터 구동 시 센서 값 왜곡**
|
||||||
- 원인: 모터 구동 시 순간적인 전류 피크 → ADC 레일 변동
|
- 문제: 모터 동작 시 전류 피크로 ADC 기준 전압 변동 발생
|
||||||
- 해결: **모터 전원과 MCU/센서 전원을 완전 분리**
|
- 해결: 모터 전원과 MCU/센서 전원을 분리
|
||||||
- 결과: CDS 값 일시적 하락 현상 해결
|
- 결과: CDS 센서 값의 순간 하락 현상 제거
|
||||||
|
|
||||||
### 3) **LCD 잔상(ghosting) 발생**
|
### 3) **LCD 잔상 문제**
|
||||||
- 원인: 문자열 길이 변화로 이전 텍스트 일부가 남음
|
- 문제: 출력 문자열 길이 변화로 이전 데이터 일부 잔존
|
||||||
- 해결:
|
- 해결: 전체 clear 방식 제거
|
||||||
- `lcd.clear()` 반복 호출 지양
|
- 결과: 출력 품질 및 LCD 반응 속도 개선
|
||||||
- partial update 구조 도입 (변경된 라인만 업데이트)
|
|
||||||
- 공백 패딩으로 잔상 제거
|
|
||||||
- 결과: LCD 화면이 깨끗하게 유지되고 출력 속도 향상
|
|
||||||
|
|
||||||
---
|
---
|
||||||
Reference in new issue
Block a user