์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŽฏ ์•„๋‘์ด๋…ธ RFID ํƒœ๊ทธ ๋ฆฌ๋”๊ธฐ ์™„์ „์ •๋ณต

๐ŸŽฏ ์•„๋‘์ด๋…ธ RFID ํƒœ๊ทธ ๋ฆฌ๋”๊ธฐ ์™„์ „์ •๋ณต

์ดˆ๋ณด์ž๋„ ๋”ฐ๋ผํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ „ ์†Œ์Šค์ฝ”๋“œ ๊ฐ€์ด๋“œ

์•ˆ๋…•! ์˜ค๋Š˜์€ ์•„๋‘์ด๋…ธ๋กœ RFID ํƒœ๊ทธ ๋ฆฌ๋”๊ธฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ๊นŒ ํ•ด. ๐Ÿš€
ํ˜น์‹œ ์นด๋“œ ํ•œ ์žฅ์œผ๋กœ ๋ฌธ์„ ์—ด๊ฑฐ๋‚˜, ์ถœ์ž…์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ ๋ณธ ์  ์žˆ์ง€? ๊ทธ๊ฒŒ ๋ฐ”๋กœ RFID ๊ธฐ์ˆ ์ด์•ผ.
์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์œผ๋‹ˆ๊นŒ ํŽธํ•˜๊ฒŒ ๋”ฐ๋ผ์™€๋ด!

์š”์ฆ˜ ๋ฉ”์ด์ปค ๋ฌธํ™”๊ฐ€ ํ™œ๋ฐœํ•ด์ง€๋ฉด์„œ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ์•„๋‘์ด๋…ธ ๊ด€๋ จ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์•„์กŒ์–ด.
ํŠนํžˆ RFID๋Š” ์‹ค์ƒํ™œ์— ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ธ๊ธฐ๊ฐ€ ์ •๋ง ๋งŽ์ง€.
์ž, ๊ทธ๋Ÿผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? ๐Ÿ˜Š

RFID ์นด๋“œ ๋ฆฌ๋”๊ธฐ ๋ฌด์„  ํ†ต์‹  RFID ์‹œ์Šคํ…œ ์ž‘๋™ ์›๋ฆฌ

๐Ÿ” RFID๊ฐ€ ๋ญ๊ธธ๋ž˜?

RFID๋Š” Radio Frequency Identification์˜ ์•ฝ์ž์•ผ.
์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์ „ํŒŒ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฌผ๊ฑด์ด๋‚˜ ์‚ฌ๋žŒ์„ ์‹๋ณ„ํ•˜๋Š” ๊ธฐ์ˆ ์ด์ง€.
๋ฐ”์ฝ”๋“œ์ฒ˜๋Ÿผ ์ผ์ผ์ด ์Šค์บ”ํ•  ํ•„์š” ์—†์ด, ๊ฐ€๊นŒ์ด๋งŒ ๊ฐ€์ ธ๊ฐ€๋„ ์ธ์‹์ด ๋ผ์„œ ์—„์ฒญ ํŽธ๋ฆฌํ•ด.

๐Ÿ’ก RFID์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ

1. ํƒœ๊ทธ(Tag): ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์นฉ์ด ๋“ค์–ด์žˆ๋Š” ์นด๋“œ๋‚˜ ์Šคํ‹ฐ์ปค
2. ๋ฆฌ๋”๊ธฐ(Reader): ํƒœ๊ทธ์˜ ์ •๋ณด๋ฅผ ์ฝ์–ด๋‚ด๋Š” ์žฅ์น˜
3. ์•ˆํ…Œ๋‚˜: ์ „ํŒŒ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋Š” ๋ถ€๋ถ„
4. ์ปจํŠธ๋กค๋Ÿฌ: ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‘๋‡Œ ์—ญํ•  (์—ฌ๊ธฐ์„œ๋Š” ์•„๋‘์ด๋…ธ!)

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋ณด๋Š” ๊ตํ†ต์นด๋“œ, ์ถœ์ž…์นด๋“œ, ๋„์„œ๊ด€ ์ฑ… ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๋“ฑ์ด ๋ชจ๋‘ RFID ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด.
์‹ฌ์ง€์–ด ๋ฐ˜๋ ค๋™๋ฌผ ์ธ์‹์นฉ๋„ RFID์•ผ! ๐Ÿ•
์ƒ๊ฐ๋ณด๋‹ค ์šฐ๋ฆฌ ์ƒํ™œ ๊ณณ๊ณณ์— ์Šค๋ฉฐ๋“ค์–ด ์žˆ๋Š” ๊ธฐ์ˆ ์ด์ง€?

๐Ÿ› ๏ธ ํ•„์š”ํ•œ ์ค€๋น„๋ฌผ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด๊ธฐ ์ „์— ๋ญ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์ฒดํฌํ•ด๋ณผ๊นŒ?
๋‹คํ–‰ํžˆ ์•„๋‘์ด๋…ธ RFID ํ”„๋กœ์ ํŠธ๋Š” ๋ถ€ํ’ˆ์ด ๋งŽ์ง€ ์•Š์•„์„œ ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด.

๐Ÿ“ฆ ํ•˜๋“œ์›จ์–ด ์ค€๋น„๋ฌผ

โ€ข ์•„๋‘์ด๋…ธ ์šฐ๋…ธ(Arduino Uno) - ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ณด๋“œ๋ฉด ์ถฉ๋ถ„ํ•ด
โ€ข RC522 RFID ๋ชจ๋“ˆ - ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” 13.56MHz ๋ชจ๋“ˆ
โ€ข RFID ์นด๋“œ/ํƒœ๊ทธ - ๋ณดํ†ต ๋ชจ๋“ˆ ์‚ด ๋•Œ 2~3๊ฐœ ๊ฐ™์ด ์™€
โ€ข ์ ํผ ์™€์ด์–ด - ์ˆ˜-์•” ํƒ€์ž…์œผ๋กœ 7๊ฐœ ์ •๋„
โ€ข ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ - ์„ ํƒ์‚ฌํ•ญ์ด์ง€๋งŒ ์žˆ์œผ๋ฉด ํŽธํ•ด
โ€ข USB ์ผ€์ด๋ธ” - ์•„๋‘์ด๋…ธ ์—ฐ๊ฒฐ์šฉ

๐Ÿ’ป ์†Œํ”„ํŠธ์›จ์–ด ์ค€๋น„๋ฌผ

โ€ข ์•„๋‘์ด๋…ธ IDE - ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ๋ฌด๋ฃŒ ๋‹ค์šด๋กœ๋“œ
โ€ข MFRC522 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งค๋‹ˆ์ €์—์„œ ์„ค์น˜ ๊ฐ€๋Šฅ
โ€ข USB ๋“œ๋ผ์ด๋ฒ„ - ๋ณดํ†ต ์ž๋™ ์„ค์น˜๋˜์ง€๋งŒ ์•ˆ ๋˜๋ฉด ๋”ฐ๋กœ ์„ค์น˜

๐ŸŽฏ ์ดˆ๋ณด์ž ํŒ!

์ฒ˜์Œ์ด๋ผ๋ฉด ์•„๋‘์ด๋…ธ ์Šคํƒ€ํ„ฐ ํ‚คํŠธ๋ฅผ ์‚ฌ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ.
RC522 ๋ชจ๋“ˆ์€ ์˜จ๋ผ์ธ์—์„œ 5์ฒœ์› ์ •๋„๋ฉด ๊ตฌํ•  ์ˆ˜ ์žˆ๊ณ ,
์•„๋‘์ด๋…ธ ์šฐ๋…ธ๋Š” ์ •ํ’ˆ ๊ธฐ์ค€ 3๋งŒ์› ๋‚ด์™ธ์•ผ.
ํ˜ธํ™˜ ๋ณด๋“œ๋Š” ๋” ์ €๋ ดํ•˜๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฒ˜์Œ์—” ์ •ํ’ˆ์„ ์ถ”์ฒœํ•ด!

๐Ÿ”Œ ํ•˜๋“œ์›จ์–ด ์—ฐ๊ฒฐํ•˜๊ธฐ

์ž, ์ด์ œ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐํ•ด๋ณผ ์‹œ๊ฐ„์ด์•ผ! ๐Ÿ˜Š
RC522 ๋ชจ๋“ˆ๊ณผ ์•„๋‘์ด๋…ธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฑด ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ด.
ํ•˜์ง€๋งŒ ํ•€ ์—ฐ๊ฒฐ์„ ์ •ํ™•ํ•˜๊ฒŒ ํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ ์ฒœ์ฒœํžˆ ๋”ฐ๋ผ์™€๋ด.

Arduino UNO SDA โ†’ 10 SCK โ†’ 13 MOSI โ†’ 11 MISO โ†’ 12 GND โ†’ GND RST โ†’ 9 3.3V โ†’ 3.3V RC522 Module RFID ํ•€ ์—ฐ๊ฒฐ ๋‹ค์ด์–ด๊ทธ๋žจ

โš ๏ธ ์ค‘์š”ํ•œ ์ฃผ์˜์‚ฌํ•ญ!

RC522 ๋ชจ๋“ˆ์€ 3.3V๋กœ ๋™์ž‘ํ•ด!
์ ˆ๋Œ€๋กœ 5V์— ์—ฐ๊ฒฐํ•˜๋ฉด ์•ˆ ๋ผ. ๋ชจ๋“ˆ์ด ๊ณ ์žฅ๋‚  ์ˆ˜ ์žˆ์–ด.
์•„๋‘์ด๋…ธ์˜ 3.3V ํ•€์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฑธ ๊ผญ ํ™•์ธํ•˜์ž!

๐Ÿ”ง ์ƒ์„ธ ์—ฐ๊ฒฐ ๊ฐ€์ด๋“œ

RC522 ๋ชจ๋“ˆ์—๋Š” 8๊ฐœ์˜ ํ•€์ด ์žˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” 7๊ฐœ๋งŒ ์‚ฌ์šฉํ•  ๊ฑฐ์•ผ.

