์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ“ก LoRa ํ†ต์‹ ์œผ๋กœ ๋ฉ€๋ฆฌ๋ฉ€๋ฆฌ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ

๐Ÿ“ก LoRa ํ†ต์‹ ์œผ๋กœ ๋ฉ€๋ฆฌ๋ฉ€๋ฆฌ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ

์žฅ๊ฑฐ๋ฆฌ IoT์˜ ๋น„๋ฐ€๋ณ‘๊ธฐ, LoRa ์™„์ „ ์ •๋ณต!

IoT Server LoRa Communication Long Range, Low Power, IoT Solution

๐ŸŽฏ LoRa๊ฐ€ ๋ญ๊ธธ๋ž˜ ์ด๋ ‡๊ฒŒ ๋‚œ๋ฆฌ์•ผ?

์š”์ฆ˜ IoT(์‚ฌ๋ฌผ์ธํ„ฐ๋„ท) ์–˜๊ธฐ๋งŒ ๋‚˜์˜ค๋ฉด ๋น ์ง€์ง€ ์•Š๊ณ  ๋“ฑ์žฅํ•˜๋Š” ๋…€์„์ด ์žˆ์–ด. ๋ฐ”๋กœ LoRa(Long Range)๋ผ๋Š” ํ†ต์‹  ๊ธฐ์ˆ ์ด์•ผ! ๐Ÿ˜Š

์†”์งํžˆ ๋งํ•ด์„œ WiFi๋‚˜ ๋ธ”๋ฃจํˆฌ์Šค๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งค์ผ ์“ฐ๋‹ˆ๊นŒ ์ต์ˆ™ํ•˜์ž–์•„? ๊ทผ๋ฐ ์ด ์นœ๊ตฌ๋“ค์€ ์น˜๋ช…์ ์ธ ์•ฝ์ ์ด ์žˆ์–ด. ๋ฐ”๋กœ ๊ฑฐ๋ฆฌ ์ œํ•œ์ด์ง€. WiFi๋Š” ๊ธฐ๊ปํ•ด์•ผ ์ง‘ ์•ˆ์—์„œ๋งŒ ์ž˜ ํ„ฐ์ง€๊ณ , ๋ธ”๋ฃจํˆฌ์Šค๋Š” ๋” ์‹ฌํ•ด์„œ ๋ช‡ ๋ฏธํ„ฐ๋งŒ ๋–จ์–ด์ ธ๋„ ๋š ๋Š๊ฒจ๋ฒ„๋ ค. ๐Ÿคฆโ€โ™‚๏ธ

๊ทธ๋Ÿฐ๋ฐ LoRa๋Š” ๋‹ฌ๋ผ! ์ด ๋…€์„์€ ์ˆ˜ ํ‚ฌ๋กœ๋ฏธํ„ฐ๋ฅผ ๊ฑฐ๋œฌํžˆ ๋‚ ์•„๊ฐ€๋ฉด์„œ๋„ ๋ฐฐํ„ฐ๋ฆฌ๋Š” ์—„์ฒญ ์˜ค๋ž˜ ๊ฐ€๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๊ธฐ์ˆ ์ด์•ผ. ๋†์žฅ์—์„œ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜, ๋„์‹œ ์ „์ฒด์— ์Šค๋งˆํŠธ ์ฃผ์ฐจ ์‹œ์Šคํ…œ์„ ๊น”๊ฑฐ๋‚˜, ์‚ฐ์† ์–ด๋”˜๊ฐ€์—์„œ ํ™˜๊ฒฝ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ๋•Œ ์™„๋ฒฝํ•˜์ง€!

๐ŸŽช LoRa์˜ ํ•ต์‹ฌ ํŠน์ง• 3๊ฐ€์ง€ 1. ์žฅ๊ฑฐ๋ฆฌ ํ†ต์‹  - ๋„์‹ฌ์—์„œ 2~5km, ์‹œ๊ณจ์—์„œ๋Š” ์ตœ๋Œ€ 15km๊นŒ์ง€ ๊ฐ€๋Šฅ!
2. ์ €์ „๋ ฅ - ๋ฐฐํ„ฐ๋ฆฌ ํ•˜๋‚˜๋กœ ๋ช‡ ๋…„์”ฉ ์ž‘๋™ ๊ฐ€๋Šฅ
3. ์ €๋น„์šฉ - ๋ชจ๋“ˆ ๊ฐ€๊ฒฉ์ด ์ €๋ ดํ•˜๊ณ  ํ†ต์‹ ๋น„๋„ ๊ฑฐ์˜ ์•ˆ ๋“ค์–ด

ํŠนํžˆ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ LoRa๊ฐ€ ์ธ๊ธฐ ์žˆ๋Š” ์ด์œ ๋Š” ์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„๊ฐ€ ์ž˜ ๊ตฌ์ถ•๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์•ผ. Arduino๋ถ€ํ„ฐ Raspberry Pi๊นŒ์ง€ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ! ๐Ÿš€

๐Ÿ”ฌ LoRa ํ†ต์‹ ์˜ ์ž‘๋™ ์›๋ฆฌ

์ž, ์ด์ œ ์ข€ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณผ๊นŒ? LoRa๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด๋ ‡๊ฒŒ ๋ฉ€๋ฆฌ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์ง€? ๐Ÿค”

๐Ÿ“ป CSS ๋ณ€์กฐ ๋ฐฉ์‹์˜ ๋งˆ๋ฒ•

LoRa๋Š” CSS(Chirp Spread Spectrum)๋ผ๋Š” ํŠน๋ณ„ํ•œ ๋ณ€์กฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด. ์ด๊ฒŒ ๋ญ๋ƒ๋ฉด, ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ๋•Œ ์ฃผํŒŒ์ˆ˜๋ฅผ ๊ณ„์† ๋ณ€ํ™”์‹œํ‚ค๋ฉด์„œ ๋ณด๋‚ด๋Š” ๊ฑฐ์•ผ. ๋งˆ์น˜ ์ƒˆ๊ฐ€ ์ง€์ €๊ท€๋“ฏ์ด ์ฃผํŒŒ์ˆ˜๊ฐ€ ์˜ฌ๋ผ๊ฐ”๋‹ค ๋‚ด๋ ค๊ฐ”๋‹ค ํ•˜๋Š” ๊ฑฐ์ง€!

๐Ÿ’ก ์™œ CSS๊ฐ€ ์ข‹์„๊นŒ? ์ผ๋ฐ˜์ ์ธ ํ†ต์‹ ์€ ํ•œ ์ฃผํŒŒ์ˆ˜์— ์‹ ํ˜ธ๋ฅผ ์‹ค์–ด ๋ณด๋‚ด๋Š”๋ฐ, ์ด๋Ÿฌ๋ฉด ๋…ธ์ด์ฆˆ(์žก์Œ)์— ์•ฝํ•ด. ๊ทผ๋ฐ CSS๋Š” ๋„“์€ ์ฃผํŒŒ์ˆ˜ ๋Œ€์—ญ์— ์‹ ํ˜ธ๋ฅผ ํผ๋œจ๋ ค์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ์ด์ฆˆ๊ฐ€ ์žˆ์–ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์–ด! ๋งˆ์น˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐฑ์—…์„ ๋งŒ๋“ค์–ด๋‘๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ. ๐Ÿ˜Ž

โš™๏ธ ์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ดํ•ดํ•˜๊ธฐ

LoRa ํ†ต์‹ ์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์•Œ์•„์•ผ ํ•ด:

ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช… ์˜ํ–ฅ
SF (Spreading Factor) ํ™•์‚ฐ ๊ณ„์ˆ˜, 7~12 ๋ฒ”์œ„ ๋†’์„์ˆ˜๋ก ๊ฑฐ๋ฆฌโ†‘, ์†๋„โ†“
BW (Bandwidth) ๋Œ€์—ญํญ, 125/250/500 kHz ๋„“์„์ˆ˜๋ก ์†๋„โ†‘, ๊ฐ๋„โ†“
CR (Coding Rate) ์˜ค๋ฅ˜ ์ •์ • ๋น„์œจ, 4/5~4/8 ๋†’์„์ˆ˜๋ก ์•ˆ์ •์„ฑโ†‘, ์†๋„โ†“
TX Power ์ „์†ก ์ถœ๋ ฅ, 2~20 dBm ๋†’์„์ˆ˜๋ก ๊ฑฐ๋ฆฌโ†‘, ์ „๋ ฅ์†Œ๋ชจโ†‘

