ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

Habr์˜ "DIY ๋˜๋Š” DIY(Do It Yourself)" ์„น์…˜์„ ์ฝ์–ด์ฃผ์‹  ๋ชจ๋“  ๋…์ž ์—ฌ๋Ÿฌ๋ถ„๊ป˜ ์ธ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์˜ค๋Š˜์˜ ๊ธฐ์‚ฌ๋Š” TTP223 ์นฉ์˜ ํ„ฐ์น˜ ์Šค์œ„์น˜์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค | ๋ฐ์ดํ„ฐ ์‹œํŠธ. ์Šค์œ„์น˜๋Š” nRF52832 ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ž‘๋™ | ๋ฐ์ดํ„ฐ ์‹œํŠธ, ์ธ์‡„๋œ ์•ˆํ…Œ๋‚˜์™€ ์™ธ๋ถ€ MHF17103 ์•ˆํ…Œ๋‚˜์šฉ ์ปค๋„ฅํ„ฐ๊ฐ€ ์žˆ๋Š” YJ-4 ๋ชจ๋“ˆ์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ„ฐ์น˜ ์Šค์œ„์น˜๋Š” CR2430 ๋˜๋Š” CR2450 ๋ฐฐํ„ฐ๋ฆฌ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ „์†ก ๋ชจ๋“œ์—์„œ์˜ ์†Œ๋น„๋Ÿ‰์€ 8mA ์ดํ•˜์ด๊ณ , ์ ˆ์ „ ๋ชจ๋“œ์—์„œ๋Š” 6ฮผA ์ดํ•˜์ž…๋‹ˆ๋‹ค.
ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

์ด์ „์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ํ”„๋กœ์ ํŠธ๋„ Arduino ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์€ Arduino IDE๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฅ์น˜์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌํ˜„์€ Mysensors ํ”„๋กœํ† ์ฝœ | GitHub ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, nRF5 ๋ณด๋“œ ์ง€์› GitHub ๋งˆ์ด์„ผ์„œ์Šค์—์„œ. ์˜์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ ํฌ๋Ÿผ - http://forum.mysensors.org, ๋Ÿฌ์‹œ์•„์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ ํฌ๋Ÿผ - http://mysensors.ru/forum/
(๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์€ ๋ถ„๋“ค์„ ์œ„ํ•ด - ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั, ์ง๋ ฌ ํ”„๋กœํ† ์ฝœ, API, ํ”„๋กœํ† ์ฝœ, ํŒŒ์„œ | ๋„์›€์„ ์›ํ•˜์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด (๊ธฐ๋ถ€๊ธˆ) ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์ค‘ - ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั)

ํ„ฐ์น˜ ์Šค์œ„์น˜ ๋ณด๋“œ๋Š” LUT(Laser Ironing Technology) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ ํ›„์† ์ œ์กฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ Deeptrace ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋“œ๋Š” 60x60mm ํฌ๊ธฐ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(ํ‘œ์ค€ ์œ ๋ฆฌ ํŒจ๋„์˜ ํฌ๊ธฐ๋Š” 80x80mm). ํšŒ๋กœ๋Š” Antenna ๋งค๊ฑฐ์ง„ ํŽ˜์ด์ง€์— ์ธ์‡„๋˜์—ˆ์œผ๋ฉฐ "Len" ์„ค์ •(์ตœ๋Œ€ ์ „๋ ฅ)์ด ์žˆ๋Š” Bosch ๋‹ค๋ฆฌ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–‘๋ฉด ํฌ์ผ ์œ ๋ฆฌ ์„ฌ์œ  ๋ณด๋“œ 1.5mm, 35ฮผm(๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๋Š” ๊ฒฝ์šฐ)์— ์˜ฎ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค.
ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