RC522 โ†’ Arduino
โ€ข SDA (SS) โ†’ Digital 10๋ฒˆ ํ•€
โ€ข SCK โ†’ Digital 13๋ฒˆ ํ•€
โ€ข MOSI โ†’ Digital 11๋ฒˆ ํ•€
โ€ข MISO โ†’ Digital 12๋ฒˆ ํ•€
โ€ข IRQ โ†’ ์—ฐ๊ฒฐ ์•ˆ ํ•จ (๋น„์›Œ๋‘ฌ๋„ ๋ผ)
โ€ข GND โ†’ GND
โ€ข RST โ†’ Digital 9๋ฒˆ ํ•€
โ€ข 3.3V โ†’ 3.3V

์—ฐ๊ฒฐํ•  ๋•Œ๋Š” ์ ํผ ์™€์ด์–ด์˜ ์ƒ‰๊น”์„ ๊ตฌ๋ถ„ํ•ด์„œ ์“ฐ๋ฉด ๋‚˜์ค‘์— ๋””๋ฒ„๊น…ํ•  ๋•Œ ํŽธํ•ด.
์˜ˆ๋ฅผ ๋“ค์–ด ์ „์›์€ ๋นจ๊ฐ•, ๊ทธ๋ผ์šด๋“œ๋Š” ๊ฒ€์ •, ์‹ ํ˜ธ์„ ์€ ๋‹ค๋ฅธ ์ƒ‰์œผ๋กœ ํ•˜๋Š” ์‹์ด์ง€.
์ฒ˜์Œ์—” ๊ท€์ฐฎ์•„ ๋ณด์—ฌ๋„ ๋‚˜์ค‘์— ์—„์ฒญ ๋„์›€์ด ๋ผ! ๐ŸŽจ

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

ํ•˜๋“œ์›จ์–ด ์—ฐ๊ฒฐ์ด ๋๋‚ฌ๋‹ค๋ฉด ์ด์ œ ์†Œํ”„ํŠธ์›จ์–ด ์ค€๋น„๋ฅผ ํ•ด์•ผ ํ•ด.
์•„๋‘์ด๋…ธ IDE์—์„œ RFID ๋ชจ๋“ˆ์„ ์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด๋ณด์ž!

๐Ÿ”ฝ MFRC522 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 1: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งค๋‹ˆ์ € ์‚ฌ์šฉ (์ถ”์ฒœ)

1. ์•„๋‘์ด๋…ธ IDE๋ฅผ ์—ด์–ด
2. ์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ ์Šค์ผ€์น˜ โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌํ•จํ•˜๊ธฐ โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ ํด๋ฆญ
3. ๊ฒ€์ƒ‰์ฐฝ์— "MFRC522" ์ž…๋ ฅ
4. "MFRC522 by GithubCommunity" ์ฐพ์•„์„œ ์„ค์น˜ ๋ฒ„ํŠผ ํด๋ฆญ
5. ์„ค์น˜ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค (๋ช‡ ์ดˆ๋ฉด ๋๋‚˜)

๋ฐฉ๋ฒ• 2: ์ˆ˜๋™ ์„ค์น˜

1. GitHub์—์„œ MFRC522 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œ
2. ZIP ํŒŒ์ผ์„ ์•„๋‘์ด๋…ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋”์— ์••์ถ• ํ•ด์ œ
3. ์•„๋‘์ด๋…ธ IDE ์žฌ์‹œ์ž‘

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์น˜๋๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด,
ํŒŒ์ผ โ†’ ์˜ˆ์ œ โ†’ MFRC522 ๋ฉ”๋‰ด๋ฅผ ์—ด์–ด๋ด.
์—ฌ๋Ÿฌ ์˜ˆ์ œ ํŒŒ์ผ๋“ค์ด ๋ณด์ด๋ฉด ์„ฑ๊ณต์ด์•ผ! ๐ŸŽ‰

๐Ÿ’ป ๊ธฐ๋ณธ ์†Œ์Šค์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

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

๐ŸŽฏ ์นด๋“œ UID ์ฝ๊ธฐ - ๊ธฐ๋ณธ ์˜ˆ์ œ

๋จผ์ € ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์ธ RFID ์นด๋“œ์˜ ๊ณ ์œ ๋ฒˆํ˜ธ(UID)๋ฅผ ์ฝ๋Š” ์ฝ”๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์ž.
์ด๊ฑด ๋ชจ๋“  RFID ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ์•ผ.


// ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
#include <SPI.h>
#include <MFRC522.h>

// ํ•€ ๋ฒˆํ˜ธ ์ •์˜
#define SS_PIN 10
#define RST_PIN 9

// MFRC522 ๊ฐ์ฒด ์ƒ์„ฑ
MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  // ์‹œ๋ฆฌ์–ผ ํ†ต์‹  ์‹œ์ž‘ (๋””๋ฒ„๊น…์šฉ)
  Serial.begin(9600);
  
  // SPI ํ†ต์‹  ์‹œ์ž‘
  SPI.begin();
  
  // RFID ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™”
  rfid.PCD_Init();
  
  // ์‹œ์ž‘ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
  Serial.println("RFID ๋ฆฌ๋”๊ธฐ ์ค€๋น„ ์™„๋ฃŒ!");
  Serial.println("์นด๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค ๋Œ€์„ธ์š”...");
}

void loop() {
  // ์ƒˆ๋กœ์šด ์นด๋“œ๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌํ„ด
  if (!rfid.PICC_IsNewCardPresent()) {
    return;
  }
  
  // ์นด๋“œ ์ •๋ณด๋ฅผ ์ฝ์ง€ ๋ชปํ•˜๋ฉด ๋ฆฌํ„ด
  if (!rfid.PICC_ReadCardSerial()) {
    return;
  }
  
  // ์นด๋“œ UID ์ถœ๋ ฅ
  Serial.print("์นด๋“œ UID: ");
  for (byte i = 0; i < rfid.uid.size; i++) {
    Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(rfid.uid.uidByte[i], HEX);
  }
  Serial.println();
  
  // ์นด๋“œ ์ฝ๊ธฐ ์ข…๋ฃŒ
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
}

๐Ÿ’ก ์ฝ”๋“œ ์„ค๋ช…

โ€ข #include: ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€
โ€ข #define: ํ•€ ๋ฒˆํ˜ธ๋ฅผ ์ƒ์ˆ˜๋กœ ์ •์˜ํ•ด์„œ ๋‚˜์ค‘์— ์ˆ˜์ •ํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด
โ€ข MFRC522 rfid(): RFID ๋ชจ๋“ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด
โ€ข setup(): ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ํ•  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜
โ€ข loop(): ๊ณ„์† ๋ฐ˜๋ณต ์‹คํ–‰๋˜๋Š” ๋ฉ”์ธ ํ•จ์ˆ˜
โ€ข PICC_IsNewCardPresent(): ์ƒˆ ์นด๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
โ€ข PICC_ReadCardSerial(): ์นด๋“œ ์ •๋ณด๋ฅผ ์ฝ์–ด์™€
โ€ข rfid.uid.uidByte[]: ์นด๋“œ์˜ ๊ณ ์œ ๋ฒˆํ˜ธ ๋ฐฐ์—ด

์ด ์ฝ”๋“œ๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์—ด์–ด๋ด (Ctrl+Shift+M).
๊ทธ๋ฆฌ๊ณ  RFID ์นด๋“œ๋ฅผ ๋ฆฌ๋”๊ธฐ์— ๊ฐ€์ ธ๋‹ค ๋Œ€๋ฉด ์นด๋“œ์˜ UID๊ฐ€ ์ถœ๋ ฅ๋  ๊ฑฐ์•ผ!
์ฒ˜์Œ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ์˜ ๊ทธ ์งœ๋ฆฟํ•จ์ด๋ž€... ์ •๋ง ์ตœ๊ณ ์ง€! ๐ŸŽŠ

๐Ÿ” ์ถœ์ž… ํ†ต์ œ ์‹œ์Šคํ…œ ๋งŒ๋“ค๊ธฐ

์ด์ œ ์ข€ ๋” ์‹ค์šฉ์ ์ธ ํ”„๋กœ์ ํŠธ๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊นŒ?
ํŠน์ • ์นด๋“œ๋งŒ ์ธ์‹ํ•˜๋Š” ์ถœ์ž… ํ†ต์ œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณด์ž!
์ด๊ฑด ์‹ค์ œ๋กœ ์‚ฌ๋ฌด์‹ค์ด๋‚˜ ์ง‘์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด์•ผ. ๐Ÿข

๐Ÿšช LED์™€ ๋ถ€์ €๋ฅผ ํ™œ์šฉํ•œ ์ถœ์ž… ์‹œ์Šคํ…œ

์ด๋ฒˆ์—” LED์™€ ๋ถ€์ €๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์‹œ๊ฐ์ , ์ฒญ๊ฐ์  ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๋Š” ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์•ผ.
๋“ฑ๋ก๋œ ์นด๋“œ๋ฉด ์ดˆ๋ก LED๊ฐ€ ์ผœ์ง€๊ณ , ๋ฏธ๋“ฑ๋ก ์นด๋“œ๋ฉด ๋นจ๊ฐ„ LED๊ฐ€ ์ผœ์ง€๋Š” ์‹์ด์ง€.

๐Ÿ”ง ์ถ”๊ฐ€ ๋ถ€ํ’ˆ

โ€ข ์ดˆ๋ก์ƒ‰ LED 1๊ฐœ
โ€ข ๋นจ๊ฐ„์ƒ‰ LED 1๊ฐœ
โ€ข ์ €ํ•ญ 220ฮฉ 2๊ฐœ
โ€ข ๋ถ€์ €(Buzzer) 1๊ฐœ (์„ ํƒ์‚ฌํ•ญ)
โ€ข ์ ํผ ์™€์ด์–ด ์ถ”๊ฐ€