์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์€ ์„œ๋กœ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๊ด€๊ณ„์— ์žˆ์–ด. ๊ฑฐ๋ฆฌ๋ฅผ ๋Š˜๋ฆฌ๋ ค๋ฉด ์†๋„๋ฅผ ํฌ๊ธฐํ•ด์•ผ ํ•˜๊ณ , ์†๋„๋ฅผ ๋†’์ด๋ ค๋ฉด ๊ฑฐ๋ฆฌ๋‚˜ ์•ˆ์ •์„ฑ์„ ์กฐ๊ธˆ ์–‘๋ณดํ•ด์•ผ ํ•˜์ง€. ๋งˆ์น˜ ๊ฒŒ์ž„์—์„œ ์Šคํƒฏ ํฌ์ธํŠธ๋ฅผ ๋ฐฐ๋ถ„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ! ๐ŸŽฎ

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ SF๋ฅผ ๋„ˆ๋ฌด ๋†’๊ฒŒ ์„ค์ •ํ•˜๋ฉด ์ „์†ก ์‹œ๊ฐ„์ด ๊ธธ์–ด์ ธ์„œ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ๊ฐ€ ์ปค์ ธ. ๋ฐ˜๋Œ€๋กœ ๋„ˆ๋ฌด ๋‚ฎ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ํ†ต์‹  ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์•„์ง€๊ณ  ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์–ด. ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋ฉด์„œ ์ตœ์ ์˜ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒŒ ์ค‘์š”ํ•ด!

๐Ÿ› ๏ธ ํ•˜๋“œ์›จ์–ด ์ค€๋น„ํ•˜๊ธฐ

์ด๋ก ์€ ์ด ์ •๋„๋ฉด ์ถฉ๋ถ„ํ•˜๊ณ , ์ด์ œ ์‹ค์ œ๋กœ ๋งŒ๋“ค์–ด๋ณผ ์ฐจ๋ก€์•ผ! ๋จผ์ € ํ•„์š”ํ•œ ํ•˜๋“œ์›จ์–ด๋ฅผ ์•Œ์•„๋ณด์ž. ๐Ÿ’ช

๐Ÿ“ฆ ํ•„์ˆ˜ ๊ตฌ์„ฑํ’ˆ

๐ŸŽ ๊ธฐ๋ณธ ์„ธํŠธ (์†ก์‹ ๋ถ€/์ˆ˜์‹ ๋ถ€ ๊ฐ๊ฐ) 1. ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ
- Arduino Uno/Nano (์ดˆ๋ณด์ž ์ถ”์ฒœ) ๐Ÿ’š
- ESP32 (WiFi ์—ฐ๋™ ํ•„์š”์‹œ)
- Raspberry Pi (๋ณต์žกํ•œ ์ฒ˜๋ฆฌ ํ•„์š”์‹œ)

2. LoRa ๋ชจ๋“ˆ
- SX1276/SX1278 ์นฉ์…‹ ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆ
- RFM95W (๊ฐ€์„ฑ๋น„ ์ข‹์Œ)
- Ra-02 (์ €๋ ดํ•˜๊ณ  ์„ฑ๋Šฅ ์ข‹์Œ)
- Dragino LoRa Shield (Arduino ํ˜ธํ™˜)

3. ์•ˆํ…Œ๋‚˜
- 868MHz ๋˜๋Š” 915MHz ๋Œ€์—ญ ์•ˆํ…Œ๋‚˜
- ์Šคํ”„๋ง ์•ˆํ…Œ๋‚˜ ๋˜๋Š” ์™ธ์žฅ ์•ˆํ…Œ๋‚˜

4. ๊ธฐํƒ€
- ์ ํผ ์™€์ด์–ด
- ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ
- ์ „์› ๊ณต๊ธ‰ ์žฅ์น˜ (๋ฐฐํ„ฐ๋ฆฌ ๋˜๋Š” USB)

๐Ÿ”Œ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ• (Arduino + SX1278 ๊ธฐ์ค€)

LoRa ๋ชจ๋“ˆ๊ณผ Arduino๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฑด ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ด! SPI ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ•ด์ง„ ํ•€์—๋งŒ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ผ:

LoRa ๋ชจ๋“ˆ โ†’ Arduino
VCC โ†’ 3.3V (์ค‘์š”! 5V ์•„๋‹˜)
GND โ†’ GND
MISO โ†’ D12
MOSI โ†’ D11
SCK โ†’ D13
NSS โ†’ D10
RESET โ†’ D9
DIO0 โ†’ D2
โš ๏ธ ์ „์•• ์ฃผ์˜! ๋Œ€๋ถ€๋ถ„์˜ LoRa ๋ชจ๋“ˆ์€ 3.3V๋กœ ๋™์ž‘ํ•ด! Arduino Uno๋Š” 5V ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— VCC๋Š” ๋ฐ˜๋“œ์‹œ 3.3V ํ•€์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ด. 5V๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ชจ๋“ˆ์ด ๊ณ ์žฅ๋‚  ์ˆ˜ ์žˆ์–ด! ๐Ÿ˜ฑ

๐ŸŒ ์ฃผํŒŒ์ˆ˜ ๋Œ€์—ญ ์„ ํƒ

LoRa๋Š” ISM(Industrial, Scientific and Medical) ๋Œ€์—ญ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋‚˜๋ผ๋งˆ๋‹ค ํ—ˆ์šฉ๋˜๋Š” ์ฃผํŒŒ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ:

์ง€์—ญ๋ณ„ ์ฃผํŒŒ์ˆ˜ ๋Œ€์—ญ
๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ: 920-923 MHz (KR920)
๐Ÿ‡บ๐Ÿ‡ธ ๋ฏธ๊ตญ: 902-928 MHz (US915)
๐Ÿ‡ช๐Ÿ‡บ ์œ ๋Ÿฝ: 863-870 MHz (EU868)
๐Ÿ‡จ๐Ÿ‡ณ ์ค‘๊ตญ: 470-510 MHz (CN470)
๐Ÿ‡ฏ๐Ÿ‡ต ์ผ๋ณธ: 920-928 MHz (AS923)

ํ•œ๊ตญ์—์„œ ์‚ฌ์šฉํ•  ๊ฑฐ๋ผ๋ฉด 920MHz ๋Œ€์—ญ ๋ชจ๋“ˆ์„ ๊ตฌ๋งคํ•ด์•ผ ํ•ด! ์ž˜๋ชป๋œ ์ฃผํŒŒ์ˆ˜ ๋Œ€์—ญ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆ๋ฒ•์ด ๋  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•˜์ž. ๐Ÿ“ก

๐Ÿ’ป ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ - ์†ก์‹ ๋ถ€ ์ฝ”๋“œ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ ์‹œ๊ฐ„์ด์•ผ! Arduino IDE๋ฅผ ์‚ฌ์šฉํ•  ๊ฑด๋ฐ, ๋จผ์ € ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ด. ๐ŸŽจ

๐Ÿ“š ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

๐Ÿ’ก LoRa ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ๋ฐฉ๋ฒ• 1. Arduino IDE ์‹คํ–‰
2. ์Šค์ผ€์น˜ โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌํ•จํ•˜๊ธฐ โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ
3. "LoRa" ๊ฒ€์ƒ‰ โ†’ Sandeep Mistry์˜ "LoRa" ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
4. ์„ค์น˜ ์™„๋ฃŒ! ๐Ÿ˜Š

๐Ÿ“ค ์†ก์‹ ๋ถ€ ๊ธฐ๋ณธ ์ฝ”๋“œ

๋จผ์ € ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ์†ก์‹ ๋ถ€ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด๋ณด์ž:

#include <SPI.h>
#include <LoRa.h>

// LoRa ํ•€ ์„ค์ •
#define NSS 10
#define RESET 9
#define DIO0 2

// ์ „์†ก ์นด์šดํ„ฐ
int counter = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  
  Serial.println("LoRa ์†ก์‹ ๋ถ€ ์‹œ์ž‘!");
  
  // LoRa ํ•€ ์„ค์ •
  LoRa.setPins(NSS, RESET, DIO0);
  
  // LoRa ์ดˆ๊ธฐํ™” (ํ•œ๊ตญ ์ฃผํŒŒ์ˆ˜: 920MHz)
  if (!LoRa.begin(920E6)) {
    Serial.println("LoRa ์ดˆ๊ธฐํ™” ์‹คํŒจ!");
    while (1);
  }
  
  // LoRa ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •
  LoRa.setSpreadingFactor(12);      // SF12 (์ตœ๋Œ€ ๊ฑฐ๋ฆฌ)
  LoRa.setSignalBandwidth(125E3);   // 125kHz
  LoRa.setCodingRate4(5);           // CR 4/5
  LoRa.setTxPower(20);              // ์ตœ๋Œ€ ์ถœ๋ ฅ
  
  Serial.println("LoRa ์ดˆ๊ธฐํ™” ์™„๋ฃŒ!");
}

void loop() {
  Serial.print("ํŒจํ‚ท ์ „์†ก ์ค‘: ");
  Serial.println(counter);
  
  // ํŒจํ‚ท ์ „์†ก ์‹œ์ž‘
  LoRa.beginPacket();
  LoRa.print("์•ˆ๋…•ํ•˜์„ธ์š”! ํŒจํ‚ท ๋ฒˆํ˜ธ: ");
  LoRa.print(counter);
  LoRa.endPacket();
  
  counter++;
  
  // 5์ดˆ ๋Œ€๊ธฐ
  delay(5000);
}