์—์นญ์€ ๋”ฐ๋œปํ•œ ๋ฌผ 1.5ml๋‹น 250ํ‹ฐ์Šคํ‘ผ์˜ ๋น„์œจ๋กœ ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์—ผํ™”์ œ15์ฒ  ์šฉ์•ก์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ XNUMX๋ถ„ ์ •๋„ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.
DREMEL 3000 ๋“œ๋ฆด ์Šคํƒ ๋“œ์— ์žฅ์ฐฉ๋œ DREMEL 220 ๋ฏธ๋‹ˆ ๋“œ๋ฆด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธต๊ฐ„ ๋น„์•„ ๋ฐ ๋ฐฐํ„ฐ๋ฆฌ ํ™€๋” ๊ณ ์ •์šฉ ๊ตฌ๋ฉ์„ ๋šซ์—ˆ์Šต๋‹ˆ๋‹ค. ์ธต๊ฐ„ ๋น„์•„์šฉ ๊ตฌ๋ฉ์€ 0,4mm ๋“œ๋ฆด๋กœ, ๋ฐฐํ„ฐ๋ฆฌ ํ™€๋”์šฉ ๊ตฌ๋ฉ์€ 1,1mm ๋“œ๋ฆด๋กœ ๋šซ์—ˆ์Šต๋‹ˆ๋‹ค. . ๋ณด๋“œ ํ…Œ๋‘๋ฆฌ๋ฅผ ๋”ฐ๋ผ ๋‹ค๋“ฌ๋Š” ์ž‘์—…์€ DREMEL 540 ๋ถ€์ฐฉ๋ฌผ(์ ˆ๋‹จ ์› d=32.0mm)์ด ์žˆ๋Š” ๋™์ผํ•œ ๋ฏธ๋‹ˆ ๋“œ๋ฆด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ง€์น˜๊ธฐ๋Š” ์ธ๊ณตํ˜ธํก๊ธฐ์—์„œ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค.
์—์นญ๋œ ๋ณด๋“œ์˜ ์ฃผ์„ ๋„๊ธˆ์€ ์ˆ˜์šฉ์•ก(๋ฌผ 1ml๋‹น ๊ฒฐ์ •ํ™”๋œ ๊ตฌ์—ฐ์‚ฐ 300ํ‹ฐ์Šคํ‘ผ)์— ์žˆ๋Š” ๋กœ์ฆˆ ํ•ฉ๊ธˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ฉ๋•œ ๊ณต์ •์€ ์•ฝ 0.4์‹œ๊ฐ„์ด ์†Œ์š”๋˜์—ˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์€ ์ธต๊ฐ„ ๋น„์•„์šฉ ๊ตฌ๋ฉ์— ์™€์ด์–ด(์ฃผ์„ ๋„๊ธˆ, ์ง๊ฒฝ XNUMXmm)๋ฅผ ๋‚ฉ๋•œํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณด๋“œ๋Š” FLUX OFF ์—์–ด๋กœ์กธ ํด๋ฆฌ๋„ˆ๋กœ ์„ธ์ฒ™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

์žฅ์น˜ ๋ณธ์ฒด์˜ ์„ค๊ณ„๋Š” 78,5์ฐจ์› ์ปดํ“จํ„ฐ ์ง€์› ์„ค๊ณ„ ํŽธ์ง‘๊ธฐ์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ€์ด์Šค ํฌ๊ธฐ 78,5mm X 12mm X XNUMXmm.
ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