#include <SPI.h>
#include <MFRC522.h>

// ํ•€ ์ •์˜
#define SS_PIN 10
#define RST_PIN 9
#define GREEN_LED 6
#define RED_LED 7
#define BUZZER 8

// RFID ๋ชจ๋“ˆ ๊ฐ์ฒด ์ƒ์„ฑ
MFRC522 rfid(SS_PIN, RST_PIN);

// ๋“ฑ๋ก๋œ ์นด๋“œ UID (์—ฌ๊ธฐ์— ์ž์‹ ์˜ ์นด๋“œ UID๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”)
byte authorizedUID[] = {0xDE, 0xAD, 0xBE, 0xEF};

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  
  // LED์™€ ๋ถ€์ € ํ•€ ์„ค์ •
  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  
  // ์ดˆ๊ธฐ ์ƒํƒœ ์„ค์ •
  digitalWrite(GREEN_LED, LOW);
  digitalWrite(RED_LED, LOW);
  digitalWrite(BUZZER, LOW);
  
  Serial.println("=== ์ถœ์ž… ํ†ต์ œ ์‹œ์Šคํ…œ ์‹œ์ž‘ ===");
  Serial.println("์นด๋“œ๋ฅผ ํƒœ๊ทธํ•˜์„ธ์š”...");
}

void loop() {
  // ์นด๋“œ ๊ฐ์ง€ ๋Œ€๊ธฐ
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
    return;
  }
  
  // ์นด๋“œ UID ์ถœ๋ ฅ
  Serial.print("๊ฐ์ง€๋œ ์นด๋“œ UID: ");
  printUID();
  
  // ์นด๋“œ ์ธ์ฆ ํ™•์ธ
  if (checkAuthorization()) {
    accessGranted();
  } else {
    accessDenied();
  }
  
  // ์นด๋“œ ์ฝ๊ธฐ ์ข…๋ฃŒ
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
  
  delay(1000); // 1์ดˆ ๋Œ€๊ธฐ
}

// UID ์ถœ๋ ฅ ํ•จ์ˆ˜
void printUID() {
  for (byte i = 0; i < rfid.uid.size; i++) {
    Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(rfid.uid.uidByte[i], HEX);
  }
  Serial.println();
}

// ์นด๋“œ ์ธ์ฆ ํ™•์ธ ํ•จ์ˆ˜
bool checkAuthorization() {
  // UID ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋ฉด false
  if (rfid.uid.size != sizeof(authorizedUID)) {
    return false;
  }
  
  // ๊ฐ ๋ฐ”์ดํŠธ ๋น„๊ต
  for (byte i = 0; i < rfid.uid.size; i++) {
    if (rfid.uid.uidByte[i] != authorizedUID[i]) {
      return false;
    }
  }
  
  return true;
}

// ์ถœ์ž… ํ—ˆ๊ฐ€ ํ•จ์ˆ˜
void accessGranted() {
  Serial.println("โœ“ ์ถœ์ž… ํ—ˆ๊ฐ€!");
  
  // ์ดˆ๋ก LED ์ผœ๊ธฐ
  digitalWrite(GREEN_LED, HIGH);
  
  // ๋ถ€์ €๋กœ ์„ฑ๊ณต ์†Œ๋ฆฌ (์งง๊ฒŒ ํ•œ ๋ฒˆ)
  tone(BUZZER, 1000, 200);
  
  delay(2000); // 2์ดˆ ๋™์•ˆ ์œ ์ง€
  
  // LED ๋„๊ธฐ
  digitalWrite(GREEN_LED, LOW);
}

// ์ถœ์ž… ๊ฑฐ๋ถ€ ํ•จ์ˆ˜
void accessDenied() {
  Serial.println("โœ— ์ถœ์ž… ๊ฑฐ๋ถ€! ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์นด๋“œ์ž…๋‹ˆ๋‹ค.");
  
  // ๋นจ๊ฐ„ LED ๊นœ๋นก์ด๊ธฐ
  for (int i = 0; i < 3; i++) {
    digitalWrite(RED_LED, HIGH);
    tone(BUZZER, 500, 100);
    delay(200);
    digitalWrite(RED_LED, LOW);
    delay(200);
  }
}

โš™๏ธ ์„ค์ • ๋ฐฉ๋ฒ•

1. ๋จผ์ € ๊ธฐ๋ณธ ์˜ˆ์ œ๋กœ ์ž์‹ ์˜ ์นด๋“œ UID๋ฅผ ํ™•์ธํ•ด
2. ํ™•์ธํ•œ UID๋ฅผ authorizedUID[] ๋ฐฐ์—ด์— ์ž…๋ ฅํ•ด
3. ์˜ˆ: UID๊ฐ€ "DE AD BE EF"๋ผ๋ฉด {0xDE, 0xAD, 0xBE, 0xEF}๋กœ ์ž…๋ ฅ
4. ์—ฌ๋Ÿฌ ์นด๋“œ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ!

์ด ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ์ถœ์ž… ํ†ต์ œ ์‹œ์Šคํ…œ์ด์•ผ.
๋ฌผ๋ก  ๋ณด์•ˆ์„ ๋” ๊ฐ•ํ™”ํ•˜๋ ค๋ฉด ์•”ํ˜ธํ™”๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๊ฐ™์€ ๊ฑธ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜์ง€๋งŒ,
๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์„ ์ตํžˆ๊ธฐ์—” ์ถฉ๋ถ„ํ•ด! ๐Ÿ’ช

๐Ÿ“Š ์—ฌ๋Ÿฌ ์นด๋“œ ๊ด€๋ฆฌํ•˜๊ธฐ

ํ•œ ๊ฐœ ์นด๋“œ๋งŒ ๋“ฑ๋กํ•˜๋Š” ๊ฑด ์ข€ ์•„์‰ฝ์ง€?
์ด๋ฒˆ์—” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์นด๋“œ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž!
๊ฐ€์กฑ ๊ตฌ์„ฑ์›๋งˆ๋‹ค ๋‹ค๋ฅธ ์นด๋“œ๋ฅผ ์ฃผ๊ฑฐ๋‚˜, ์ง์›๋ณ„๋กœ ์นด๋“œ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ด. ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ

๐Ÿ‘ฅ ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
#define GREEN_LED 6
#define RED_LED 7

MFRC522 rfid(SS_PIN, RST_PIN);

// ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž ๊ตฌ์กฐ์ฒด
struct User {
  byte uid[4];
  String name;
};

// ์‚ฌ์šฉ์ž ๋ชฉ๋ก (์ตœ๋Œ€ 10๋ช…)
User authorizedUsers[] = {
  {{0xDE, 0xAD, 0xBE, 0xEF}, "ํ™๊ธธ๋™"},
  {{0x12, 0x34, 0x56, 0x78}, "๊น€์ฒ ์ˆ˜"},
  {{0xAA, 0xBB, 0xCC, 0xDD}, "์ด์˜ํฌ"}
  // ํ•„์š”ํ•œ ๋งŒํผ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
};

int userCount = 3; // ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž ์ˆ˜

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  
  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  
  Serial.println("=== ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ์ถœ์ž… ์‹œ์Šคํ…œ ===");
  Serial.println("๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž ์ˆ˜: " + String(userCount));
  Serial.println("์นด๋“œ๋ฅผ ํƒœ๊ทธํ•˜์„ธ์š”...");
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
    return;
  }
  
  // ์‚ฌ์šฉ์ž ํ™•์ธ
  int userIndex = findUser();
  
  if (userIndex >= 0) {
    // ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž
    Serial.println("ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค, " + authorizedUsers[userIndex].name + "๋‹˜!");
    digitalWrite(GREEN_LED, HIGH);
    delay(2000);
    digitalWrite(GREEN_LED, LOW);
  } else {
    // ๋ฏธ๋“ฑ๋ก ์‚ฌ์šฉ์ž
    Serial.println("๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์นด๋“œ์ž…๋‹ˆ๋‹ค.");
    digitalWrite(RED_LED, HIGH);
    delay(1000);
    digitalWrite(RED_LED, LOW);
  }
  
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
  delay(500);
}

// ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ ํ•จ์ˆ˜
int findUser() {
  for (int i = 0; i < userCount; i++) {
    bool match = true;
    
    for (byte j = 0; j < 4; j++) {
      if (rfid.uid.uidByte[j] != authorizedUsers[i].uid[j]) {
        match = false;
        break;
      }
    }
    
    if (match) {
      return i; // ์‚ฌ์šฉ์ž ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜
    }
  }
  
  return -1; // ์ฐพ์ง€ ๋ชปํ•จ
}

๐ŸŽ“ ์ฝ”๋“œ ๊ฐœ์„  ์•„์ด๋””์–ด

โ€ข ์‹œ๊ฐ„ ๊ธฐ๋ก: ๊ฐ ์‚ฌ์šฉ์ž์˜ ์ถœ์ž… ์‹œ๊ฐ„์„ SD ์นด๋“œ์— ์ €์žฅ
โ€ข LCD ๋””์Šคํ”Œ๋ ˆ์ด: ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ LCD์— ํ‘œ์‹œ
โ€ข Wi-Fi ์—ฐ๋™: ESP8266/ESP32๋กœ ์ถœ์ž… ๊ธฐ๋ก์„ ์„œ๋ฒ„์— ์ „์†ก
โ€ข ๋น„๋ฐ€๋ฒˆํ˜ธ ์ถ”๊ฐ€: ํ‚คํŒจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ 2๋‹จ๊ณ„ ์ธ์ฆ ๊ตฌํ˜„
โ€ข ์‹œ๊ฐ„๋Œ€ ์ œํ•œ: RTC ๋ชจ๋“ˆ๋กœ ํŠน์ • ์‹œ๊ฐ„์—๋งŒ ์ถœ์ž… ํ—ˆ์šฉ

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