๐Ÿ” ์ฝ”๋“œ ์ƒ์„ธ ์„ค๋ช…

์œ„ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณด๋ฉด:

1๏ธโƒฃ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ LoRa.begin(920E6) - 920MHz๋กœ LoRa ๋ชจ๋“ˆ ์‹œ์ž‘
์‹คํŒจํ•˜๋ฉด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ ธ์„œ ๋” ์ด์ƒ ์ง„ํ–‰ ์•ˆ ํ•จ

2๏ธโƒฃ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •

setSpreadingFactor(12) - SF12๋กœ ์„ค์ • (์ตœ๋Œ€ ๊ฑฐ๋ฆฌ, ์ตœ์ € ์†๋„)
setSignalBandwidth(125E3) - 125kHz ๋Œ€์—ญํญ
setCodingRate4(5) - ์˜ค๋ฅ˜ ์ •์ • ๋น„์œจ 4/5
setTxPower(20) - 20dBm ์ถœ๋ ฅ (์ตœ๋Œ€)

3๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ „์†ก

beginPacket() - ํŒจํ‚ท ์ „์†ก ์‹œ์ž‘
print() - ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ (์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ ๊ฐ€๋Šฅ)
endPacket() - ํŒจํ‚ท ์ „์†ก ์™„๋ฃŒ ๋ฐ ์‹ค์ œ ์†ก์‹ 

๐ŸŒก๏ธ ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ „์†ก ์˜ˆ์ œ

์‹ค์ œ๋กœ๋Š” ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ง€? DHT11 ์˜จ์Šต๋„ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ:

#include <SPI.h>
#include <LoRa.h>
#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

#define NSS 10
#define RESET 9
#define DIO0 2

void setup() {
  Serial.begin(9600);
  dht.begin();
  
  LoRa.setPins(NSS, RESET, DIO0);
  
  if (!LoRa.begin(920E6)) {
    Serial.println("LoRa ์ดˆ๊ธฐํ™” ์‹คํŒจ!");
    while (1);
  }
  
  LoRa.setSpreadingFactor(10);
  LoRa.setSignalBandwidth(125E3);
  LoRa.setTxPower(17);
  
  Serial.println("์„ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์ž‘!");
}

void loop() {
  // ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  
  // ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ์ฒดํฌ
  if (isnan(temperature) || isnan(humidity)) {
    Serial.println("์„ผ์„œ ์ฝ๊ธฐ ์‹คํŒจ!");
    delay(2000);
    return;
  }
  
  // JSON ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ
  String jsonData = "{";
  jsonData += "\"temp\":";
  jsonData += String(temperature, 1);
  jsonData += ",\"humi\":";
  jsonData += String(humidity, 1);
  jsonData += "}";
  
  // LoRa๋กœ ์ „์†ก
  Serial.print("์ „์†ก: ");
  Serial.println(jsonData);
  
  LoRa.beginPacket();
  LoRa.print(jsonData);
  LoRa.endPacket();
  
  // 10์ดˆ ๋Œ€๊ธฐ (๋ฐฐํ„ฐ๋ฆฌ ์ ˆ์•ฝ)
  delay(10000);
}

์ด ์ฝ”๋“œ๋Š” ์˜จ๋„์™€ ์Šต๋„๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ณด๋‚ด. JSON์„ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜์‹ ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๊ธฐ ์‰ฝ๊ฑฐ๋“ ! ๐Ÿ“Š

๐Ÿ’ก ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช… ๋Š˜๋ฆฌ๊ธฐ ํŒ 1. ์ „์†ก ์ฃผ๊ธฐ๋ฅผ ๊ธธ๊ฒŒ ์„ค์ • (10์ดˆ โ†’ 1๋ถ„ โ†’ 10๋ถ„)
2. SF ๊ฐ’์„ ๋‚ฎ์ถฐ์„œ ์ „์†ก ์‹œ๊ฐ„ ๋‹จ์ถ•
3. TX Power๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์‚ฌ์šฉ
4. Deep Sleep ๋ชจ๋“œ ํ™œ์šฉ (ESP32์˜ ๊ฒฝ์šฐ)
5. ์„ผ์„œ๋„ ํ•„์š”ํ•  ๋•Œ๋งŒ ์ผœ๊ธฐ

๐Ÿ“ฅ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ - ์ˆ˜์‹ ๋ถ€ ์ฝ”๋“œ

์†ก์‹ ๋ถ€๊ฐ€ ์žˆ์œผ๋ฉด ๋‹น์—ฐํžˆ ์ˆ˜์‹ ๋ถ€๋„ ์žˆ์–ด์•ผ๊ฒ ์ง€? ์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž! ๐Ÿ“ฌ

๐Ÿ“จ ๊ธฐ๋ณธ ์ˆ˜์‹ ๋ถ€ ์ฝ”๋“œ

#include <SPI.h>
#include <LoRa.h>

#define NSS 10
#define RESET 9
#define DIO0 2

void setup() {
  Serial.begin(9600);
  while (!Serial);
  
  Serial.println("LoRa ์ˆ˜์‹ ๋ถ€ ์‹œ์ž‘!");
  
  LoRa.setPins(NSS, RESET, DIO0);
  
  if (!LoRa.begin(920E6)) {
    Serial.println("LoRa ์ดˆ๊ธฐํ™” ์‹คํŒจ!");
    while (1);
  }
  
  // ์†ก์‹ ๋ถ€์™€ ๋™์ผํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •
  LoRa.setSpreadingFactor(12);
  LoRa.setSignalBandwidth(125E3);
  LoRa.setCodingRate4(5);
  
  Serial.println("์ˆ˜์‹  ๋Œ€๊ธฐ ์ค‘...");
}

void loop() {
  // ํŒจํ‚ท ์ˆ˜์‹  ํ™•์ธ
  int packetSize = LoRa.parsePacket();
  
  if (packetSize) {
    // ํŒจํ‚ท ์ˆ˜์‹ ๋จ!
    Serial.print("ํŒจํ‚ท ์ˆ˜์‹ ! ํฌ๊ธฐ: ");
    Serial.println(packetSize);
    
    // ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
    String received = "";
    while (LoRa.available()) {
      received += (char)LoRa.read();
    }
    
    Serial.print("๋‚ด์šฉ: ");
    Serial.println(received);
    
    // RSSI (์‹ ํ˜ธ ๊ฐ•๋„) ์ถœ๋ ฅ
    Serial.print("RSSI: ");
    Serial.print(LoRa.packetRssi());
    Serial.println(" dBm");
    
    // SNR (์‹ ํ˜ธ ๋Œ€ ์žก์Œ๋น„) ์ถœ๋ ฅ
    Serial.print("SNR: ");
    Serial.print(LoRa.packetSnr());
    Serial.println(" dB");
    
    Serial.println("-------------------");
  }
}

๐Ÿ“Š ์‹ ํ˜ธ ํ’ˆ์งˆ ์ดํ•ดํ•˜๊ธฐ

์ˆ˜์‹ ๋ถ€ ์ฝ”๋“œ์—์„œ RSSI์™€ SNR์ด๋ผ๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š”๋ฐ, ์ด๊ฒŒ ๋ญ”์ง€ ์•Œ์•„๋ณด์ž:

๐Ÿ“ก RSSI (Received Signal Strength Indicator) ์ˆ˜์‹  ์‹ ํ˜ธ์˜ ๊ฐ•๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด์•ผ. dBm ๋‹จ์œ„๋กœ ํ‘œ์‹œ๋˜๊ณ , 0์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๊ฐ•ํ•œ ์‹ ํ˜ธ์•ผ.

- -30 ~ -50 dBm: ๋งค์šฐ ๊ฐ•ํ•จ ๐Ÿ’ช
- -50 ~ -70 dBm: ๊ฐ•ํ•จ ๐Ÿ‘
- -70 ~ -90 dBm: ๋ณดํ†ต ๐Ÿ˜
- -90 ~ -110 dBm: ์•ฝํ•จ ๐Ÿ˜ฐ
- -110 dBm ์ดํ•˜: ๋งค์šฐ ์•ฝํ•จ ๐Ÿ’€

๐Ÿ“ˆ SNR (Signal-to-Noise Ratio)

์‹ ํ˜ธ์™€ ์žก์Œ์˜ ๋น„์œจ์ด์•ผ. dB ๋‹จ์œ„๋กœ ํ‘œ์‹œ๋˜๊ณ , ๋†’์„์ˆ˜๋ก ์ข‹์•„.