์ผ€์ด์Šค์™€ ๋ฐฐํ„ฐ๋ฆฌ์‹ค ์ปค๋ฒ„์˜ ์™„์„ฑ๋œ ๋ชจ๋ธ์€ STL ํ˜•์‹์œผ๋กœ ์ €์žฅ๋˜์—ˆ์œผ๋ฏ€๋กœ SLA ํ”„๋ฆฐํ„ฐ์—์„œ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋Ÿฌํ•œ ๋ชจ๋ธ์„ ์ค€๋น„ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค(์ง€์› ์ถ”๊ฐ€, ๋ฐฉํ–ฅ ์ถ”๊ฐ€). ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐ€์ •์šฉ SLA ํ”„๋ฆฐํ„ฐ์˜ ์ธ์‡„ ์˜์—ญ์ด ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ์‡„ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์žฅ ์ตœ์ ์˜ ์œ„์น˜์— ์žˆ๋Š” ์žฅ์น˜ ์ผ€์ด์Šค์˜ ๋ชจ๋ธ์ด ์ธ์‡„ ์˜์—ญ์˜ ํฌ๊ธฐ์— ๋งž์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์„ 45๋„ ๊ฐ๋„๋กœ ๋ฐฐ์น˜ํ–ˆ์„ ๋•Œ๋„ ์ง€์ง€๋Œ€์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋ชจ๋ธ ๋ณธ์ฒด์˜ ๋ฌด๊ฒŒ์™€ ๊ฐ™์•„ ์‹ค๋ง์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ํ›„์ฒ˜๋ฆฌ ์‚ฌ์‹ค์— ๋ฏธ๋ฆฌ ๋™์˜ํ•œ ํ›„ ๋ชจ๋ธ์„ ์ˆ˜์ง์œผ๋กœ ์ธ์‡„ํ•˜์—ฌ ์•ž๋ฉด ์ค‘ ํ•˜๋‚˜์— ์ง€์ง€๋Œ€๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. 5๋ฏธํฌ๋ก ์˜ ๋ ˆ์ด์–ด ์„ค์ •์œผ๋กœ ๋ณธ์ฒด๋ฅผ ์ธ์‡„ํ•˜๋Š” ๋ฐ 50์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ๋งค์šฐ ๋ฏธ์„ธํ•œ ์‚ฌํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๊ณต์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค (์ˆซ์ž๋Š” ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์“ฐ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค :)). ๋ฐฐํ„ฐ๋ฆฌ ์ปค๋ฒ„๋ฅผ ์ธ์‡„ํ•˜๋Š” ๋ฐ 40๋ถ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.
ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

Aliexpress์˜ ์œ ๋ฆฌ ํŒจ๋„์€ ํ”Œ๋ผ์Šคํ‹ฑ ํ”„๋ ˆ์ž„์ด ์ด๋ฏธ ์ ‘์ฐฉ๋œ ์ƒํƒœ๋กœ ํŒ๋งค๋˜๋ฉฐ ํ”„๋ ˆ์ž„์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํ—ค์–ด๋“œ๋ผ์ด์–ด๋กœ ์˜ˆ์—ดํ•œ ํ›„ ์œ ๋ฆฌํŒ์„ ๋–ผ์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค.
ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

LED ๋ฐฑ๋ผ์ดํŠธ์šฉ ๋””ํ“จ์ €๋Š” ์•„ํฌ๋ฆด ์ ‘์ฐฉ์ œ 3M 9088-200์„ ์‚ฌ์šฉํ•œ ์–‘๋ฉด ํ…Œ์ดํ”„๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜•๊ด‘๋“ฑ ์กฐ๋ช…์˜ ๊ฒฝ์šฐ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ๋ฃŒ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ค‘๊ตญ ์ ‘์ฐฉ ํ…Œ์ดํ”„์™€ ๊ตญ๋‚ด ํšŒ์‚ฌ Luminofor์˜ ํ…Œ์ดํ”„๋กœ ์ž˜๋ผ๋‚ธ ์ ‘์ฐฉ ์ข…์ด์˜€์Šต๋‹ˆ๋‹ค. ๊ตญ๋‚ด ์ œ์กฐ์‚ฌ๋ฅผ ์„ ํƒํ–ˆ๋Š”๋ฐ ๋‚ด ๋Š๋‚Œ์œผ๋กœ๋Š” ๋” ๋ฐ๊ณ  ์˜ค๋ž˜ ๋น›๋‚ฌ๋‹ค. ํ˜•๊ด‘ ์ƒ‰์†Œ๊ฐ€ ๋ฌป์€ ์ •์‚ฌ๊ฐํ˜• ์ข…์ด๋ฅผ 3M 9088-200 ์–‘๋ฉด ํ…Œ์ดํ”„๋กœ ์œ„์— ๋ถ™์˜€์Šต๋‹ˆ๋‹ค.

์œ ๋ฆฌ๋Š” 3M VHB 4910 ์•„ํฌ๋ฆด ์ ‘์ฐฉ์ œ๊ฐ€ ํฌํ•จ๋œ ์–‘๋ฉด ํ…Œ์ดํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์œ„์น˜ ๋ณธ์ฒด์— ์ ‘์ฐฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