์•„๋‘์ด๋…ธ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๋“ค์ด ์ƒ๊ธฐ๊ธฐ ๋งˆ๋ จ์ด์•ผ.
์—ฌ๊ธฐ์„œ๋Š” RFID ํ”„๋กœ์ ํŠธ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ดค์–ด. ๐Ÿ› ๏ธ

โŒ ์นด๋“œ๊ฐ€ ์ธ์‹๋˜์ง€ ์•Š์•„์š”

์›์ธ 1: ์—ฐ๊ฒฐ ๋ฌธ์ œ
โ€ข ๋ชจ๋“  ์ ํผ ์™€์ด์–ด๊ฐ€ ์ œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋๋Š”์ง€ ํ™•์ธ
โ€ข ํŠนํžˆ SDA, SCK, MOSI, MISO ํ•€ ์—ฐ๊ฒฐ ์žฌํ™•์ธ
โ€ข ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ ์‚ฌ์šฉ ์‹œ ์ ‘์ด‰ ๋ถˆ๋Ÿ‰ ํ™•์ธ

์›์ธ 2: ์ „์› ๋ฌธ์ œ
โ€ข 3.3V์— ์—ฐ๊ฒฐํ–ˆ๋Š”์ง€ ํ™•์ธ (5V ์•„๋‹˜!)
โ€ข USB ์ „์›์ด ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์™ธ๋ถ€ ์ „์› ์‚ฌ์šฉ ๊ณ ๋ ค
โ€ข ๋‹ค๋ฅธ ๋ถ€ํ’ˆ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์ „๋ ฅ ๋ถ€์กฑ ๊ฐ€๋Šฅ

์›์ธ 3: ๊ฑฐ๋ฆฌ ๋ฌธ์ œ
โ€ข ์นด๋“œ๋ฅผ ๋ฆฌ๋”๊ธฐ์— ๋” ๊ฐ€๊นŒ์ด ๋Œ€๋ณด๊ธฐ (1~3cm ์ด๋‚ด)
โ€ข ์นด๋“œ์™€ ๋ฆฌ๋”๊ธฐ ์‚ฌ์ด์— ๊ธˆ์† ๋ฌผ์ฒด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธ
โ€ข ์•ˆํ…Œ๋‚˜ ๋ถ€๋ถ„์ด ์†์ƒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ

โŒ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์š”

"MFRC522.h: No such file or directory"
โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์•˜์–ด. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งค๋‹ˆ์ €์—์„œ MFRC522 ์„ค์น˜

"'rfid' was not declared in this scope"
โ†’ ๊ฐ์ฒด ์„ ์–ธ ๋ถ€๋ถ„์„ ํ™•์ธํ•ด. MFRC522 rfid(SS_PIN, RST_PIN); ์žˆ๋Š”์ง€ ์ฒดํฌ

"expected ';' before..."
โ†’ ์„ธ๋ฏธ์ฝœ๋ก (;) ๋ˆ„๋ฝ. ๊ฐ ๋ฌธ์žฅ ๋์— ์„ธ๋ฏธ์ฝœ๋ก  ์žˆ๋Š”์ง€ ํ™•์ธ

๋ณด๋“œ ์„ ํƒ ์˜ค๋ฅ˜
โ†’ ๋„๊ตฌ โ†’ ๋ณด๋“œ์—์„œ "Arduino Uno" ์„ ํƒํ–ˆ๋Š”์ง€ ํ™•์ธ

โŒ ์—…๋กœ๋“œ๊ฐ€ ์•ˆ ๋ผ์š”

"avrdude: stk500_recv(): programmer is not responding"
โ†’ ํฌํŠธ ์„ ํƒ ํ™•์ธ (๋„๊ตฌ โ†’ ํฌํŠธ)
โ†’ USB ์ผ€์ด๋ธ” ๊ต์ฒดํ•ด๋ณด๊ธฐ
โ†’ ๋“œ๋ผ์ด๋ฒ„ ์žฌ์„ค์น˜

"Serial port already in use"
โ†’ ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ ๋‹ซ๊ธฐ
โ†’ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํฌํŠธ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ํ™•์ธ

์—…๋กœ๋“œ ์ค‘ ๋ฉˆ์ถค
โ†’ ์•„๋‘์ด๋…ธ ๋ฆฌ์…‹ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ณ  ๋‹ค์‹œ ์‹œ๋„
โ†’ ๋‹ค๋ฅธ USB ํฌํŠธ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

๐Ÿ” ๋””๋ฒ„๊น… ํŒ

๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋‹นํ™ฉํ•˜์ง€ ๋ง๊ณ  ์ฐจ๊ทผ์ฐจ๊ทผ ์ ‘๊ทผํ•ด๋ด!

1. ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ ํ™œ์šฉ: Serial.println()์œผ๋กœ ์ค‘๊ฐ„ ๊ฐ’๋“ค ์ถœ๋ ฅํ•ด๋ณด๊ธฐ
2. ๋‹จ๊ณ„๋ณ„ ํ…Œ์ŠคํŠธ: ๋ณต์žกํ•œ ์ฝ”๋“œ๋Š” ๊ธฐ๋Šฅ๋ณ„๋กœ ๋‚˜๋ˆ ์„œ ํ…Œ์ŠคํŠธ
3. ์˜ˆ์ œ ์ฝ”๋“œ ์‹คํ–‰: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ๋จผ์ € ํ™•์ธ
4. ํ•˜๋“œ์›จ์–ด ์ ๊ฒ€: LED ํ…Œ์ŠคํŠธ๋กœ ํ•€์ด ์ •์ƒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธ
5. ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ์šฉ: ์•„๋‘์ด๋…ธ ํฌ๋Ÿผ์ด๋‚˜ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ๊ณณ์—์„œ ๋„์›€ ์š”์ฒญ

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

๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋‹ค์กŒ๋‹ค๋ฉด ์ด์ œ ์ข€ ๋” ์žฌ๋ฏธ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€ํ•ด๋ณผ ์‹œ๊ฐ„์ด์•ผ!
์—ฌ๊ธฐ์„œ๋Š” ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ์†Œ๊ฐœํ• ๊ฒŒ. ๐ŸŽฏ

๐Ÿ’พ EEPROM์— ์นด๋“œ ์ •๋ณด ์ €์žฅํ•˜๊ธฐ

๋งค๋ฒˆ ์ฝ”๋“œ์— ์นด๋“œ UID๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๊ฑด ๋ถˆํŽธํ•˜์ง€?
EEPROM์„ ์‚ฌ์šฉํ•˜๋ฉด ์นด๋“œ ์ •๋ณด๋ฅผ ์•„๋‘์ด๋…ธ ๋ฉ”๋ชจ๋ฆฌ์— ์˜๊ตฌ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด.
์ „์›์ด ๊บผ์ ธ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋ผ์„œ ์—„์ฒญ ํŽธ๋ฆฌํ•ด!


#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>

#define SS_PIN 10
#define RST_PIN 9
#define REGISTER_BUTTON 2 // ๋“ฑ๋ก ๋ฒ„ํŠผ ํ•€

MFRC522 rfid(SS_PIN, RST_PIN);

// EEPROM ์ฃผ์†Œ ์ •์˜
#define EEPROM_START 0
#define MAX_CARDS 10
#define UID_SIZE 4

bool registerMode = false;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  
  pinMode(REGISTER_BUTTON, INPUT_PULLUP);
  
  Serial.println("=== RFID ์นด๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ===");
  Serial.println("๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์นด๋“œ ๋“ฑ๋ก ๋ชจ๋“œ");
  
  // ์ €์žฅ๋œ ์นด๋“œ ์ˆ˜ ํ™•์ธ
  int cardCount = EEPROM.read(EEPROM_START);
  Serial.println("์ €์žฅ๋œ ์นด๋“œ ์ˆ˜: " + String(cardCount));
}

void loop() {
  // ๋“ฑ๋ก ๋ฒ„ํŠผ ํ™•์ธ
  if (digitalRead(REGISTER_BUTTON) == LOW) {
    registerMode = true;
    Serial.println(">>> ์นด๋“œ ๋“ฑ๋ก ๋ชจ๋“œ ํ™œ์„ฑํ™” <<<");
    Serial.println("๋“ฑ๋กํ•  ์นด๋“œ๋ฅผ ํƒœ๊ทธํ•˜์„ธ์š”...");
    delay(1000);
  }
  
  // ์นด๋“œ ๊ฐ์ง€
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
    return;
  }
  
  if (registerMode) {
    registerCard();
    registerMode = false;
  } else {
    checkCard();
  }
  
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
  delay(1000);
}