- 10 dB ์ด์ƒ: ๋งค์šฐ ์ข‹์Œ โœจ
- 5 ~ 10 dB: ์ข‹์Œ ๐Ÿ˜Š
- 0 ~ 5 dB: ๋ณดํ†ต ๐Ÿ˜
- 0 dB ์ดํ•˜: ๋‚˜์จ (๊ทธ๋ž˜๋„ LoRa๋Š” -20dB๊นŒ์ง€ ๋ณต์กฐ ๊ฐ€๋Šฅ!) ๐ŸŽ‰

๐Ÿ”„ JSON ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ

์•„๊นŒ ์†ก์‹ ๋ถ€์—์„œ JSON ํ˜•์‹์œผ๋กœ ๋ณด๋ƒˆ์œผ๋‹ˆ, ์ˆ˜์‹ ๋ถ€์—์„œ๋„ ํŒŒ์‹ฑํ•ด์•ผ๊ฒ ์ง€? ArduinoJson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฌ์›Œ:

#include <SPI.h>
#include <LoRa.h>
#include <ArduinoJson.h>

#define NSS 10
#define RESET 9
#define DIO0 2

void setup() {
  Serial.begin(9600);
  while (!Serial);
  
  LoRa.setPins(NSS, RESET, DIO0);
  
  if (!LoRa.begin(920E6)) {
    Serial.println("LoRa ์ดˆ๊ธฐํ™” ์‹คํŒจ!");
    while (1);
  }
  
  LoRa.setSpreadingFactor(10);
  LoRa.setSignalBandwidth(125E3);
  
  Serial.println("์„ผ์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ๋Œ€๊ธฐ...");
}

void loop() {
  int packetSize = LoRa.parsePacket();
  
  if (packetSize) {
    String received = "";
    while (LoRa.available()) {
      received += (char)LoRa.read();
    }
    
    // JSON ํŒŒ์‹ฑ
    StaticJsonDocument<200> doc;
    DeserializationError error = deserializeJson(doc, received);
    
    if (error) {
      Serial.print("JSON ํŒŒ์‹ฑ ์‹คํŒจ: ");
      Serial.println(error.c_str());
      return;
    }
    
    // ๋ฐ์ดํ„ฐ ์ถ”์ถœ
    float temperature = doc["temp"];
    float humidity = doc["humi"];
    
    // ์ถœ๋ ฅ
    Serial.println("=== ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ===");
    Serial.print("์˜จ๋„: ");
    Serial.print(temperature);
    Serial.println(" ยฐC");
    Serial.print("์Šต๋„: ");
    Serial.print(humidity);
    Serial.println(" %");
    Serial.print("์‹ ํ˜ธ ๊ฐ•๋„: ");
    Serial.print(LoRa.packetRssi());
    Serial.println(" dBm");
    Serial.println("========================");
  }
}

์ด์ œ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด! ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์›น ๋Œ€์‹œ๋ณด๋“œ๋กœ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์ง€. ๐ŸŒ

๐Ÿš€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์ธ ์†ก์ˆ˜์‹ ์€ ๋งˆ์Šคํ„ฐํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์ข€ ๋” ์‹ค์ „์ ์ธ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€ํ•ด๋ณด์ž! ๐Ÿ’ช

๐Ÿ” ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”

LoRa๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•„. ๋ˆ„๊ตฌ๋‚˜ ๊ฐ™์€ ์ฃผํŒŒ์ˆ˜๋กœ ์ˆ˜์‹ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด์ง€. ๋ณด์•ˆ์ด ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์•”ํ˜ธํ™”๋Š” ํ•„์ˆ˜์•ผ! ๐Ÿ”’

#include <AES.h>

// AES ์•”ํ˜ธํ™” ํ‚ค (16๋ฐ”์ดํŠธ)
byte aes_key[] = {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
                  0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};

AES aes;

// ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ํ•จ์ˆ˜
String encryptData(String plaintext) {
  byte encrypted[128];
  int paddedLength = plaintext.length();
  
  // 16๋ฐ”์ดํŠธ ๋ฐฐ์ˆ˜๋กœ ํŒจ๋”ฉ
  while (paddedLength % 16 != 0) {
    plaintext += ' ';
    paddedLength++;
  }
  
  byte plain[paddedLength];
  plaintext.getBytes(plain, paddedLength + 1);
  
  aes.set_key(aes_key, 128);
  aes.encrypt(plain, encrypted);
  
  // Base64 ์ธ์ฝ”๋”ฉ (์ „์†ก์šฉ)
  String result = base64::encode(encrypted, paddedLength);
  return result;
}

// ๋ฐ์ดํ„ฐ ๋ณตํ˜ธํ™” ํ•จ์ˆ˜
String decryptData(String ciphertext) {
  byte decoded[128];
  int decodedLength = base64::decode(ciphertext, decoded);
  
  byte decrypted[128];
  aes.set_key(aes_key, 128);
  aes.decrypt(decoded, decrypted);
  
  String result = String((char*)decrypted);
  result.trim();
  return result;
}
โš ๏ธ ์•”ํ˜ธํ™” ์ฃผ์˜์‚ฌํ•ญ 1. ์•”ํ˜ธํ™” ํ‚ค๋Š” ์ ˆ๋Œ€ ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ๋ง๊ณ  ์•ˆ์ „ํ•œ ๊ณณ์— ๋ณด๊ด€
2. ์•”ํ˜ธํ™”ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ์„œ ์ „์†ก ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง
3. ์†ก์‹ ๋ถ€์™€ ์ˆ˜์‹ ๋ถ€๊ฐ€ ๊ฐ™์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
4. ์ฃผ๊ธฐ์ ์œผ๋กœ ํ‚ค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ณด์•ˆ์— ์ข‹์Œ

โœ… ACK (ํ™•์ธ ์‘๋‹ต) ์‹œ์Šคํ…œ

๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒˆ๋Š”๋ฐ ์ œ๋Œ€๋กœ ๋„์ฐฉํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์ง€? ACK ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž:

// ์†ก์‹ ๋ถ€ ์ฝ”๋“œ (ACK ๋Œ€๊ธฐ ํฌํ•จ)
void sendWithAck(String data, int maxRetries = 3) {
  for (int retry = 0; retry < maxRetries; retry++) {
    Serial.print("์ „์†ก ์‹œ๋„ ");
    Serial.print(retry + 1);
    Serial.print("/");
    Serial.println(maxRetries);
    
    // ๋ฐ์ดํ„ฐ ์ „์†ก
    LoRa.beginPacket();
    LoRa.print(data);
    LoRa.endPacket();
    
    // ACK ๋Œ€๊ธฐ (5์ดˆ)
    unsigned long startTime = millis();
    bool ackReceived = false;
    
    while (millis() - startTime < 5000) {
      int packetSize = LoRa.parsePacket();
      if (packetSize) {
        String response = "";
        while (LoRa.available()) {
          response += (char)LoRa.read();
        }
        
        if (response == "ACK") {
          Serial.println("โœ“ ACK ์ˆ˜์‹ ! ์ „์†ก ์„ฑ๊ณต");
          ackReceived = true;
          break;
        }
      }
    }
    
    if (ackReceived) {
      return;  // ์„ฑ๊ณต!
    }
    
    Serial.println("โœ— ACK ๋ฏธ์ˆ˜์‹ , ์žฌ์‹œ๋„...");
    delay(1000);
  }
  
  Serial.println("์ „์†ก ์‹คํŒจ!");
}

// ์ˆ˜์‹ ๋ถ€ ์ฝ”๋“œ (ACK ์ „์†ก ํฌํ•จ)
void loop() {
  int packetSize = LoRa.parsePacket();
  
  if (packetSize) {
    String received = "";
    while (LoRa.available()) {
      received += (char)LoRa.read();
    }
    
    Serial.print("๋ฐ์ดํ„ฐ ์ˆ˜์‹ : ");
    Serial.println(received);
    
    // ACK ์ „์†ก
    delay(100);  // ์งง์€ ๋Œ€๊ธฐ
    LoRa.beginPacket();
    LoRa.print("ACK");
    LoRa.endPacket();
    
    Serial.println("ACK ์ „์†ก ์™„๋ฃŒ");
  }
}

๐ŸŒ ๋ฉ€ํ‹ฐ ๋…ธ๋“œ ๋„คํŠธ์›Œํฌ

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„ผ์„œ ๋…ธ๋“œ๋ฅผ ์šด์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ๊ฐ ๋…ธ๋“œ์— ID๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•ด:

// ๋…ธ๋“œ ID ์ •์˜
#define NODE_ID 1  // ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฒˆํ˜ธ

// ํŒจํ‚ท ๊ตฌ์กฐ์ฒด
struct Packet {
  uint8_t nodeId;
  uint8_t messageType;  // 1: ์„ผ์„œ๋ฐ์ดํ„ฐ, 2: ์ƒํƒœ, 3: ์•Œ๋žŒ
  float data1;
  float data2;
  uint32_t timestamp;
};

