Hanibi๋ AIoT ๊ธฐ๋ฐ ๋ฐ๋ ค ๋ฏธ์๋ฌผ ์์๋ฌผ ์ฒ๋ฆฌ๊ธฐ๋ก, ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งยท๋ถ์ํ์ฌ ์ ์ทจ๋ฅผ ์๋ฐฉํ๋ ์ค๋งํธ ๋๋ฐ์ด์ค์ ๋๋ค. ํ๋์จ์ด(Arduino ๊ธฐ๋ฐ ์ผ์ ์์คํ ), ๋ฐฑ์๋(NestJS ๊ธฐ๋ฐ ์๋ฒ), ํด๋ผ์ด์ธํธ(React Native ๋ชจ๋ฐ์ผ ์ฑ)๋ก ๊ตฌ์ฑ๋ ํตํฉ ์๋ฃจ์ ์ ๋๋ค.
- ํต์ฌ ํค์๋: AIoT, ์์๋ฌผ ์ฒ๋ฆฌ๊ธฐ, ์ ์ทจ ์๋ฐฉ, ์ค์๊ฐ ๋ชจ๋ํฐ๋ง, ๊ฐ์ฑ ๋์์ธ
- ๊ธฐ์ ์์ญ: ์๋ฒ ๋๋ ์์คํ , ๋ฐฑ์๋ API, ๋ชจ๋ฐ์ผ ์ฑ
- ํต์ ๋ฐฉ์: RS485, Ethernet, WebSocket, REST API
์์๋ฌผ ์ฐ๋ ๊ธฐ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์ ์ทจ๋ ์ฃผ๋ก ๊ณผํฌ์ ์ด๋ ์ฐ์ฑ ์์๋ฌผ๋ก ์ธํ pH ์ ํ, ํ๊ธฐ์ฑ ๋ฏธ์๋ฌผ์ ์ฐ์ธ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ํ๊ฒฝ์์ ์๋ชจ๋์, ํฉํํฉ๋ฌผ, TVOC(Total Volatile Organic Compounds)๊ฐ ์์ฑ๋๋ฉฐ ์ ์ทจ์ ์์ธ์ด ๋ฉ๋๋ค.
Hanibi๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ฌํ ๋์์ด ์๋ ์๋ฐฉ ์ค์ฌ์ผ๋ก ์ ๊ทผํฉ๋๋ค. ์จ๋, ์ต๋, VOC, ๋ฌด๊ฒ ์ผ์๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ๋ฏธ์๋ฌผ ์ํ๋ฅผ ์ ์ํํ๊ณ , ์ด์ ์งํ๋ฅผ ์กฐ๊ธฐ ํ๋จํ์ฌ ๋ฏธ์๋ฌผ ์ํ๋ฅผ ์์ ํํจ์ผ๋ก์จ ์ ์ทจ๋ฅผ ์์ฒ์ ์ผ๋ก ์ฐจ๋จํฉ๋๋ค.
๋ํ ๋จ์ํ ๊ธฐ๋ฅ์ฑ ๋๋ฐ์ด์ค๋ฅผ ๋์ด ๊ฐ์ฑ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. LED ํ์ ๊ณผ ์ ๋๋ฉ์ด์ ์ ํตํด ๊ฐ์ ์ ํํํ๋ ๋์คํ๋ ์ด UI๋ฅผ ๊ตฌํํ๊ณ , ์์ธํ ๊ธฐ๋ฐ์ ๊ฐ์ฑ ๋์์ธ์ ํตํด ์ฌ์ฉ์์์ ์น๋ฐ๊ฐ์ ๋์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ์ ํ๋ ์ ๋น์ฉ ์ ๊ฐ๊ณผ ํจ๊ป ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
- ์ผ์ ๊ธฐ๋ฐ ์กฐ๊ธฐ ํ์ง ๋ฐ ์ด์ ์งํ ํ๋จ
- ์ค์๊ฐ ๋ชจ๋ํฐ๋ง์ ํตํ ์๋ ์ ์ด ๋ฐ ์๋ฆผ
- ๋ฏธ์๋ฌผ ์ํ ์์ ํ๋ฅผ ํตํ ์ ์ทจ ์์ฒ ์ฐจ๋จ
- ํ๋์จ์ด(Arduino) โ ๋ฐฑ์๋(์๋ฒ) โ ํด๋ผ์ด์ธํธ(๋ชจ๋ฐ์ผ ์ฑ) ๊ฐ ์ค์๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ
- WebSocket ๊ธฐ๋ฐ ์๋ฐฉํฅ ํต์ ๊ตฌํ
- ๋๋ฐ์ด์ค ํ์ด๋ง ๋ฐ ๊ด๋ฆฌ ์์คํ ๊ตฌ์ถ
- ์ง๊ด์ ์ธ ๋ชจ๋ฐ์ผ ์ฑ ์ธํฐํ์ด์ค
- ์ค์๊ฐ ์ฐจํธ ๋ฐ ๋ฆฌํฌํธ ์ ๊ณต
- ๊ฐ์ ํํ ๊ฐ๋ฅํ ๋์คํ๋ ์ด UI
- ์ผ์ ๋ฐ์ดํฐ ์์ง: ์จ๋(SHT20), ์ต๋(SHT20), VOC(SGP40), ๋ฌด๊ฒ(HX711 ๋ก๋์ ) ์ค์๊ฐ ์ธก์
- ์ํ ๋จธ์ ์ ์ด: IDLE โ INPUT โ MEASURING โ MIXING โ IDLE ์ํ
- ์๋ ์ ์ด: ๋ชจํฐ ์ฌ์ดํด(60์ด ON / 60์ด OFF), ๋ชฉํ ์จ๋ 80ยฐC(์ฌ๊ฐ์ด 70ยฐC)
- ์ด์ค ๋ณด๋ ๊ตฌ์กฐ: Arduino Mega(๋ฉ์ธ ์ ์ด) + Arduino Nano(์์จ ์ ์ด), RS485 ํต์
- ๋์คํ๋ ์ด: Nextion ํฐ์น์คํฌ๋ฆฐ, LED ํ์ /์ ๋๋ฉ์ด์
- ๋คํธ์ํฌ: ENC28J60 Ethernet ๋ชจ๋์ ํตํ ์๋ฒ ์ฐ๋
- ์ผ์ ๋ฐ์ดํฐ ์์ง: ํ๋์จ์ด๋ก๋ถํฐ ์ค์๊ฐ ์ผ์ ๋ฐ์ดํฐ ์์ ๋ฐ ์ ์ฅ
- ์์ฒญ ๋ก๊น : API ์์ฒญ ๋ฐ ์๋ฌ ๋ก๊น ์์คํ
- ๋๋ฐ์ด์ค ํ์ด๋ง: ์ฌ์ฉ์-๋๋ฐ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ
- ์ค์๊ฐ ์ ๋ฐ์ดํธ: Socket.io ๊ธฐ๋ฐ WebSocket ํต์
- ์์ฝ ์ค์ฝ์ด ๋ฐ ๋ญํน: ํ๊ฒฝ ์ ์ ๊ณ์ฐ ๋ฐ ์ฌ์ฉ์ ๋ญํน ์์คํ
- API ๋ฌธ์ํ: Swagger ๊ธฐ๋ฐ REST API ๋ฌธ์ ์ ๊ณต
- ๋๋ฐ์ด์ค ํ์ด๋ง: QR ์ฝ๋ ๋๋ ์๋ ์ ๋ ฅ์ ํตํ ๋๋ฐ์ด์ค ์ฐ๊ฒฐ
- ์ค์๊ฐ ๋ชจ๋ํฐ๋ง: ์ผ์ ๋ฐ์ดํฐ ์ค์๊ฐ ํ์ ๋ฐ ์ฐจํธ ์๊ฐํ
- ๋๋ฐ์ด์ค ์ ์ด: ์๊ฒฉ ๋ชจํฐ ์ ์ด ๋ฐ ์ค์ ๋ณ๊ฒฝ
- ์ฑํ ๊ธฐ๋ฅ: ๋๋ฐ์ด์ค์์ ์ํธ์์ฉ์ ์ํ ์ฑํ ์ธํฐํ์ด์ค
- ๋ฆฌํฌํธ ๋ฐ ๋ญํน: ์ผ์ผ/์ฃผ๊ฐ ๋ฆฌํฌํธ ๋ฐ ์์ฝ ์ค์ฝ์ด ๋ญํน
- ํ๋กํ ๊ด๋ฆฌ: ์ฌ์ฉ์ ํ๋กํ ๋ฐ ์ค์ ๊ด๋ฆฌ
| ์ด๋ฆ | ์ญํ | ๋น๊ณ |
|---|---|---|
| ์ด์๋ฏผ | ์ง๋๊ต์ | - |
| ์ ์ค์ | ์ฃผ ๊ธฐํ, ํ๋์จ์ด ๋ด๋น | ํ์ฅ |
| ์ ์๋ฆ | ์บ๋ฆญํฐ, ํ๋กํ ํ์ ๋์์ธ | ํ์ |
| ์ด์ฃผ์ | ๋ฐฑ์๋ ๊ฐ๋ฐ, ์๋ฒ ํต์ | ํ์ |
| ์ตํ์ค | ์ฑ ๊ธฐํ, ์ฑ ๊ฐ๋ฐ | ํ์ |
| ์์ญ | ๊ธฐ์ ์คํ |
|---|---|
| ํ๋์จ์ด | Arduino Mega, Arduino Nano, RS485 ํต์ |
| ์ผ์/๋ชจ๋ | ENC28J60(Ethernet), HX711(๋ก๋์ ), SHT20(I2C), SGP40(I2C), Nextion(๋์คํ๋ ์ด) |
| ๋ฐฑ์๋ | NestJS, PostgreSQL, Redis, BullMQ, Socket.io, Swagger |
| ํด๋ผ์ด์ธํธ | React Native(Expo), TypeScript |
| ์ธํ๋ผ | Docker, Docker Compose |
| ๊ธฐ์ | ์ฉ๋ |
|---|---|
| NestJS | REST API ๋ฐ WebSocket ์๋ฒ ํ๋ ์์ํฌ |
| PostgreSQL | ๋ฉ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค (์ผ์ ๋ฐ์ดํฐ, ์ฌ์ฉ์ ์ ๋ณด ๋ฑ) |
| Redis | ์บ์ฑ ๋ฐ ์ธ์ ๊ด๋ฆฌ |
| BullMQ | ์์ ํ ๊ด๋ฆฌ (๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ) |
| Socket.io | ์ค์๊ฐ ์๋ฐฉํฅ ํต์ (WebSocket) |
| Swagger | API ๋ฌธ์ํ ๋ฐ ํ ์คํธ ์ธํฐํ์ด์ค |
| ๊ธฐ์ | ์ฉ๋ |
|---|---|
| React Native (Expo) | ํฌ๋ก์ค ํ๋ซํผ ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ |
| TypeScript | ํ์ ์์ ์ฑ ๋ณด์ฅ |
| Zustand | ์ํ ๊ด๋ฆฌ |
| TanStack Query | ์๋ฒ ์ํ ๊ด๋ฆฌ ๋ฐ ์บ์ฑ |
| React Navigation | ๋ค๋น๊ฒ์ด์ ๋ผ์ฐํ |
| Axios | HTTP ํด๋ผ์ด์ธํธ |
| Socket.io Client | ์ค์๊ฐ ํต์ ํด๋ผ์ด์ธํธ |
- ํ๋์จ์ด README - Arduino ๊ธฐ๋ฐ ํ๋์จ์ด ์์คํ ์์ธ ๋ฌธ์
- ๋ฐฑ์๋ README - NestJS ๋ฐฑ์๋ ์๋ฒ ์ค์ ๋ฐ API ๋ฌธ์
- ํด๋ผ์ด์ธํธ README - React Native ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ ๊ฐ์ด๋
graph TB
subgraph "ํ๋์จ์ด ๊ณ์ธต"
A1[Arduino Mega<br/>๋ฉ์ธ ์ ์ด]
A2[Arduino Nano<br/>์์จ ์ ์ด]
S1[์ผ์ ๋ชจ๋<br/>์จ๋/์ต๋/VOC/๋ฌด๊ฒ]
D1[Nextion ๋์คํ๋ ์ด<br/>LED ํ์ ]
A1 <-->|RS485| A2
A1 <--> S1
A1 <--> D1
end
subgraph "๋คํธ์ํฌ ๊ณ์ธต"
E1[ENC28J60<br/>Ethernet ๋ชจ๋]
A1 <--> E1
end
subgraph "๋ฐฑ์๋ ๊ณ์ธต"
B1[NestJS Server<br/>REST API]
B2[PostgreSQL<br/>๋ฐ์ดํฐ๋ฒ ์ด์ค]
B3[Redis<br/>์บ์ฑ/์ธ์
]
B4[Socket.io<br/>WebSocket]
B5[BullMQ<br/>์์
ํ]
B1 <--> B2
B1 <--> B3
B1 <--> B4
B1 <--> B5
end
subgraph "ํด๋ผ์ด์ธํธ ๊ณ์ธต"
C1[React Native App<br/>๋ชจ๋ฐ์ผ ์ฑ]
C2[Zustand<br/>์ํ ๊ด๋ฆฌ]
C3[TanStack Query<br/>์๋ฒ ์ํ]
C1 <--> C2
C1 <--> C3
end
E1 <-->|HTTP/WebSocket| B1
B4 <-->|WebSocket| C1
B1 <-->|REST API| C1
style A1 fill:#e1f5ff
style B1 fill:#fff4e1
style C1 fill:#e8f5e9
Hanibi - AIoT ๊ธฐ๋ฐ ๋ฐ๋ ค ๋ฏธ์๋ฌผ ์์๋ฌผ ์ฒ๋ฆฌ๊ธฐ ํ๋ก์ ํธ