// ์นด๋“œ ๋“ฑ๋ก ํ•จ์ˆ˜
void registerCard() {
  int cardCount = EEPROM.read(EEPROM_START);
  
  if (cardCount >= MAX_CARDS) {
    Serial.println("๋” ์ด์ƒ ์นด๋“œ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    return;
  }
  
  // ์ด๋ฏธ ๋“ฑ๋ก๋œ ์นด๋“œ์ธ์ง€ ํ™•์ธ
  if (isCardRegistered()) {
    Serial.println("์ด๋ฏธ ๋“ฑ๋ก๋œ ์นด๋“œ์ž…๋‹ˆ๋‹ค.");
    return;
  }
  
  // EEPROM์— ์นด๋“œ ์ €์žฅ
  int address = EEPROM_START + 1 + (cardCount * UID_SIZE);
  for (byte i = 0; i < UID_SIZE; i++) {
    EEPROM.write(address + i, rfid.uid.uidByte[i]);
  }
  
  // ์นด๋“œ ์ˆ˜ ์ฆ๊ฐ€
  EEPROM.write(EEPROM_START, cardCount + 1);
  
  Serial.print("์นด๋“œ ๋“ฑ๋ก ์™„๋ฃŒ! (");
  printUID();
  Serial.println(")");
}

// ์นด๋“œ ํ™•์ธ ํ•จ์ˆ˜
void checkCard() {
  if (isCardRegistered()) {
    Serial.println("โœ“ ๋“ฑ๋ก๋œ ์นด๋“œ์ž…๋‹ˆ๋‹ค!");
  } else {
    Serial.println("โœ— ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์นด๋“œ์ž…๋‹ˆ๋‹ค.");
  }
}

// ์นด๋“œ ๋“ฑ๋ก ์—ฌ๋ถ€ ํ™•์ธ
bool isCardRegistered() {
  int cardCount = EEPROM.read(EEPROM_START);
  
  for (int i = 0; i < cardCount; i++) {
    int address = EEPROM_START + 1 + (i * UID_SIZE);
    bool match = true;
    
    for (byte j = 0; j < UID_SIZE; j++) {
      if (EEPROM.read(address + j) != rfid.uid.uidByte[j]) {
        match = false;
        break;
      }
    }
    
    if (match) return true;
  }
  
  return false;
}

// UID ์ถœ๋ ฅ
void printUID() {
  for (byte i = 0; i < UID_SIZE; i++) {
    Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(rfid.uid.uidByte[i], HEX);
  }
}

๐Ÿ’ก EEPROM ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

EEPROM์€ ์“ฐ๊ธฐ ํšŸ์ˆ˜ ์ œํ•œ์ด ์žˆ์–ด (์•ฝ 100,000ํšŒ).
์ž์ฃผ ์“ฐ๊ณ  ์ง€์šฐ๋Š” ์šฉ๋„๋กœ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์•„.
์นด๋“œ ๋“ฑ๋ก/์‚ญ์ œ์ฒ˜๋Ÿผ ๊ฐ€๋” ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ํ•ฉํ•ด!

๋งŒ์•ฝ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด SD ์นด๋“œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ.

๐Ÿ“ฑ ๋ธ”๋ฃจํˆฌ์Šค๋กœ ์Šค๋งˆํŠธํฐ ์—ฐ๋™ํ•˜๊ธฐ

HC-05๋‚˜ HC-06 ๋ธ”๋ฃจํˆฌ์Šค ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์Šค๋งˆํŠธํฐ์œผ๋กœ ์ถœ์ž… ๊ธฐ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด!
์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ˆ„๊ฐ€ ์ถœ์ž…ํ–ˆ๋Š”์ง€ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์ง€. ๐Ÿ“ฒ


#include <SPI.h>
#include <MFRC522.h>
#include <SoftwareSerial.h>

#define SS_PIN 10
#define RST_PIN 9
#define BT_RX 3
#define BT_TX 4

MFRC522 rfid(SS_PIN, RST_PIN);
SoftwareSerial bluetooth(BT_RX, BT_TX);

void setup() {
  Serial.begin(9600);
  bluetooth.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  
  Serial.println("๋ธ”๋ฃจํˆฌ์Šค RFID ์‹œ์Šคํ…œ ์‹œ์ž‘");
  bluetooth.println("์—ฐ๊ฒฐ๋จ!");
}

void loop() {
  // ๋ธ”๋ฃจํˆฌ์Šค ๋ช…๋ น ์ˆ˜์‹ 
  if (bluetooth.available()) {
    char command = bluetooth.read();
    handleCommand(command);
  }
  
  // ์นด๋“œ ๊ฐ์ง€
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
    sendCardInfo();
    rfid.PICC_HaltA();
    rfid.PCD_StopCrypto1();
  }
}

// ์นด๋“œ ์ •๋ณด ์ „์†ก
void sendCardInfo() {
  bluetooth.print("CARD:");
  for (byte i = 0; i < rfid.uid.size; i++) {
    bluetooth.print(rfid.uid.uidByte[i] < 0x10 ? "0" : "");
    bluetooth.print(rfid.uid.uidByte[i], HEX);
  }
  bluetooth.println();
  
  Serial.println("์นด๋“œ ์ •๋ณด ์ „์†ก ์™„๋ฃŒ");
}

// ๋ช…๋ น ์ฒ˜๋ฆฌ
void handleCommand(char cmd) {
  switch(cmd) {
    case 'S': // Status
      bluetooth.println("์‹œ์Šคํ…œ ์ •์ƒ ์ž‘๋™ ์ค‘");
      break;
    case 'R': // Reset
      bluetooth.println("์‹œ์Šคํ…œ ๋ฆฌ์…‹");
      // ๋ฆฌ์…‹ ๋กœ์ง
      break;
    default:
      bluetooth.println("์•Œ ์ˆ˜ ์—†๋Š” ๋ช…๋ น");
  }
}

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

์ด์ œ ๊ธฐ๋ณธ๊ธฐ๋Š” ๋‹ค ๋ฐฐ์› ์œผ๋‹ˆ, ์‹ค์ œ๋กœ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์žฌ๋ฏธ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋“ค์„ ์†Œ๊ฐœํ• ๊ฒŒ!
์ด๋Ÿฐ ํ”„๋กœ์ ํŠธ๋“ค์€ ํฌํŠธํด๋ฆฌ์˜ค๋กœ๋„ ์ข‹๊ณ , ์‹ค์ƒํ™œ์—์„œ๋„ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์–ด. ๐ŸŒŸ

๐Ÿ  ์Šค๋งˆํŠธ ๋„์–ด๋ฝ RFID + ์„œ๋ณด๋ชจํ„ฐ ์ž๋™ ๋ฌธ ๊ฐœํ ์‹œ์Šคํ…œ ์ถœ์ž… ๊ธฐ๋ก ์ €์žฅ ๋‚œ์ด๋„: โ˜…โ˜…โ˜†โ˜†โ˜† ๐ŸŽฎ ์ถœ์„ ์ฒดํฌ ์‹œ์Šคํ…œ ํ•™๊ต/ํ•™์›์šฉ LCD ํ™”๋ฉด ํ‘œ์‹œ ์‹œ๊ฐ„ ๊ธฐ๋ก ๊ธฐ๋Šฅ ๋‚œ์ด๋„: โ˜…โ˜…โ˜…โ˜†โ˜† ๐Ÿ’ฐ ์ „์ž ์ง€๊ฐ‘ ์นด๋“œ๋ณ„ ํฌ์ธํŠธ ๊ด€๋ฆฌ ์ž”์•ก ํ‘œ์‹œ ์ถฉ์ „/์‚ฌ์šฉ ๊ธฐ๋ก ๋‚œ์ด๋„: โ˜…โ˜…โ˜…โ˜…โ˜† ๐Ÿš— ์ฃผ์ฐจ ๊ด€๋ฆฌ ์ฐจ๋Ÿ‰ ์ถœ์ž… ๊ด€๋ฆฌ ์ฃผ์ฐจ ์‹œ๊ฐ„ ๊ณ„์‚ฐ ์š”๊ธˆ ์ž๋™ ๊ณ„์‚ฐ ๋‚œ์ด๋„: โ˜…โ˜…โ˜…โ˜†โ˜† ๐Ÿ“š ๋„์„œ ๋Œ€์ถœ ์‹œ์Šคํ…œ ์ฑ… ์ •๋ณด ๊ด€๋ฆฌ ๋Œ€์ถœ/๋ฐ˜๋‚ฉ ์ฒ˜๋ฆฌ ์—ฐ์ฒด ์•Œ๋ฆผ ๋‚œ์ด๋„: โ˜…โ˜…โ˜…โ˜…โ˜† ๐Ÿ‹๏ธ ํ—ฌ์Šค์žฅ ๊ด€๋ฆฌ ํšŒ์› ์ถœ์ž… ๊ด€๋ฆฌ ์ด์šฉ ์‹œ๊ฐ„ ๊ธฐ๋ก ํšŒ์›๊ถŒ ๋งŒ๋ฃŒ ์•Œ๋ฆผ ๋‚œ์ด๋„: โ˜…โ˜…โ˜…โ˜†โ˜†

๐Ÿ  ํ”„๋กœ์ ํŠธ 1: ์Šค๋งˆํŠธ ๋„์–ด๋ฝ

ํ•„์š”ํ•œ ๋ถ€ํ’ˆ
โ€ข ์•„๋‘์ด๋…ธ ์šฐ๋…ธ
โ€ข RC522 RFID ๋ชจ๋“ˆ
โ€ข ์„œ๋ณด๋ชจํ„ฐ (SG90)
โ€ข LED 2๊ฐœ (์ดˆ๋ก, ๋นจ๊ฐ•)
โ€ข ๋ถ€์ €

์ฃผ์š” ๊ธฐ๋Šฅ
โ€ข ๋“ฑ๋ก๋œ ์นด๋“œ ์ธ์‹ ์‹œ ์„œ๋ณด๋ชจํ„ฐ๋กœ ์ž ๊ธˆ ํ•ด์ œ
โ€ข 3์ดˆ ํ›„ ์ž๋™ ์ž ๊ธˆ
โ€ข ์ถœ์ž… ์‹œ๊ฐ„ ๊ธฐ๋ก
โ€ข ๋ฏธ๋“ฑ๋ก ์นด๋“œ ์‹œ๋„ ์‹œ ์•Œ๋ฆผ

ํ™œ์šฉ ํŒ
์‹ค์ œ ๋ฌธ์— ์ ์šฉํ•˜๋ ค๋ฉด ์„œ๋ณด๋ชจํ„ฐ ๋Œ€์‹  ์†”๋ ˆ๋…ธ์ด๋“œ ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์•„.
์ „์›์€ ์™ธ๋ถ€ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฆด๋ ˆ์ด ๋ชจ๋“ˆ๋กœ ์ œ์–ดํ•˜๋ฉด ์•ˆ์ •์ ์ด์•ผ!

๐ŸŽฎ ํ”„๋กœ์ ํŠธ 2: ์ถœ์„ ์ฒดํฌ ์‹œ์Šคํ…œ