// ์†ก์‹ ๋ถ€ - ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ์ „์†ก
void sendStructuredData(float temp, float humi) {
  Packet packet;
  packet.nodeId = NODE_ID;
  packet.messageType = 1;
  packet.data1 = temp;
  packet.data2 = humi;
  packet.timestamp = millis();
  
  LoRa.beginPacket();
  LoRa.write((uint8_t*)&packet, sizeof(packet));
  LoRa.endPacket();
  
  Serial.print("๋…ธ๋“œ ");
  Serial.print(NODE_ID);
  Serial.println(" ๋ฐ์ดํ„ฐ ์ „์†ก");
}

// ์ˆ˜์‹ ๋ถ€ - ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
void loop() {
  int packetSize = LoRa.parsePacket();
  
  if (packetSize == sizeof(Packet)) {
    Packet packet;
    LoRa.readBytes((uint8_t*)&packet, sizeof(packet));
    
    Serial.println("=== ํŒจํ‚ท ์ˆ˜์‹  ===");
    Serial.print("๋…ธ๋“œ ID: ");
    Serial.println(packet.nodeId);
    Serial.print("๋ฉ”์‹œ์ง€ ํƒ€์ž…: ");
    Serial.println(packet.messageType);
    Serial.print("๋ฐ์ดํ„ฐ1: ");
    Serial.println(packet.data1);
    Serial.print("๋ฐ์ดํ„ฐ2: ");
    Serial.println(packet.data2);
    Serial.print("ํƒ€์ž„์Šคํƒฌํ”„: ");
    Serial.println(packet.timestamp);
    Serial.println("=================");
  }
}

๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. JSON๋ณด๋‹ค ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋„ ์ž‘๊ณ  ํŒŒ์‹ฑ๋„ ๋น ๋ฅด์ง€! ๐Ÿ˜Ž

๐ŸŒ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด

์ด๋ก ๊ณผ ์ฝ”๋“œ๋Š” ์ถฉ๋ถ„ํžˆ ๋ฐฐ์› ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ๋กœ ์–ด๋–ค ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž! ๐ŸŽฏ

๐ŸŒพ ์Šค๋งˆํŠธ ๋†์žฅ ๋ชจ๋‹ˆํ„ฐ๋ง

ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ๋„“์€ ๋†์žฅ ๊ณณ๊ณณ์— ์„ผ์„œ ๋…ธ๋“œ๋ฅผ ์„ค์น˜ํ•ด์„œ ํ† ์–‘ ์Šต๋„, ์˜จ๋„, ์กฐ๋„๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์‹œ์Šคํ…œ์ด์•ผ.

ํ•„์š”ํ•œ ์„ผ์„œ
- DHT22 (์˜จ์Šต๋„)
- ํ† ์–‘ ์Šต๋„ ์„ผ์„œ
- BH1750 (์กฐ๋„ ์„ผ์„œ)
- ๋ฐฐํ„ฐ๋ฆฌ ์ „์•• ๋ชจ๋‹ˆํ„ฐ๋ง

๊ตฌํ˜„ ํฌ์ธํŠธ
- ๊ฐ ๋…ธ๋“œ๋Š” 10๋ถ„๋งˆ๋‹ค ๋ฐ์ดํ„ฐ ์ „์†ก
- ๋ฐฐํ„ฐ๋ฆฌ ์ ˆ์•ฝ์„ ์œ„ํ•ด Deep Sleep ํ™œ์šฉ
- ์ด์ƒ ์ˆ˜์น˜ ๊ฐ์ง€ ์‹œ ์ฆ‰์‹œ ์•Œ๋žŒ ์ „์†ก
- ๊ฒŒ์ดํŠธ์›จ์ด๋Š” WiFi๋กœ ํด๋ผ์šฐ๋“œ์— ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ

๐Ÿ…ฟ๏ธ ์Šค๋งˆํŠธ ์ฃผ์ฐจ ์‹œ์Šคํ…œ

ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ์ฃผ์ฐจ์žฅ์˜ ๊ฐ ์ฃผ์ฐจ ๊ณต๊ฐ„์— ์ดˆ์ŒํŒŒ ์„ผ์„œ๋ฅผ ์„ค์น˜ํ•ด์„œ ๋นˆ ์ž๋ฆฌ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒŒ์•…ํ•˜๋Š” ์‹œ์Šคํ…œ.

ํ•„์š”ํ•œ ํ•˜๋“œ์›จ์–ด
- HC-SR04 ์ดˆ์ŒํŒŒ ์„ผ์„œ
- LoRa ๋ชจ๋“ˆ
- ํƒœ์–‘๊ด‘ ํŒจ๋„ + ๋ฐฐํ„ฐ๋ฆฌ

๊ตฌํ˜„ ํฌ์ธํŠธ
- ์ฐจ๋Ÿ‰ ๊ฐ์ง€ ์‹œ์—๋งŒ ๋ฐ์ดํ„ฐ ์ „์†ก (์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜)
- ๊ฐ ์ฃผ์ฐจ ๊ณต๊ฐ„๋งˆ๋‹ค ๊ณ ์œ  ID ๋ถ€์—ฌ
- ์ค‘์•™ ์„œ๋ฒ„์—์„œ ์ „์ฒด ์ฃผ์ฐจ์žฅ ํ˜„ํ™ฉ ํ‘œ์‹œ
- ๋ชจ๋ฐ”์ผ ์•ฑ์œผ๋กœ ๋นˆ ์ž๋ฆฌ ์•ˆ๋‚ด

๐Ÿ”๏ธ ํ™˜๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง ์Šคํ…Œ์ด์…˜

ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ์‚ฐ์ด๋‚˜ ์™ธ๋”ด ์ง€์—ญ์— ์„ค์น˜ํ•ด์„œ ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ์™€ ํ™˜๊ฒฝ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฌด์ธ ์Šคํ…Œ์ด์…˜.

์ธก์ • ํ•ญ๋ชฉ
- ์˜จ๋„, ์Šต๋„, ๊ธฐ์••
- ํ’์†, ํ’ํ–ฅ
- ๊ฐ•์ˆ˜๋Ÿ‰
- ๋ฏธ์„ธ๋จผ์ง€ ๋†๋„
- ์†Œ์Œ ๋ ˆ๋ฒจ

๊ตฌํ˜„ ํฌ์ธํŠธ
- ํƒœ์–‘๊ด‘ ์ถฉ์ „ ์‹œ์Šคํ…œ
- 1์‹œ๊ฐ„๋งˆ๋‹ค ์ •๊ธฐ ์ „์†ก
- ์ด์ƒ ๊ธฐ์ƒ ๊ฐ์ง€ ์‹œ ๊ธด๊ธ‰ ์ „์†ก
- GPS ๋ชจ๋“ˆ๋กœ ์œ„์น˜ ์ •๋ณด ํฌํ•จ
- ๋ฐ์ดํ„ฐ ๋กœ๊น… (SD ์นด๋“œ)

๐Ÿ  ํ™ˆ ์ž๋™ํ™” ์‹œ์Šคํ…œ

ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ์ง‘ ์•ˆ ๊ณณ๊ณณ์— ์„ผ์„œ์™€ ์•ก์ถ”์—์ดํ„ฐ๋ฅผ ์„ค์น˜ํ•ด์„œ ์Šค๋งˆํŠธํ™ˆ์„ ๊ตฌ์ถ•ํ•˜๋Š” ํ”„๋กœ์ ํŠธ.

์ œ์–ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋“ค
- ์กฐ๋ช… on/off
- ์ปคํŠผ ๊ฐœํ
- ์—์–ด์ปจ/ํžˆํ„ฐ ์ œ์–ด
- ์ฐฝ๋ฌธ ๊ฐœํ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง
- ๊ฐ€์Šค/ํ™”์žฌ ๊ฐ์ง€

๊ตฌํ˜„ ํฌ์ธํŠธ
- ์–‘๋ฐฉํ–ฅ ํ†ต์‹  (๋ช…๋ น ์ „์†ก + ์ƒํƒœ ์ˆ˜์‹ )
- ์ค‘์•™ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ESP32 ์‚ฌ์šฉ (WiFi ์—ฐ๋™)
- ์Œ์„ฑ ์ œ์–ด ์—ฐ๋™ (Google Home, Alexa)
- ์ž๋™ํ™” ์‹œ๋‚˜๋ฆฌ์˜ค ์„ค์ •

์ด๋Ÿฐ ํ”„๋กœ์ ํŠธ๋“ค์„ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ ์‹ค๋ ฅ์„ ์Œ“๋‹ค ๋ณด๋ฉด, ์–ด๋А์ƒˆ LoRa ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ’ช