๋ฎ๊ฐœ๋Š” M 1,4 X 5 mm ๋‚˜์‚ฌ๋กœ ๊ณ ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์žฅ์น˜ ๋น„์šฉ์€ 890 ๋ฃจ๋ธ”์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ”„๋กœ๊ทธ๋žจ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. TTP223 ์„ผ์„œ ์นฉ์€ ์•ˆ์ •ํ™”๋œ 3.3V ์ „์› ๊ณต๊ธ‰ ์žฅ์น˜์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์ž˜ ๋ฐฉ์ „๋œ ๋ฐฐํ„ฐ๋ฆฌ์—์„œ ์ง์ ‘ ์ „์›์„ ๊ณต๊ธ‰๋ฐ›์„ ๋•Œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์•ฝ 2.5v์˜ ์ „์› ๊ณต๊ธ‰ ์žฅ์น˜๋กœ ์žฅ์น˜๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ์™€ Mysensors ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ์ถ”๊ฐ€ "์ธํ•˜" ํ›„์— TTP223 ๋งˆ์ดํฌ๋กœ ํšŒ๋กœ(๊ต์ • ์งํ›„)๊ฐ€ ํ™œ์„ฑ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— MK๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ดํฌ๋กœ ํšŒ๋กœ์˜ ์ „์› ๊ณต๊ธ‰ ํšŒ๋กœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ (gpio MK๋ฅผ ์‚ฌ์šฉํ•œ ์ „์› ๊ด€๋ฆฌ TTP223) ์ถ”๊ฐ€ ์ ‘์ง€๊ฐ€ ์ œ๊ณต๋˜์—ˆ์œผ๋ฉฐ RGB LED ๋ผ์ธ(์ •์ „์‹ ์„ผ์„œ ๋ณด๋“œ์˜ ๋ฐ˜๋Œ€์ชฝ์—์„œ ์‹คํ–‰)์—์„œ ์ €ํ•ญ์ด ๋” ๋†’์€ ์ €ํ•ญ๊ธฐ๋กœ ๊ต์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Mysensors ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ํ”„๋ฆฌ์  ํ…Œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ์šฉ๋Ÿ‰์„ฑ ๋งˆ์ดํฌ๋กœ ํšŒ๋กœ์— ๋Œ€ํ•œ ์ „์› ํ™œ์„ฑํ™”๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ „์›์ด ๊ณต๊ธ‰๋  ๋•Œ TTP223 ์นฉ์˜ ์ž๋™ ๋ณด์ • ์ง€์—ฐ ์‹œ๊ฐ„์ด ๋‘ ๋ฐฐ๋กœ ๋Š˜์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์ด ๋ฌธ์ œ๊ฐ€ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ์ „์— Mysensors์˜ ๊ธฐ๋ณธ ์Šค์ผ€์น˜ ๊ตฌ์กฐ๋ฅผ ์ˆ™์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.void before()
{
// ะ”ะพะฟะพะปะฝะธั‚ะตะปัŒะฝะฐั ั„ัƒะฝะบั†ะธั, ะตัะปะธ ัั€ะฐะฒะฝะธะฒะฐั‚ัŒ ัะพ ัั‚ะฐะฝะดะฐั€ั‚ะฝะพะน ัั‚ั€ัƒะบั‚ัƒั€ะพะน ะั€ะดัƒะธะฝะพ ัะบะตั‚ั‡ะตะน, ั‚ะพ before() ัั‚ะพ ะฟะพะดะพะฑะธะต setup(), ะพั‚ั€ะฐะฑะพั‚ะบะฐ ะฟั€ะพะธัั…ะพะดะธั‚ ะดะพ ะธะฝะธั†ะธะฐะปะธะทะฐั†ะธะธ ั‚ั€ะฐะฝัะฟะพั€ั‚ะฝะพะณะพ ัƒั€ะพะฒะฝั Mysensors, ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ะฝะฐะฟั€ะธะผะตั€ ะดะปั ะธะฝะธั†ะธะฐะปะธะทะฐั†ะธะธ ัƒัั‚ั€ะพะนัั‚ะฒ SPI
}

void setup()
{

}