ํ•„์š”ํ•œ ๋ถ€ํ’ˆ
โ€ข ์•„๋‘์ด๋…ธ ๋ฉ”๊ฐ€ (๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ๋งŽ์•„์„œ ์ถ”์ฒœ)
โ€ข RC522 RFID ๋ชจ๋“ˆ
โ€ข LCD 16x2 ๋””์Šคํ”Œ๋ ˆ์ด
โ€ข RTC ๋ชจ๋“ˆ (DS3231)
โ€ข SD ์นด๋“œ ๋ชจ๋“ˆ

์ฃผ์š” ๊ธฐ๋Šฅ
โ€ข ํ•™์ƒ๋ณ„ ์นด๋“œ ๋“ฑ๋ก
โ€ข ์ถœ์„ ์‹œ๊ฐ„ ์ž๋™ ๊ธฐ๋ก
โ€ข LCD์— ์ด๋ฆ„๊ณผ ์‹œ๊ฐ„ ํ‘œ์‹œ
โ€ข SD ์นด๋“œ์— ์ถœ์„ ๋ฐ์ดํ„ฐ ์ €์žฅ
โ€ข ์ง€๊ฐ/๊ฒฐ์„ ์ž๋™ ํŒ์ •

ํ™•์žฅ ์•„์ด๋””์–ด
Wi-Fi ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•ด์„œ ์ถœ์„ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์„œ๋ฒ„์— ์ „์†กํ•˜๋ฉด,
ํ•™๋ถ€๋ชจ๊ฐ€ ์Šค๋งˆํŠธํฐ์œผ๋กœ ์ž๋…€์˜ ์ถœ์„ ํ˜„ํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด!

๐Ÿ”’ ๋ณด์•ˆ ๊ฐ•ํ™”ํ•˜๊ธฐ

RFID ์‹œ์Šคํ…œ์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ณด์•ˆ์ด ์ •๋ง ์ค‘์š”ํ•ด.
๊ธฐ๋ณธ ๊ตฌํ˜„๋งŒ์œผ๋กœ๋Š” ๋ณด์•ˆ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๋ช‡ ๊ฐ€์ง€ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž! ๐Ÿ›ก๏ธ

โš ๏ธ RFID ๋ณด์•ˆ์˜ ํ•œ๊ณ„

RFID ์นด๋“œ๋Š” ๋ณต์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ด.
ํŠนํžˆ ์ €๊ฐ€ํ˜• 13.56MHz ์นด๋“œ๋Š” ๋ณด์•ˆ์ด ์•ฝํ•œ ํŽธ์ด์•ผ.
์ค‘์š”ํ•œ ์‹œ์„ค์—๋Š” ์ถ”๊ฐ€ ๋ณด์•ˆ ์žฅ์น˜๋ฅผ ๊ผญ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ด!

๐Ÿ” ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•

1. 2๋‹จ๊ณ„ ์ธ์ฆ
RFID ์นด๋“œ + ๋น„๋ฐ€๋ฒˆํ˜ธ ์กฐํ•ฉ
ํ‚คํŒจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์นด๋“œ ํƒœ๊ทธ ํ›„ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ

2. ์‹œ๊ฐ„ ์ œํ•œ
ํŠน์ • ์‹œ๊ฐ„๋Œ€์—๋งŒ ์ถœ์ž… ํ—ˆ์šฉ
RTC ๋ชจ๋“ˆ๋กœ ํ˜„์žฌ ์‹œ๊ฐ„ ํ™•์ธ

3. ์‹œ๋„ ํšŸ์ˆ˜ ์ œํ•œ
์—ฐ์† ์‹คํŒจ ์‹œ ์ผ์ • ์‹œ๊ฐ„ ์ฐจ๋‹จ
๊ด€๋ฆฌ์ž์—๊ฒŒ ์•Œ๋ฆผ ์ „์†ก

4. ์•”ํ˜ธํ™”
์นด๋“œ UID๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•ด์‹œ ์ฒ˜๋ฆฌ
ํ†ต์‹  ๊ตฌ๊ฐ„ ์•”ํ˜ธํ™”

5. ๋กœ๊ทธ ๊ธฐ๋ก
๋ชจ๋“  ์ถœ์ž… ์‹œ๋„ ๊ธฐ๋ก
์‹คํŒจํ•œ ์‹œ๋„๋„ ํ•จ๊ป˜ ์ €์žฅ


// 2๋‹จ๊ณ„ ์ธ์ฆ ์˜ˆ์ œ (RFID + ๋น„๋ฐ€๋ฒˆํ˜ธ)
#include <SPI.h>
#include <MFRC522.h>
#include <Keypad.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);

// ํ‚คํŒจ๋“œ ์„ค์ •
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2};
byte colPins[COLS] = {9, 8, 7, 6};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// ์‚ฌ์šฉ์ž ์ •๋ณด
struct User {
  byte uid[4];
  String password;
  String name;
};

User users[] = {
  {{0xDE, 0xAD, 0xBE, 0xEF}, "1234", "ํ™๊ธธ๋™"},
  {{0x12, 0x34, 0x56, 0x78}, "5678", "๊น€์ฒ ์ˆ˜"}
};

int userCount = 2;
int currentUser = -1;
String inputPassword = "";
int failCount = 0;
unsigned long blockUntil = 0;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  
  Serial.println("=== 2๋‹จ๊ณ„ ์ธ์ฆ ์‹œ์Šคํ…œ ===");
}

void loop() {
  // ์ฐจ๋‹จ ์‹œ๊ฐ„ ํ™•์ธ
  if (millis() < blockUntil) {
    Serial.println("์‹œ์Šคํ…œ์ด ์ผ์‹œ์ ์œผ๋กœ ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
    delay(1000);
    return;
  }
  
  // 1๋‹จ๊ณ„: RFID ์นด๋“œ ์ธ์ฆ
  if (currentUser == -1) {
    if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
      currentUser = findUser();
      
      if (currentUser >= 0) {
        Serial.println("์นด๋“œ ์ธ์ฆ ์„ฑ๊ณต!");
        Serial.println("๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” (# ์œผ๋กœ ํ™•์ธ):");
      } else {
        Serial.println("๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์นด๋“œ์ž…๋‹ˆ๋‹ค.");
        failCount++;
        checkFailCount();
      }
      
      rfid.PICC_HaltA();
      rfid.PCD_StopCrypto1();
    }
  }
  // 2๋‹จ๊ณ„: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ
  else {
    char key = keypad.getKey();
    
    if (key) {
      if (key == '#') {
        // ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ
        if (inputPassword == users[currentUser].password) {
          Serial.println("โœ“ ์ธ์ฆ ์„ฑ๊ณต! ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค, " + users[currentUser].name + "๋‹˜!");
          failCount = 0;
          // ๋ฌธ ์—ด๊ธฐ ๋กœ์ง
        } else {
          Serial.println("โœ— ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.");
          failCount++;
          checkFailCount();
        }
        
        // ์ดˆ๊ธฐํ™”
        currentUser = -1;
        inputPassword = "";
      }
      else if (key == '*') {
        // ์ทจ์†Œ
        currentUser = -1;
        inputPassword = "";
        Serial.println("์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
      }
      else {
        inputPassword += key;
        Serial.print("*");
      }
    }
  }
}

int findUser() {
  for (int i = 0; i < userCount; i++) {
    bool match = true;
    for (byte j = 0; j < 4; j++) {
      if (rfid.uid.uidByte[j] != users[i].uid[j]) {
        match = false;
        break;
      }
    }
    if (match) return i;
  }
  return -1;
}

void checkFailCount() {
  if (failCount >= 3) {
    Serial.println("!!! 3ํšŒ ์‹คํŒจ๋กœ 5๋ถ„๊ฐ„ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค !!!");
    blockUntil = millis() + 300000; // 5๋ถ„
    failCount = 0;
  }
}

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

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด.
์—ฌ๊ธฐ์„œ๋Š” ์•„๋‘์ด๋…ธ RFID ์‹œ์Šคํ…œ์„ ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž! โšก

โšก ์‘๋‹ต ์†๋„ ๊ฐœ์„ 

1. delay() ์ตœ์†Œํ™”
delay()๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์™„์ „ํžˆ ๋ฉˆ์ถ”๊ฒŒ ํ•ด.
๋Œ€์‹  millis()๋ฅผ ์‚ฌ์šฉํ•œ ๋น„์ฐจ๋‹จ ๋ฐฉ์‹์„ ์จ๋ณด์ž!

๋‚˜์œ ์˜ˆ:


digitalWrite(LED, HIGH);

delay(2000);

digitalWrite(LED, LOW);


์ข‹์€ ์˜ˆ:

unsigned long previousMillis = 0;

if (millis() - previousMillis >= 2000) {

digitalWrite(LED, LOW);

}


2. ์‹œ๋ฆฌ์–ผ ํ†ต์‹  ์ตœ์ ํ™”
โ€ข ๋ถˆํ•„์š”ํ•œ Serial.println() ์ค„์ด๊ธฐ
โ€ข ๋ณด๋“œ๋ ˆ์ดํŠธ๋ฅผ 115200์œผ๋กœ ๋†’์ด๊ธฐ
โ€ข ๊ธด ๋ฌธ์ž์—ด์€ F() ๋งคํฌ๋กœ ์‚ฌ์šฉํ•ด์„œ RAM ์ ˆ์•ฝ

3. ๋ณ€์ˆ˜ ํƒ€์ž… ์ตœ์ ํ™”
โ€ข int ๋Œ€์‹  byte ์‚ฌ์šฉ (0~255 ๋ฒ”์œ„๋ฉด)
โ€ข float ๋Œ€์‹  ์ •์ˆ˜ ์—ฐ์‚ฐ ์‚ฌ์šฉ
โ€ข ์ „์—ญ ๋ณ€์ˆ˜ ์ตœ์†Œํ™”

๐Ÿ’พ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

์•„๋‘์ด๋…ธ ์šฐ๋…ธ๋Š” RAM์ด 2KB๋ฐ–์— ์•ˆ ๋ผ.
๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ •๋ง ์ค‘์š”ํ•ด!

๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ ํŒ:
โ€ข String ๋Œ€์‹  char ๋ฐฐ์—ด ์‚ฌ์šฉ
โ€ข PROGMEM์œผ๋กœ ์ƒ์ˆ˜๋ฅผ ํ”Œ๋ž˜์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ
โ€ข ํฐ ๋ฐฐ์—ด์€ ๋™์  ํ• ๋‹น ๊ณ ๋ ค
โ€ข ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ๊ฑฐ

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ:
์ปดํŒŒ์ผ ํ›„ ํ•˜๋‹จ์— ํ‘œ์‹œ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•ด๋ด.
RAM ์‚ฌ์šฉ๋Ÿ‰์ด 75%๋ฅผ ๋„˜์œผ๋ฉด ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์–ด!

๐ŸŒ IoT ์—ฐ๋™ํ•˜๊ธฐ

์š”์ฆ˜์€ IoT ์‹œ๋Œ€์ž–์•„?
RFID ์‹œ์Šคํ…œ์„ ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐํ•˜๋ฉด ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด! ๐ŸŒ

๐Ÿ“ก ESP8266/ESP32๋กœ Wi-Fi ์—ฐ๋™

ESP8266์ด๋‚˜ ESP32๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋‘์ด๋…ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด.
์ถœ์ž… ๊ธฐ๋ก์„ ํด๋ผ์šฐ๋“œ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜, ์Šค๋งˆํŠธํฐ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€!


// ESP32 + RFID ์›น์„œ๋ฒ„ ์˜ˆ์ œ
#include <SPI.h>
#include <MFRC522.h>
#include <WiFi.h>
#include <WebServer.h>

#define SS_PIN 5
#define RST_PIN 22

MFRC522 rfid(SS_PIN, RST_PIN);
WebServer server(80);

const char* ssid = "YourWiFiSSID";
const char* password = "YourPassword";

String lastCardUID = "์—†์Œ";
String lastAccessTime = "์—†์Œ";

void setup() {
  Serial.begin(115200);
  SPI.begin();
  rfid.PCD_Init();
  
  // Wi-Fi ์—ฐ๊ฒฐ
  WiFi.begin(ssid, password);
  Serial.print("Wi-Fi ์—ฐ๊ฒฐ ์ค‘");
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("\nWi-Fi ์—ฐ๊ฒฐ๋จ!");
  Serial.print("IP ์ฃผ์†Œ: ");
  Serial.println(WiFi.localIP());
  
  // ์›น์„œ๋ฒ„ ๋ผ์šฐํŒ…
  server.on("/", handleRoot);
  server.on("/status", handleStatus);
  server.begin();
  
  Serial.println("์›น์„œ๋ฒ„ ์‹œ์ž‘!");
}

void loop() {
  server.handleClient();
  
  // RFID ์นด๋“œ ๊ฐ์ง€
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
    lastCardUID = "";
    for (byte i = 0; i < rfid.uid.size; i++) {
      lastCardUID += String(rfid.uid.uidByte[i] < 0x10 ? "0" : "");
      lastCardUID += String(rfid.uid.uidByte[i], HEX);
    }
    
    lastAccessTime = getTimeString();
    Serial.println("์นด๋“œ ๊ฐ์ง€: " + lastCardUID);
    
    rfid.PICC_HaltA();
    rfid.PCD_StopCrypto1();
  }
}