ํ˜น์‹œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ๋•Œ๋กœ๋Š” ๊ฒฝํ—˜ ๋งŽ์€ ์‚ฌ๋žŒ์˜ ์กฐ์–ธ ํ•œ๋งˆ๋””๊ฐ€ ๋ฉฐ์น ๊ฐ„์˜ ์‚ฝ์งˆ์„ ์ค„์—ฌ์ฃผ๊ฑฐ๋“ ! ๐Ÿ˜Š

๐Ÿ› ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ

๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ํ•ญ์ƒ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€. ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ดค์–ด! ๐Ÿ”ง

โŒ LoRa ์ดˆ๊ธฐํ™” ์‹คํŒจ

์ฆ์ƒ "LoRa ์ดˆ๊ธฐํ™” ์‹คํŒจ!" ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๊ณ  ๋” ์ด์ƒ ์ง„ํ–‰์ด ์•ˆ ๋จ

์›์ธ ๋ฐ ํ•ด๊ฒฐ
1. ๋ฐฐ์„  ํ™•์ธ - SPI ํ•€์ด ์ œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ์ฒดํฌ
2. ์ „์› ํ™•์ธ - 3.3V๊ฐ€ ์ œ๋Œ€๋กœ ๊ณต๊ธ‰๋˜๋Š”์ง€ ํ™•์ธ
3. ์ฃผํŒŒ์ˆ˜ ํ™•์ธ - ๋ชจ๋“ˆ์ด ์ง€์›ํ•˜๋Š” ์ฃผํŒŒ์ˆ˜์ธ์ง€ ์ฒดํฌ
4. NSS ํ•€ - NSS ํ•€ ๋ฒˆํ˜ธ๊ฐ€ ์ฝ”๋“œ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
5. ๋ชจ๋“ˆ ๋ถˆ๋Ÿ‰ - ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ธฐ

๐Ÿ“ก ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ์•ˆ ๋จ

์ฆ์ƒ ์†ก์‹ ๋ถ€๋Š” ์ •์ƒ ์ž‘๋™ํ•˜๋Š”๋ฐ ์ˆ˜์‹ ๋ถ€์—์„œ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์žกํž˜

์›์ธ ๋ฐ ํ•ด๊ฒฐ
1. ํŒŒ๋ผ๋ฏธํ„ฐ ๋ถˆ์ผ์น˜ - SF, BW, CR์ด ์†ก์ˆ˜์‹ ๋ถ€๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์ธ
2. ์ฃผํŒŒ์ˆ˜ ๋ถˆ์ผ์น˜ - ์ •ํ™•ํžˆ ๊ฐ™์€ ์ฃผํŒŒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ฒดํฌ
3. ์•ˆํ…Œ๋‚˜ ๋ฌธ์ œ - ์•ˆํ…Œ๋‚˜๊ฐ€ ์ œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
4. ๊ฑฐ๋ฆฌ ๋ฌธ์ œ - ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์ง€ ์•Š์€์ง€ ์ฒดํฌ
5. ๊ฐ„์„ญ - ์ฃผ๋ณ€์— ๋‹ค๋ฅธ ๋ฌด์„  ๊ธฐ๊ธฐ๊ฐ€ ๋ฐฉํ•ดํ•˜๋Š”์ง€ ํ™•์ธ

๐Ÿ”‹ ๋ฐฐํ„ฐ๋ฆฌ ๋นจ๋ฆฌ ๋‹ณ์Œ

์ฆ์ƒ ๋ฐฐํ„ฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ํ›จ์”ฌ ๋นจ๋ฆฌ ์†Œ๋ชจ๋จ

์›์ธ ๋ฐ ํ•ด๊ฒฐ
1. ์ „์†ก ์ฃผ๊ธฐ - ๋„ˆ๋ฌด ์ž์ฃผ ์ „์†กํ•˜์ง€ ์•Š๋„๋ก ์กฐ์ •
2. TX Power - ํ•„์š” ์ด์ƒ์œผ๋กœ ๋†’๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š๊ธฐ
3. SF ๊ฐ’ - ๋„ˆ๋ฌด ๋†’์œผ๋ฉด ์ „์†ก ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง
4. Sleep ๋ชจ๋“œ - ๋Œ€๊ธฐ ์‹œ๊ฐ„์— Deep Sleep ์‚ฌ์šฉ
5. ์„ผ์„œ ์ „์› - ์„ผ์„œ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ๋„๊ธฐ
6. LED - ๋ถˆํ•„์š”ํ•œ LED๋Š” ๋น„ํ™œ์„ฑํ™”

๐Ÿ“Š ๋ฐ์ดํ„ฐ ์†์‹ค

์ฆ์ƒ ์ผ๋ถ€ ํŒจํ‚ท์ด ์ˆ˜์‹ ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊นจ์ ธ์„œ ์˜ด

์›์ธ ๋ฐ ํ•ด๊ฒฐ
1. ์‹ ํ˜ธ ๊ฐ•๋„ - RSSI๊ฐ€ ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ์•ˆํ…Œ๋‚˜ ๊ฐœ์„ 
2. ๊ฐ„์„ญ - ๋‹ค๋ฅธ LoRa ๊ธฐ๊ธฐ์™€ ์ฑ„๋„ ๋ถ„๋ฆฌ
3. SF ์ฆ๊ฐ€ - ๋” ๋†’์€ SF๋กœ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ
4. CR ์ฆ๊ฐ€ - ์˜ค๋ฅ˜ ์ •์ • ๋น„์œจ ๋†’์ด๊ธฐ
5. ์žฌ์ „์†ก - ACK ์‹œ์Šคํ…œ์œผ๋กœ ์žฌ์ „์†ก ๊ตฌํ˜„
6. CRC ์ฒดํฌ - ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ ์ถ”๊ฐ€

๐ŸŒก๏ธ ์„ผ์„œ ๊ฐ’ ์ด์ƒ

์ฆ์ƒ ์„ผ์„œ์—์„œ ์ด์ƒํ•œ ๊ฐ’์ด ์ฝํžˆ๊ฑฐ๋‚˜ NaN์ด ๋‚˜์˜ด

์›์ธ ๋ฐ ํ•ด๊ฒฐ
1. ๋ฐฐ์„  ํ™•์ธ - ์„ผ์„œ ์—ฐ๊ฒฐ ์ƒํƒœ ์ฒดํฌ
2. ์ „์› ํ™•์ธ - ์„ผ์„œ์— ์ ์ ˆํ•œ ์ „์•• ๊ณต๊ธ‰ ํ™•์ธ
3. ๋Œ€๊ธฐ ์‹œ๊ฐ„ - ์„ผ์„œ ์ฝ๊ธฐ ์ „์— ์ถฉ๋ถ„ํ•œ delay ์ถ”๊ฐ€
4. ์ดˆ๊ธฐํ™” - ์„ผ์„œ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ํ™•์ธ
5. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - ์ตœ์‹  ๋ฒ„์ „ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
6. ์„ผ์„œ ๋ถˆ๋Ÿ‰ - ๋‹ค๋ฅธ ์„ผ์„œ๋กœ ๊ต์ฒด ํ…Œ์ŠคํŠธ

๐Ÿ’ป ์ปดํŒŒ์ผ ์—๋Ÿฌ

์ž์ฃผ ๋‚˜์˜ค๋Š” ์—๋Ÿฌ๋“ค "LoRa.h: No such file"
โ†’ LoRa ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ์•ˆ ๋จ. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งค๋‹ˆ์ €์—์„œ ์„ค์น˜

"'class LoRaClass' has no member named..."
โ†’ ์ž˜๋ชป๋œ ํ•จ์ˆ˜ ์ด๋ฆ„ ์‚ฌ์šฉ. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ ํ™•์ธ

"expected ';' before..."
โ†’ ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ. ์ด์ „ ์ค„ ๋์— ; ์ถ”๊ฐ€

"was not declared in this scope"
โ†’ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์ง€ ์•Š์Œ. ์„ ์–ธ ์œ„์น˜ ํ™•์ธ

๐Ÿ“ˆ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

๊ธฐ๋ณธ ๋™์ž‘์€ ๋˜๋Š”๋ฐ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์›ํ•œ๋‹ค๋ฉด? ์ด ํŒ๋“ค์„ ์ฐธ๊ณ ํ•ด๋ด! ๐Ÿš€

โšก ์ „์†ก ์†๋„ vs ๊ฑฐ๋ฆฌ ์ตœ์ ํ™”

์ƒํ™ฉ๋ณ„ ์ตœ์  ์„ค์ • ๐Ÿƒ ๋น ๋ฅธ ์ „์†ก์ด ํ•„์š”ํ•  ๋•Œ (๊ทผ๊ฑฐ๋ฆฌ)
- SF: 7
- BW: 500 kHz
- CR: 4/5
- ์ „์†ก ์‹œ๊ฐ„: ~10ms
- ๊ฑฐ๋ฆฌ: ~2km