void presentation()
{
//ะขัƒั‚ ะฟั€ะพะธัั…ะพะดะธั‚ ะฟั€ะตะทะตะฝั‚ะฐั†ะธั ะฝะพะดั‹ ะธ ะตะต ัะตะฝัะพั€ะพะฒ ะฝะฐ ะบะพะฝั‚ั€ะพะปะตั€ะต ั‡ะตั€ะตะท ะผะฐั€ัˆั€ัƒั‚ะธะทะฐั‚ะพั€
sendSketchInfo("Name of my sensor node", "1.0"); // ะฟั€ะตะทะตะฝั‚ะฐั†ะธั ะฝะฐะทะฒะฐะฝะธั ะฝะพะดั‹, ะฒะตั€ัะธะธ ะŸะž
present(CHILD_ID, S_WHATEVER, "Description"); // ะฟั€ะตะทะตะฝั‚ะฐั†ะธั ัะตะฝัะพั€ะพะฒ ะฝะพะดั‹, ะพะฟะธัะฐะฝะธั ัะตะฝัะพั€ะพะฒ
}

void loop()
{

}

ํ„ฐ์น˜ ์Šค์œ„์น˜ ํ”„๋กœ๊ทธ๋žจ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ:test_sens.ino
/**
ะขะ•ะกะขะžะ’ะซะ™ ะกะšะ•ะขะง ะกะ•ะะกะžะ ะะžะ“ะž ะ’ะซะšะ›ะฎะงะะขะ•ะ›ะฏ ะก ะŸะ ะ•ะ ะซะ’ะะะ˜ะฏะœะ˜ ะะ NRF_LPCOMP
*/
bool button_flag;
bool sens_flag;
bool send_flag;
bool detection;
bool nosleep;
byte timer;
unsigned long SLEEP_TIME = 21600000; //6 hours
unsigned long oldmillis;
unsigned long newmillis;
unsigned long interrupt_time;
unsigned long SLEEP_TIME_W;
uint16_t currentBatteryPercent;
uint16_t batteryVoltage = 0;
uint16_t battery_vcc_min = 2400;
uint16_t battery_vcc_max = 3000;

#define MY_RADIO_NRF5_ESB
//#define MY_PASSIVE_NODE
#define MY_NODE_ID 30
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
#define IRT_PIN 3 //(PORT0, gpio 5)
#include <MySensors.h>
// see https://www.mysensors.org/download/serial_api_20
#define SENS_CHILD_ID 0
#define CHILD_ID_VOLT 254
MyMessage sensMsg(SENS_CHILD_ID, V_VAR1);
//MyMessage voltMsg(CHILD_ID_VOLT, V_VOLTAGE);

void preHwInit() {
sleep(2000);
pinMode(RED_LED, OUTPUT);
digitalWrite(RED_LED, HIGH);
pinMode(GREEN_LED, OUTPUT);
digitalWrite(GREEN_LED, HIGH);
pinMode(BLUE_LED, OUTPUT);
digitalWrite(BLUE_LED, HIGH);
pinMode(MODE_PIN, INPUT);
pinMode(SENS_PIN, INPUT);
}

void before()
{
NRF_POWER->DCDCEN = 1;
NRF_UART0->ENABLE = 0;
sleep(1000);
digitalWrite(BLUE_LED, LOW);
sleep(150);
digitalWrite(BLUE_LED, HIGH);
}

void presentation() {
sendSketchInfo("EFEKTA Sens 1CH Sensor", "1.1");
present(SENS_CHILD_ID, S_CUSTOM, "SWITCH STATUS");
//present(CHILD_ID_VOLT, S_MULTIMETER, "Battery");
}

void setup() {
digitalWrite(BLUE_LED, LOW);
sleep(100);
digitalWrite(BLUE_LED, HIGH);
sleep(200);
digitalWrite(BLUE_LED, LOW);
sleep(100);
digitalWrite(BLUE_LED, HIGH);
lpComp();
detection = false;
SLEEP_TIME_W = SLEEP_TIME;
pinMode(31, OUTPUT);
digitalWrite(31, HIGH);
/*
while (timer < 10) {
timer++;
digitalWrite(GREEN_LED, LOW);
wait(5);
digitalWrite(GREEN_LED, HIGH);
wait(500);
}
timer = 0;
*/
sleep(7000);
while (timer < 3) {
timer++;
digitalWrite(GREEN_LED, LOW);
sleep(15);
digitalWrite(GREEN_LED, HIGH);
sleep(85);
}
timer = 0;
sleep(1000);
}