// ๋ฉ”์ธ ํŽ˜์ด์ง€
void handleRoot() {
  String html = "<!DOCTYPE html><html><head>";
  html += "<meta charset='UTF-8'>";
  html += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
  html += "<title>RFID ๋ชจ๋‹ˆํ„ฐ๋ง</title>";
  html += "<style>";
  html += "body{font-family:Arial;margin:20px;background:#f0f0f0;}";
  html += ".container{max-width:600px;margin:0 auto;background:white;padding:20px;border-radius:10px;box-shadow:0 2px 10px rgba(0,0,0,0.1);}";
  html += "h1{color:#667eea;text-align:center;}";
  html += ".info{background:#f8f9ff;padding:15px;margin:10px 0;border-radius:5px;border-left:4px solid #667eea;}";
  html += ".label{font-weight:bold;color:#666;}";
  html += ".value{color:#333;font-size:1.2em;}";
  html += "</style>";
  html += "<script>";
  html += "setInterval(function(){fetch('/status').then(r=>r.json()).then(d=>{";
  html += "document.getElementById('uid').innerText=d.uid;";
  html += "document.getElementById('time').innerText=d.time;";
  html += "})},2000);";
  html += "</script>";
  html += "</head><body>";
  html += "<div class='container'>";
  html += "<h1>๐Ÿ” RFID ์ถœ์ž… ๋ชจ๋‹ˆํ„ฐ๋ง</h1>";
  html += "<div class='info'>";
  html += "<div class='label'>๋งˆ์ง€๋ง‰ ์นด๋“œ UID:</div>";
  html += "<div class='value' id='uid'>" + lastCardUID + "</div>";
  html += "</div>";
  html += "<div class='info'>";
  html += "<div class='label'>์ ‘๊ทผ ์‹œ๊ฐ„:</div>";
  html += "<div class='value' id='time'>" + lastAccessTime + "</div>";
  html += "</div>";
  html += "<p style='text-align:center;color:#999;margin-top:20px;'>์ž๋™ ์ƒˆ๋กœ๊ณ ์นจ ์ค‘...</p>";
  html += "</div></body></html>";
  
  server.send(200, "text/html", html);
}

// ์ƒํƒœ API
void handleStatus() {
  String json = "{";
  json += "\"uid\":\"" + lastCardUID + "\",";
  json += "\"time\":\"" + lastAccessTime + "\"";
  json += "}";
  
  server.send(200, "application/json", json);
}

// ์‹œ๊ฐ„ ๋ฌธ์ž์—ด ์ƒ์„ฑ
String getTimeString() {
  unsigned long currentMillis = millis();
  unsigned long seconds = currentMillis / 1000;
  unsigned long minutes = seconds / 60;
  unsigned long hours = minutes / 60;
  
  return String(hours % 24) + ":" + 
         String(minutes % 60) + ":" + 
         String(seconds % 60);
}

๐ŸŒŸ IoT ํ™œ์šฉ ์•„์ด๋””์–ด

โ€ข ์Šค๋งˆํŠธํ™ˆ ์—ฐ๋™: Google Home, Alexa์™€ ์—ฐ๋™
โ€ข ํ‘ธ์‹œ ์•Œ๋ฆผ: Pushbullet, Telegram Bot์œผ๋กœ ์•Œ๋ฆผ ์ „์†ก
โ€ข ๋ฐ์ดํ„ฐ ๋ถ„์„: Google Sheets์— ์ถœ์ž… ๊ธฐ๋ก ์ž๋™ ์ €์žฅ
โ€ข ์›๊ฒฉ ์ œ์–ด: ์Šค๋งˆํŠธํฐ ์•ฑ์œผ๋กœ ์›๊ฒฉ ๋ฌธ ์—ด๊ธฐ
โ€ข IFTTT ์—ฐ๋™: ๋‹ค์–‘ํ•œ ์ž๋™ํ™” ์‹œ๋‚˜๋ฆฌ์˜ค ๊ตฌํ˜„

๐ŸŽ“ ํ•™์Šต ๋ฆฌ์†Œ์Šค ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ

ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๋‹ค ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด.
๊ทธ๋Ÿด ๋•Œ ๋„์›€๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ณณ๋“ค์„ ์†Œ๊ฐœํ• ๊ฒŒ! ๐Ÿค

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

๊ณต์‹ ๋ฌธ์„œ
โ€ข Arduino ๊ณต์‹ ๋ ˆํผ๋Ÿฐ์Šค: arduino.cc/reference
โ€ข MFRC522 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ GitHub: github.com/miguelbalboa/rfid

์˜จ๋ผ์ธ ๊ฐ•์ขŒ
โ€ข YouTube: ํ•œ๊ธ€ ์•„๋‘์ด๋…ธ ํŠœํ† ๋ฆฌ์–ผ ๊ฒ€์ƒ‰
โ€ข Udemy: Arduino ๊ด€๋ จ ๊ฐ•์ขŒ๋“ค
โ€ข Coursera: IoT ์ „๋ฌธ๊ฐ€ ๊ณผ์ •

์ฑ… ์ถ”์ฒœ
โ€ข "์•„๋‘์ด๋…ธ๋ฅผ ์ด์šฉํ•œ ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท"
โ€ข "Make: ์•„๋‘์ด๋…ธ ํ”„๋กœ์ ํŠธ"
โ€ข "์‹ค์ „ ์•„๋‘์ด๋…ธ ์ž…๋ฌธ"

๐Ÿ‘ฅ ์ปค๋ฎค๋‹ˆํ‹ฐ

๊ตญ๋‚ด ์ปค๋ฎค๋‹ˆํ‹ฐ
โ€ข ์•„๋‘์ด๋…ธ ์ฝ”๋ฆฌ์•„ ์นดํŽ˜
โ€ข ๋ฉ”์ด์ปค ๋‹ค์ด์–ด๋ฆฌ
โ€ข ์žฌ๋Šฅ๋„ท ์ง€์‹์ธ์˜ ์ˆฒ (ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์นดํ…Œ๊ณ ๋ฆฌ)

ํ•ด์™ธ ์ปค๋ฎค๋‹ˆํ‹ฐ
โ€ข Arduino Forum
โ€ข Reddit r/arduino
โ€ข Stack Overflow

์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ
โ€ข GitHub์—์„œ "arduino rfid" ๊ฒ€์ƒ‰
โ€ข Instructables.com
โ€ข Hackster.io

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

๐Ÿ” ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ (FAQ)

Q1. RFID ์นด๋“œ์™€ NFC ์นด๋“œ๋Š” ๊ฐ™์€ ๊ฑด๊ฐ€์š”?