โš–๏ธ ๊ท ํ˜•์žกํžŒ ์„ค์ • (์ค‘๊ฑฐ๋ฆฌ)
- SF: 9
- BW: 125 kHz
- CR: 4/6
- ์ „์†ก ์‹œ๊ฐ„: ~200ms
- ๊ฑฐ๋ฆฌ: ~5km

๐ŸŒ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ (์žฅ๊ฑฐ๋ฆฌ)
- SF: 12
- BW: 125 kHz
- CR: 4/8
- ์ „์†ก ์‹œ๊ฐ„: ~2์ดˆ
- ๊ฑฐ๋ฆฌ: ~15km

๐Ÿ”‹ ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช… ๊ทน๋Œ€ํ™”

// ESP32 Deep Sleep ์˜ˆ์ œ
#include <esp_sleep.h>

#define SLEEP_TIME 600  // 10๋ถ„ (์ดˆ ๋‹จ์œ„)

void setup() {
  // LoRa ์ดˆ๊ธฐํ™” ๋ฐ ๋ฐ์ดํ„ฐ ์ „์†ก
  initLoRa();
  sendSensorData();
  
  // Deep Sleep ์ง„์ž…
  Serial.println("Sleep ๋ชจ๋“œ ์ง„์ž…...");
  esp_sleep_enable_timer_wakeup(SLEEP_TIME * 1000000ULL);
  esp_deep_sleep_start();
}

void loop() {
  // Deep Sleep์—์„œ๋Š” loop ์‹คํ–‰ ์•ˆ ๋จ
}

// ์„ผ์„œ ์ „์› ์ œ์–ด
void powerSensor(bool on) {
  if (on) {
    digitalWrite(SENSOR_POWER_PIN, HIGH);
    delay(100);  // ์„ผ์„œ ์•ˆ์ •ํ™” ๋Œ€๊ธฐ
  } else {
    digitalWrite(SENSOR_POWER_PIN, LOW);
  }
}

๐Ÿ“ก ์•ˆํ…Œ๋‚˜ ์ตœ์ ํ™”

๐Ÿ’ก ์•ˆํ…Œ๋‚˜ ์„ ํƒ ๊ฐ€์ด๋“œ 1. ์Šคํ”„๋ง ์•ˆํ…Œ๋‚˜ (๊ธฐ๋ณธ)
- ๊ฐ€๊ฒฉ: ์ €๋ ด
- ์„ฑ๋Šฅ: ๋ณดํ†ต
- ์šฉ๋„: ํ…Œ์ŠคํŠธ, ๊ทผ๊ฑฐ๋ฆฌ

2. ๋‹ค์ดํด ์•ˆํ…Œ๋‚˜
- ๊ฐ€๊ฒฉ: ์ค‘๊ฐ„
- ์„ฑ๋Šฅ: ์ข‹์Œ
- ์šฉ๋„: ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์ ํŠธ

3. ์•ผ๊ธฐ ์•ˆํ…Œ๋‚˜ (์ง€ํ–ฅ์„ฑ)
- ๊ฐ€๊ฒฉ: ๋น„์Œˆ
- ์„ฑ๋Šฅ: ๋งค์šฐ ์ข‹์Œ (ํŠน์ • ๋ฐฉํ–ฅ)
- ์šฉ๋„: ๊ณ ์ • ํฌ์ธํŠธ ๊ฐ„ ํ†ต์‹ 

4. ์˜ด๋‹ˆ ์•ˆํ…Œ๋‚˜
- ๊ฐ€๊ฒฉ: ๋น„์Œˆ
- ์„ฑ๋Šฅ: ๋งค์šฐ ์ข‹์Œ (์ „๋ฐฉํ–ฅ)
- ์šฉ๋„: ๊ฒŒ์ดํŠธ์›จ์ด, ์ค‘์•™ ํ—ˆ๋ธŒ

๐ŸŽฏ ๋ฐ์ดํ„ฐ ์••์ถ•

LoRa๋Š” ์ „์†ก ์†๋„๊ฐ€ ๋А๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•˜๋ฉด ์ „์†ก ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด:

// ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ „์†ก (float ๋Œ€์‹ )
// ์˜ˆ: ์˜จ๋„ 23.5ยฐC โ†’ 235 (10๋ฐฐ)

void sendCompressedData(float temp, float humi) {
  int16_t tempInt = (int16_t)(temp * 10);
  int16_t humiInt = (int16_t)(humi * 10);
  
  byte data[4];
  data[0] = tempInt >> 8;
  data[1] = tempInt & 0xFF;
  data[2] = humiInt >> 8;
  data[3] = humiInt & 0xFF;
  
  LoRa.beginPacket();
  LoRa.write(data, 4);  // 4๋ฐ”์ดํŠธ๋งŒ ์ „์†ก!
  LoRa.endPacket();
}

// ์ˆ˜์‹ ๋ถ€์—์„œ ๋ณต์›
void receiveCompressedData() {
  if (LoRa.parsePacket() == 4) {
    byte data[4];
    LoRa.readBytes(data, 4);
    
    int16_t tempInt = (data[0] << 8) | data[1];
    int16_t humiInt = (data[2] << 8) | data[3];
    
    float temp = tempInt / 10.0;
    float humi = humiInt / 10.0;
    
    Serial.print("์˜จ๋„: ");
    Serial.println(temp);
    Serial.print("์Šต๋„: ");
    Serial.println(humi);
  }
}

JSON์œผ๋กœ ๋ณด๋‚ด๋ฉด 30~40๋ฐ”์ดํŠธ์ธ๋ฐ, ์ด๋ ‡๊ฒŒ ์••์ถ•ํ•˜๋ฉด 4๋ฐ”์ดํŠธ๋กœ ์ค„์–ด๋“ค์–ด! ์ „์†ก ์‹œ๊ฐ„์ด 1/10๋กœ ์ค„์–ด๋“œ๋Š” ๊ฑฐ์ง€. ๐Ÿ˜Ž

๐ŸŒ LoRaWAN๊ณผ์˜ ์ฐจ์ด์ 

LoRa๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด LoRaWAN์ด๋ผ๋Š” ์šฉ์–ด๋„ ์ž์ฃผ ๋‚˜์™€. ์ด ๋‘˜์€ ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ? ๐Ÿค”

LoRa vs LoRaWAN ๋น„๊ต
๊ตฌ๋ถ„ LoRa LoRaWAN
์ •์˜ ๋ฌผ๋ฆฌ ๊ณ„์ธต ๋ณ€์กฐ ๊ธฐ์ˆ  ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ
๊ตฌ์กฐ Point-to-Point Star-of-Stars
๋ณต์žก๋„ ๊ฐ„๋‹จ ๋ณต์žก
๋ณด์•ˆ ์ง์ ‘ ๊ตฌํ˜„ ํ•„์š” ๋‚ด์žฅ (AES-128)
๋น„์šฉ ๋ฌด๋ฃŒ ๊ฒŒ์ดํŠธ์›จ์ด + ์„œ๋ฒ„ ํ•„์š”
์šฉ๋„ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ, ์†Œ๊ทœ๋ชจ ์ƒ์—…์šฉ, ๋Œ€๊ทœ๋ชจ

๐Ÿข LoRaWAN์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

LoRaWAN์„ ์„ ํƒํ•ด์•ผ ํ•  ๋•Œ โœ… ์ˆ˜๋ฐฑ~์ˆ˜์ฒœ ๊ฐœ์˜ ๋…ธ๋“œ ๊ด€๋ฆฌ
โœ… ์ „๊ตญ ๋‹จ์œ„ ์ปค๋ฒ„๋ฆฌ์ง€ ํ•„์š”
โœ… ์ƒ์—…์šฉ ์„œ๋น„์Šค ๊ตฌ์ถ•
โœ… ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ํ•„์š”
โœ… ํด๋ผ์šฐ๋“œ ์—ฐ๋™ ํ•„์ˆ˜
โœ… ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ํ•„์š”

์ผ๋ฐ˜ LoRa๋กœ ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ

โœ… ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ
โœ… ์†Œ๊ทœ๋ชจ ๋„คํŠธ์›Œํฌ (10๊ฐœ ์ดํ•˜)
โœ… ์ œํ•œ๋œ ์ง€์—ญ (๋†์žฅ, ๊ฑด๋ฌผ ๋“ฑ)
โœ… ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘
โœ… ์ €๋น„์šฉ ๊ตฌํ˜„
โœ… ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์œผ๋กœ ์ถฉ๋ถ„

๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ํ•™์Šต ๋ชฉ์ ์ด๋ผ๋ฉด ์ผ๋ฐ˜ LoRa๋กœ ์ถฉ๋ถ„ํ•ด! LoRaWAN์€ ๋‚˜์ค‘์— ํ•„์š”ํ•  ๋•Œ ๋ฐฐ์›Œ๋„ ๋Šฆ์ง€ ์•Š์•„. ๐Ÿ˜Š