void loop() {

if (detection) {
if (digitalRead(MODE_PIN) == 1 && button_flag == 0 && digitalRead(SENS_PIN) == 0) {
//back side button detection
button_flag = 1;
nosleep = 1;
}
if (digitalRead(MODE_PIN) == 1 && button_flag == 1 && digitalRead(SENS_PIN) == 0) {
digitalWrite(RED_LED, LOW);
wait(10);
digitalWrite(RED_LED, HIGH);
wait(50);
}
if (digitalRead(MODE_PIN) == 0 && button_flag == 1 && digitalRead(SENS_PIN) == 0) {
nosleep = 0;
button_flag = 0;
digitalWrite(RED_LED, HIGH);
lpComp_reset();
}

if (digitalRead(SENS_PIN) == 1 && sens_flag == 0 && digitalRead(MODE_PIN) == 0) {
//sens detection
sens_flag = 1;
nosleep = 1;
newmillis = millis();
interrupt_time = newmillis - oldmillis;
SLEEP_TIME_W = SLEEP_TIME_W - interrupt_time;
if (send(sensMsg.set(detection))) {
send_flag = 1;
}
}
if (digitalRead(SENS_PIN) == 1 && sens_flag == 1 && digitalRead(MODE_PIN) == 0) {
if (send_flag == 1) {
while (timer < 10) {
timer++;
digitalWrite(GREEN_LED, LOW);
wait(20);
digitalWrite(GREEN_LED, HIGH);
wait(30);
}
timer = 0;
} else {
while (timer < 10) {
timer++;
digitalWrite(RED_LED, LOW);
wait(20);
digitalWrite(RED_LED, HIGH);
wait(30);
}
timer = 0;
}
}
if (digitalRead(SENS_PIN) == 0 && sens_flag == 1 && digitalRead(MODE_PIN) == 0) {
sens_flag = 0;
nosleep = 0;
send_flag = 0;
digitalWrite(GREEN_LED, HIGH);
sleep(500);
lpComp_reset();
}
if (SLEEP_TIME_W < 60000) {
SLEEP_TIME_W = SLEEP_TIME;
sendBatteryStatus();
}
}
else {
//if (detection == -1) {
SLEEP_TIME_W = SLEEP_TIME;
sendBatteryStatus();
}
if (nosleep == 0) {
oldmillis = millis();
sleep(SLEEP_TIME_W);
}
}

void sendBatteryStatus() {
wait(20);
batteryVoltage = hwCPUVoltage();
wait(2);

if (batteryVoltage > battery_vcc_max) {
currentBatteryPercent = 100;
}
else if (batteryVoltage < battery_vcc_min) {
currentBatteryPercent = 0;
} else {
currentBatteryPercent = (100 * (batteryVoltage - battery_vcc_min)) / (battery_vcc_max - battery_vcc_min);
}

sendBatteryLevel(currentBatteryPercent, 1);
wait(2000, C_INTERNAL, I_BATTERY_LEVEL);
//send(powerMsg.set(batteryVoltage), 1);
//wait(2000, 1, V_VAR1);
}

void lpComp() {
NRF_LPCOMP->PSEL = IRT_PIN;
NRF_LPCOMP->ANADETECT = 1;
NRF_LPCOMP->INTENSET = B0100;
NRF_LPCOMP->ENABLE = 1;
NRF_LPCOMP->TASKS_START = 1;
NVIC_SetPriority(LPCOMP_IRQn, 15);
NVIC_ClearPendingIRQ(LPCOMP_IRQn);
NVIC_EnableIRQ(LPCOMP_IRQn);
}

void s_lpComp() {
if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) {
NRF_LPCOMP->INTENCLR = B0100;
}
}

void r_lpComp() {
NRF_LPCOMP->INTENSET = B0100;
}

#if __CORTEX_M == 0x04
#define NRF5_RESET_EVENT(event)
event = 0;
(void)event
#else
#define NRF5_RESET_EVENT(event) event = 0
#endif

extern "C" {
void LPCOMP_IRQHandler(void) {
detection = true;
NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP);
NRF_LPCOMP->EVENTS_UP = 0;
MY_HW_RTC->CC[0] = (MY_HW_RTC->COUNTER + 2);
}
}

void lpComp_reset () {
s_lpComp();
detection = false;
NRF_LPCOMP->EVENTS_UP = 0;
r_lpComp();
}