๋น„์Šทํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋‹ฌ๋ผ!
NFC๋Š” RFID์˜ ํ•œ ์ข…๋ฅ˜์•ผ. 13.56MHz ์ฃผํŒŒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” RFID๋ฅผ NFC๋ผ๊ณ  ๋ถ€๋ฅด์ง€.
RC522 ๋ชจ๋“ˆ์€ NFC ์นด๋“œ๋„ ์ฝ์„ ์ˆ˜ ์žˆ์–ด.
ํ•˜์ง€๋งŒ ์Šค๋งˆํŠธํฐ์˜ NFC ๊ธฐ๋Šฅ๊ณผ๋Š” ํ”„๋กœํ† ์ฝœ์ด ๋‹ฌ๋ผ์„œ ์ง์ ‘ ํ†ต์‹ ์€ ์–ด๋ ค์›Œ.

Q2. ์นด๋“œ ์ธ์‹ ๊ฑฐ๋ฆฌ๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋‚˜์š”?

RC522 ๋ชจ๋“ˆ์˜ ์ธ์‹ ๊ฑฐ๋ฆฌ๋Š” ๋ณดํ†ต 3~5cm ์ •๋„์•ผ.
์•ˆํ…Œ๋‚˜๋ฅผ ๊ฐœ์„ ํ•˜๊ฑฐ๋‚˜ ์ „์›์„ ์•ˆ์ •ํ™”ํ•˜๋ฉด ์กฐ๊ธˆ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์ง€๋งŒ, ํฌ๊ฒŒ ์ฐจ์ด๋Š” ์—†์–ด.
๋” ๊ธด ๊ฑฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด 125KHz ๋˜๋Š” UHF RFID ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด.

Q3. ๊ตํ†ต์นด๋“œ๋„ ์ฝ์„ ์ˆ˜ ์žˆ๋‚˜์š”?

๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๊ฐ€๋Šฅํ•ด!
๊ตํ†ต์นด๋“œ๋„ 13.56MHz RFID๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋“ .
ํ•˜์ง€๋งŒ ๊ตํ†ต์นด๋“œ๋Š” ์•”ํ˜ธํ™”๋˜์–ด ์žˆ์–ด์„œ UID๋Š” ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ,
์ž”์•ก ๊ฐ™์€ ์ •๋ณด๋Š” ์ฝ๊ธฐ ์–ด๋ ค์›Œ. ๊ทธ๋ฆฌ๊ณ  ๋ฒ•์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด!

Q4. ์•„๋‘์ด๋…ธ ์—†์ด ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๋กœ๋„ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋ฌผ๋ก ์ด์ง€!
๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์—์„œ๋„ RC522 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.
Python์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ฉด ๋˜๊ณ , ๋” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ด.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์ด๋‚˜ ์›น์„œ๋ฒ„ ๊ตฌ์ถ•์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง€์ง€.

Q5. ์นด๋“œ๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๊ฐ€๋Šฅํ•ด.
ํŠนํžˆ ์ €๊ฐ€ํ˜• ์นด๋“œ๋Š” ๋ณด์•ˆ์ด ์•ฝํ•ด์„œ ๋ณต์ œ๊ฐ€ ์‰ฌ์›Œ.
๊ทธ๋ž˜์„œ ์ค‘์š”ํ•œ ์‹œ์„ค์—๋Š” RFID๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ,
๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ์ƒ์ฒด์ธ์‹ ๊ฐ™์€ ์ถ”๊ฐ€ ๋ณด์•ˆ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์•ผ.

Q6. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ๋”๊ธฐ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๊ฐ€๋Šฅํ•ด!
๊ฐ ๋ฆฌ๋”๊ธฐ๋งˆ๋‹ค ๋‹ค๋ฅธ SS ํ•€์„ ํ• ๋‹นํ•˜๋ฉด ๋ผ.
ํ•˜์ง€๋งŒ SPI ๋ฒ„์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์— ์ฝ์„ ์ˆ˜๋Š” ์—†๊ณ ,
์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์–ด์•ผ ํ•ด. ์ฝ”๋“œ์—์„œ ๊ฐ ๋ฆฌ๋”๊ธฐ๋ฅผ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์ฒดํฌํ•˜๋ฉด ๋ผ.

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

์™€, ์—ฌ๊ธฐ๊นŒ์ง€ ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์–ด! ๐ŸŽ‰
์•„๋‘์ด๋…ธ RFID ํƒœ๊ทธ ๋ฆฌ๋”๊ธฐ์— ๋Œ€ํ•ด ๊ธฐ์ดˆ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊นŒ์ง€ ๋‹ค๋ค„๋ดค๋Š”๋ฐ, ์–ด๋• ์–ด?

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

๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‚˜์•„๊ฐ€๊ธฐ

์ด์ œ ๊ธฐ๋ณธ๊ธฐ๋Š” ๋‹ค ๋ฐฐ์› ์œผ๋‹ˆ, ์ž์‹ ๋งŒ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ด!

์‹œ์ž‘ํ•˜๊ธฐ ์ข‹์€ ํ”„๋กœ์ ํŠธ:
1. ์ž๊ธฐ ๋ฐฉ ์ถœ์ž… ํ†ต์ œ ์‹œ์Šคํ…œ
2. ๊ฐ€์กฑ ๊ตฌ์„ฑ์›๋ณ„ ์ถœ์ž… ๊ธฐ๋ก ์‹œ์Šคํ…œ
3. ๋ฐ˜๋ ค๋™๋ฌผ ์ž๋™ ๊ธ‰์‹๊ธฐ (RFID๋กœ ๊ฐœ์ฒด ๊ตฌ๋ถ„)
4. ์Šค๋งˆํŠธ ์‚ฌ๋ฌผํ•จ
5. ์ถœ์„ ์ฒดํฌ ์‹œ์Šคํ…œ

์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ ์  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒŒ ์ข‹์•„.
์™„๋ฒฝํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ๋งŒ๋“ค๋ ค๊ณ  ํ•˜์ง€ ๋ง๊ณ ,
์กฐ๊ธˆ์”ฉ ๊ฐœ์„ ํ•ด๋‚˜๊ฐ€๋Š” ๊ณผ์ •์„ ์ฆ๊ฒจ๋ด!

๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๋ฉด ๊ผญ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ํ•ด๋ด.
GitHub์— ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜, ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜, ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ž๋ž‘ํ•˜๋Š” ๊ฑฐ์ง€.
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ๋ฉด ๋” ๋งŽ์ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด! ๐Ÿ“

๐Ÿ’ก ๋งˆ์ง€๋ง‰ ์กฐ์–ธ

1. ์•ˆ์ „ ์ œ์ผ!
์ „๊ธฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฑฐ๋‹ˆ๊นŒ ํ•ญ์ƒ ์กฐ์‹ฌํ•ด. ํŠนํžˆ AC ์ „์›์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋”์šฑ ์ฃผ์˜!

2. ๋ฌธ์„œํ™”ํ•˜๊ธฐ
์ž์‹ ์ด ๋งŒ๋“  ํ”„๋กœ์ ํŠธ๋Š” ๊ผญ ๋ฌธ์„œ๋กœ ์ •๋ฆฌํ•ด๋‘ฌ. ๋‚˜์ค‘์— ๋‹ค์‹œ ๋ณผ ๋•Œ ์—„์ฒญ ๋„์›€์ด ๋ผ.

3. ๋ฐฑ์—…ํ•˜๊ธฐ
์ฝ”๋“œ๋Š” ํ•ญ์ƒ ๋ฐฑ์—…ํ•ด๋‘ฌ. GitHub ๊ฐ™์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์•„.

4. ์‹คํŒจ๋ฅผ ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ!
์—๋Ÿฌ๋Š” ๋ฐฐ์›€์˜ ๊ธฐํšŒ์•ผ. ์‹คํŒจํ• ์ˆ˜๋ก ๋” ๋งŽ์ด ๋ฐฐ์šฐ๊ฒŒ ๋ผ.

5. ์ฆ๊ธฐ๊ธฐ!
๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด ์ฆ๊ธฐ๋Š” ๊ฑฐ์•ผ. ์žฌ๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ์‹ค๋ ฅ์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š˜์–ด๋‚˜!

์ž, ์ด์ œ ์ •๋ง ์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ๋์–ด!
๋ถ€ํ’ˆ์„ ์ค€๋น„ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ฒซ ๋ฒˆ์งธ RFID ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•ด๋ด.
์ฒ˜์Œ ์นด๋“œ๊ฐ€ ์ธ์‹๋˜๋Š” ์ˆœ๊ฐ„์˜ ๊ทธ ์งœ๋ฆฟํ•จ์„ ๊ผญ ๊ฒฝํ—˜ํ•ด๋ณด๊ธธ ๋ฐ”๋ผ! โšก

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๊ฑฐ๋‚˜ ๋„์›€์ด ํ•„์š”ํ•˜๋ฉด ์–ธ์ œ๋“  ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋ฌผ์–ด๋ด.
๋ฉ”์ด์ปค ์„ธ๊ณ„๋Š” ์„œ๋กœ ๋•๊ณ  ๋ฐฐ์šฐ๋Š” ๋ฌธํ™”๊ฐ€ ์ •๋ง ๋ฉ‹์ง„ ๊ณณ์ด๊ฑฐ๋“ .
๋„ˆ๋„ ๋‚˜์ค‘์— ์ดˆ๋ณด์ž๋“ค์„ ๋„์™€์ฃผ๋Š” ๋ฉ‹์ง„ ๋ฉ”์ด์ปค๊ฐ€ ๋˜๊ธธ ๋ฐ”๋ผ! ๐ŸŒŸ

๊ทธ๋Ÿผ ํ–‰์šด์„ ๋นŒ์–ด! ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค์–ด๋ด! ๐Ÿš€โœจ

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

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

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

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