๐ŸŽ“ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๋ฉด LoRa์˜ ๊ธฐ๋ณธ์€ ๋งˆ์Šคํ„ฐํ•œ ๊ฑฐ์•ผ! ํ•˜์ง€๋งŒ ๋ฐฐ์›€์—๋Š” ๋์ด ์—†์ง€. ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์ถ”์ฒœํ•ด: ๐Ÿ“š

๐Ÿ“– ์ถ”์ฒœ ํ•™์Šต ์ž๋ฃŒ

๐ŸŒŸ ๊ณต์‹ ๋ฌธ์„œ - Semtech SX127x ๋ฐ์ดํ„ฐ์‹œํŠธ
- LoRa Alliance ๊ณต์‹ ์‚ฌ์ดํŠธ
- Arduino LoRa ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ GitHub

๐Ÿ“บ ์˜จ๋ผ์ธ ๊ฐ•์˜
- YouTube: Andreas Spiess ์ฑ„๋„ (LoRa ์ „๋ฌธ)
- Udemy: IoT with LoRa ๊ฐ•์˜
- Coursera: Wireless Communication ๊ฐ•์˜

๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ
- Arduino Forum
- Reddit r/LoRa
- The Things Network ์ปค๋ฎค๋‹ˆํ‹ฐ
- ๊ตญ๋‚ด IoT ๊ฐœ๋ฐœ์ž ์นดํŽ˜

๐Ÿ› ๏ธ ์‹ค์Šต ํ”„๋กœ์ ํŠธ ์ถ”์ฒœ

๐Ÿ’ก ๋‹จ๊ณ„๋ณ„ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธ‰
1. ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ์†ก์ˆ˜์‹ 
2. ์˜จ์Šต๋„ ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ „์†ก
3. LED ์›๊ฒฉ ์ œ์–ด

์ค‘๊ธ‰
4. ๋ฉ€ํ‹ฐ ์„ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ
5. GPS ์œ„์น˜ ์ถ”์ ๊ธฐ
6. ์Šค๋งˆํŠธ ๋„์–ด๋ฝ

๊ณ ๊ธ‰
7. ๋ฉ”์‹œ ๋„คํŠธ์›Œํฌ ๊ตฌํ˜„
8. LoRaWAN ๊ฒŒ์ดํŠธ์›จ์ด ์ œ์ž‘
9. AI ์—ฐ๋™ ์Šค๋งˆํŠธ ์‹œ์Šคํ…œ

๐ŸŽฏ ์‹ค๋ ฅ ํ–ฅ์ƒ ํŒ

1. ๋งค์ผ ์กฐ๊ธˆ์”ฉ - ํ•˜๋ฃจ 30๋ถ„์ด๋ผ๋„ ๊พธ์ค€ํžˆ ํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด
2. ์ง์ ‘ ๋งŒ๋“ค๊ธฐ - ํŠœํ† ๋ฆฌ์–ผ๋งŒ ๋”ฐ๋ผํ•˜์ง€ ๋ง๊ณ  ์ž๊ธฐ๋งŒ์˜ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ
3. ๋ฌธ์ œ ํ•ด๊ฒฐ - ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฉด ํฌ๊ธฐํ•˜์ง€ ๋ง๊ณ  ๋๊นŒ์ง€ ํ•ด๊ฒฐํ•ด๋ณด๊ธฐ
4. ๊ณต์œ ํ•˜๊ธฐ - ๋ธ”๋กœ๊ทธ๋‚˜ GitHub์— ํ”„๋กœ์ ํŠธ ๊ณต์œ ํ•˜๊ธฐ
5. ํ”ผ๋“œ๋ฐฑ - ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ›๊ธฐ

ํ˜น์‹œ ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋ฉ˜ํ† ๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์˜ 1:1 ์ฝ”์นญ์„ ๋ฐ›์œผ๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ! ๐Ÿš€

๐ŸŽฌ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์™€, ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ๋А๋ผ ์ˆ˜๊ณ ํ–ˆ์–ด! ๐Ÿ‘ LoRa ํ†ต์‹ ์— ๋Œ€ํ•ด ๊ฝค ๋งŽ์€ ๊ฑธ ๋ฐฐ์› ์ง€?

์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•ด ๋ณด์˜€์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ง‰์ƒ ํ•ด๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์•„. ํ•˜๋“œ์›จ์–ด ์—ฐ๊ฒฐํ•˜๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ํ•˜๊ณ , ์˜ˆ์ œ ์ฝ”๋“œ ๋Œ๋ ค๋ณด๊ณ ... ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผํ•˜๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ์ž๊ธฐ๋งŒ์˜ IoT ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ณ  ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ˜Š

๐ŸŽฏ ํ•ต์‹ฌ ์š”์•ฝ โœจ LoRa๋Š” ์žฅ๊ฑฐ๋ฆฌ ์ €์ „๋ ฅ ํ†ต์‹ ์˜ ์ตœ๊ฐ•์ž
โœจ SF, BW, CR ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์„ฑ๋Šฅ ์กฐ์ ˆ ๊ฐ€๋Šฅ
โœจ Arduino + LoRa ๋ชจ๋“ˆ๋กœ ์‰ฝ๊ฒŒ ์‹œ์ž‘ ๊ฐ€๋Šฅ
โœจ ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋ถ€ํ„ฐ ์›๊ฒฉ ์ œ์–ด๊นŒ์ง€ ๋‹ค์–‘ํ•œ ํ™œ์šฉ
โœจ ์‹ค์ „ ํ”„๋กœ์ ํŠธ๋กœ ์‹ค๋ ฅ ํ–ฅ์ƒ
โœจ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๊ธฐ

๊ธฐ์–ตํ•ด! ๋ชจ๋“  ์ „๋ฌธ๊ฐ€๋„ ์ฒ˜์Œ์—” ์ดˆ๋ณด์˜€์–ด. ์ค‘์š”ํ•œ ๊ฑด ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ํฌ๊ธฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์•ผ. ์—๋Ÿฌ๊ฐ€ ๋‚˜๋„ ์ขŒ์ ˆํ•˜์ง€ ๋ง๊ณ , ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๊ณ  ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ’ช

LoRa๋Š” ์ •๋ง ์žฌ๋ฏธ์žˆ๊ณ  ์‹ค์šฉ์ ์ธ ๊ธฐ์ˆ ์ด์•ผ. ๋†์žฅ์—์„œ, ๋„์‹œ์—์„œ, ์‚ฐ์—์„œ, ๋ฐ”๋‹ค์—์„œ... ์–ด๋””์„œ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง„ ์ผ์ด์•ผ? ๐ŸŒ

์ž, ์ด์ œ ์ปดํ“จํ„ฐ ์•ž์—๋งŒ ์•‰์•„์žˆ์ง€ ๋ง๊ณ  ์ง์ ‘ ๋งŒ๋“ค์–ด๋ด! Arduino ๊บผ๋‚ด๊ณ , LoRa ๋ชจ๋“ˆ ์—ฐ๊ฒฐํ•˜๊ณ , ์ฝ”๋“œ ์—…๋กœ๋“œํ•˜๊ณ ... ์ฒซ ๋ฒˆ์งธ ํŒจํ‚ท์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ „์†ก๋˜๋Š” ์ˆœ๊ฐ„์˜ ๊ทธ ์งœ๋ฆฟํ•จ์„ ๋А๊ปด๋ด! ๐ŸŽ‰

ํ–‰์šด์„ ๋นŒ์–ด! ๊ทธ๋ฆฌ๊ณ  ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๋ฉด ๊ผญ ๊ณต์œ ํ•ด์ค˜. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ์˜๊ฐ์„ ์ค„ ์ˆ˜ ์žˆ์„ ํ…Œ๋‹ˆ๊นŒ! ๐Ÿ˜„

๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„๋Š”? 1. ์ง€๊ธˆ ๋‹น์žฅ Arduino์™€ LoRa ๋ชจ๋“ˆ ์ฃผ๋ฌธํ•˜๊ธฐ
2. ๊ธฐ๋ณธ ์˜ˆ์ œ ์ฝ”๋“œ ์‹คํ–‰ํ•ด๋ณด๊ธฐ
3. ์„ผ์„œ ์ถ”๊ฐ€ํ•ด์„œ ๋ฐ์ดํ„ฐ ์ „์†กํ•ด๋ณด๊ธฐ
4. ์ž๊ธฐ๋งŒ์˜ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด ๊ตฌ์ƒํ•˜๊ธฐ
5. ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ฐธ์—ฌํ•ด์„œ ๊ฒฝํ—˜ ๊ณต์œ ํ•˜๊ธฐ

์ง€๊ธˆ ๋ฐ”๋กœ ์‹œ์ž‘ํ•ด! ๋‚ด์ผ๋กœ ๋ฏธ๋ฃจ์ง€ ๋ง๊ณ ! โšก

Happy Coding! ๐ŸŽจโœจ

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.