๋งˆ์ด๋ณด๋“œNRF5.cpp
#ifdef MYBOARDNRF5
#include <variant.h>

/*
* Pins descriptions. Attributes are ignored by arduino-nrf5 variant.
* Definition taken from Arduino Primo Core with ordered ports
*/
const PinDescription g_APinDescription[]=
{
{ NOT_A_PORT, 0, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK
{ NOT_A_PORT, 1, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK
{ PORT0, 2, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A0, PWM4, NOT_ON_TIMER},
{ PORT0, 3, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A1, PWM5, NOT_ON_TIMER},
{ PORT0, 4, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A2, PWM6, NOT_ON_TIMER},
{ PORT0, 5, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A3, PWM7, NOT_ON_TIMER},
{ PORT0, 6, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT3
{ PORT0, 7, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT4
{ PORT0, 8, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM10, NOT_ON_TIMER}, //USER_LED
{ PORT0, 9, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC1
{ PORT0, 10, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC2
{ PORT0, 11, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TX
{ PORT0, 12, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // RX
{ PORT0, 13, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA
{ PORT0, 14, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL
{ PORT0, 15, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA1
{ PORT0, 16, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL1
{ PORT0, 17, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP4
{ PORT0, 18, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP5
{ PORT0, 19, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT2
{ PORT0, 20, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT1
{ PORT0, 21, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT1
{ PORT0, 22, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM9, NOT_ON_TIMER},
{ PORT0, 23, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM8, NOT_ON_TIMER},
{ PORT0, 24, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT
{ PORT0, 25, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //RED_LED
{ PORT0, 26, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //GREEN_LED
{ PORT0, 27, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //BLUE_LED
{ PORT0, 28, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A4, PWM3, NOT_ON_TIMER},
{ PORT0, 29, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A5, PWM2, NOT_ON_TIMER},
{ PORT0, 30, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A6, PWM1, NOT_ON_TIMER},
{ PORT0, 31, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A7, PWM0, NOT_ON_TIMER}
};

// Don't remove this line
#include <compat_pin_mapping.h>

#endif

๋งˆ์ด๋ณด๋“œNRF5.h
#ifndef _MYBOARDNRF5_H_
#define _MYBOARDNRF5_H_

#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus

// Number of pins defined in PinDescription array
#define PINS_COUNT (32u)
#define NUM_DIGITAL_PINS (32u)
#define NUM_ANALOG_INPUTS (8u)
#define NUM_ANALOG_OUTPUTS (8u)

/*
* LEDs
*
* This is optional
*
* With My Sensors, you can use
* hwPinMode() instead of pinMode()
* hwPinMode() allows to use advanced modes like OUTPUT_H0H1 to drive LEDs.
* https://github.com/mysensors/MySensors/blob/development/drivers/NRF5/nrf5_wiring_constants.h
*
*/
#define PIN_LED1 (16)
#define PIN_LED2 (15)
#define PIN_LED3 (17)
#define RED_LED (PIN_LED1)
#define GREEN_LED (PIN_LED2)
#define BLUE_LED (PIN_LED3)
#define INTERRUPT_PIN (5)
#define MODE_PIN (25)
#define SENS_PIN (27)

/*
* Analog ports
*
* If you change g_APinDescription, replace PIN_AIN0 with
* port numbers mapped by the g_APinDescription Array.
* You can add PIN_AIN0 to the g_APinDescription Array if
* you want provide analog ports MCU independed, you can add
* PIN_AIN0..PIN_AIN7 to your custom g_APinDescription Array
* defined in MyBoardNRF5.cpp
*/
static const uint8_t A0 = ADC_A0;
static const uint8_t A1 = ADC_A1;
static const uint8_t A2 = ADC_A2;
static const uint8_t A3 = ADC_A3;
static const uint8_t A4 = ADC_A4;
static const uint8_t A5 = ADC_A5;
static const uint8_t A6 = ADC_A6;
static const uint8_t A7 = ADC_A7;

/*
* Serial interfaces
*
* RX and TX are required.
* If you have no serial port, use unused pins
* CTS and RTS are optional.
*/
#define PIN_SERIAL_RX (11)
#define PIN_SERIAL_TX (12)

#ifdef __cplusplus
}
#endif

#endif

์Šค์œ„์น˜๋Š” ๊ธฐ๊ธฐ ๋’ท๋ฉด์— ํ„ฐ์น˜ ๋ฒ„ํŠผ๊ณผ ํƒํŠธ ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํƒํŠธ ๋ฒ„ํŠผ์€ ์„œ๋น„์Šค ๋ชจ๋“œ, OTA ๋ฐ”์ธ๋”ฉ ๋ชจ๋“œ, ์žฅ์น˜ ์žฌ์„ค์ •์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์—๋Š” ์ฒ ์ œ ๋ฐ”์šด์Šค ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฉ๋Ÿ‰ ์„ฑ ์„ผ์„œ ๋ผ์ธ๊ณผ ์‹œ๊ณ„ ๋ฒ„ํŠผ ๋ผ์ธ์€ ์‡ผํŠธ ํ‚ค ๋‹ค์ด์˜ค๋“œ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜๊ณ  ์•„๋‚ ๋กœ๊ทธ ํ•€ p0.05์— ์—ฐ๊ฒฐ๋˜๋ฉฐ ์šฉ๋Ÿ‰ ์„ฑ ์„ผ์„œ์™€ ์‹œ๊ณ„ ๋ฒ„ํŠผ์—์„œ๋„ MK ํ•€ p0.25 ๋ฐ p0.27์— ๋Œ€ํ•œ ๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. .0.05 ํ•€ p0.05์—์„œ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•œ ํ›„ ์ƒํƒœ๋ฅผ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•€ pXNUMX์—์„œ๋Š” EVENTS_UP์„ ํ†ตํ•œ ๋น„๊ต๊ธฐ(NRF_LPCOMP)๋ฅผ ํ†ตํ•œ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์˜๊ฐ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์— ะธ ์—ฌ๊ธฐ์—.

์Šค์œ„์น˜๋Š” ์Šค๋งˆํŠธ ํ™ˆ ์ปจํŠธ๋กค๋Ÿฌ Majordomo(ํ”„๋กœ์ ํŠธ ์›น์‚ฌ์ดํŠธ)

statusUpdate ๋ฉ”์†Œ๋“œ์— ์Šค์œ„์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ PHP ์ฝ”๋“œ

if (getGlobal("MysensorsButton01.status")==1) {
if (getGlobal('MysensorsRelay04.status') == 0) {
setGlobal('MysensorsRelay04.status', '1');
} else if (getGlobal('MysensorsRelay04.status') == 1) {
setGlobal('MysensorsRelay04.status', '0');
} 
}

๊ฒฐ๊ณผ๋ฅผ ์˜์ƒ์œผ๋กœ ํ™•์ธํ•ด๋ณด์„ธ์š”

ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

๋‚˜์ค‘์— ๋ถ€์ŠคํŠธ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ด ๋งŒ๋“ค์–ด์กŒ์ง€๋งŒ ์ด๋Š” TTP223 ์šฉ๋Ÿ‰์„ฑ ๋งˆ์ดํฌ๋กœ ํšŒ๋กœ์˜ ์ž‘๋™๊ณผ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ์ „์ฒด ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช… ๋™์•ˆ ํ‚ค๋ฅผ ๋ˆ„๋ฅผ ๋•Œ ์–‘ํ˜ธํ•˜๊ณ  ๊ท ์ผํ•œ ์กฐ๋ช…์ด ๋” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

ํ”„๋กœ์ ํŠธ Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

๋Ÿฌ์‹œ์•„์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์‚ฌ์ดํŠธ ๋งˆ์ด์„ผ์„œ

ํ…”๋ ˆ๊ทธ๋žจ ์ฑ„ํŒ… Mysensors โ€” Mysensor ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•, ํŒ, ์š”๋ น, ๋ณด๋“œ ์„ค์น˜, Arduino IDE์—์„œ atmega 328, stm32, nRF5 ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์—… โ€” @mysensors_rus

์‚ฌ์ง„ ๋ช‡ ์žฅํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

ํ˜•๊ด‘๋“ฑ์ด ์ถ”๊ฐ€๋œ ๋ฌด์„  ํ„ฐ์น˜ ์Šค์œ„์น˜

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€