ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืฉืœื•ื ืœื›ืœ ืงื•ืจืื™ ื”ืžื“ื•ืจ "ืขืฉื” ื–ืืช ื‘ืขืฆืžืš" ื‘-Habr! ื”ืžืืžืจ ืฉืœ ื”ื™ื•ื ื™ืขืกื•ืง ื‘ืžืชื’ ื”ืžื’ืข ื‘ืฉื‘ื‘ TTP223 | ื˜ื•ืคืก ืžื™ื“ืข. ื”ืžืชื’ ืคื•ืขืœ ืขืœ ื”ืžื™ืงืจื•-ื‘ืงืจ nRF52832 | ื˜ื•ืคืก ืžื™ื“ืข, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืžื•ื“ื•ืœ YJ-17103 ืขื ืื ื˜ื ื” ืžื•ื“ืคืกืช ื•ืžื—ื‘ืจ ืœืื ื˜ื ื” ื—ื™ืฆื•ื ื™ืช MHF4. ืžืชื’ ื”ืžื’ืข ืคื•ืขืœ ืขืœ ืกื•ืœืœื•ืช CR2430 ืื• CR2450. ื”ืฆืจื™ื›ื” ื‘ืžืฆื‘ ืฉื™ื“ื•ืจ ื”ื™ื ืœื ื™ื•ืชืจ ืž-8 mA, ื‘ืžืฆื‘ ืฉื™ื ื” ืœื ื™ื•ืชืจ ืž-6 ยตA.
ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ื›ืžื• ื›ืœ ื”ืคืจื•ื™ืงื˜ื™ื ื”ืงื•ื“ืžื™ื, ื’ื ื–ื” ื”ื•ื ืคืจื•ื™ืงื˜ Arduino, ื”ืชื•ื›ื ื™ืช ื›ืชื•ื‘ื” ื‘- Arduino IDE. ื”ื˜ืžืขืช ื”ืชื•ื›ื ื” ืฉืœ ื”ืžื›ืฉื™ืจ ืžื‘ื•ืกืกืช ืขืœ ืคืจื•ื˜ื•ืงื•ืœ Mysensors | ืกืคืจื™ื•ืช GitHub, ืชืžื™ื›ื” ื‘ืœื•ื— nRF5 ื‘-GitHub ื‘-Mysensors. ืคื•ืจื•ื ืงื”ื™ืœื” ื‘ืื ื’ืœื™ืช - http://forum.mysensors.org, ืคื•ืจื•ื ืงื”ื™ืœื” ื‘ืฉืคื” ื”ืจื•ืกื™ืช - http://mysensors.ru/forum/
(ืœืžื™ ืฉืจื•ืฆื” ืœืœืžื•ื“ - ืจืฉื•ืžื•ืช, ืคืจื•ื˜ื•ืงื•ืœ ืกื“ืจืชื™, API, ืคืจื•ื˜ื•ืงื•ืœ, ืžื ืชื— | ืœืžื™ ืฉืจื•ืฆื” ืœืขื–ื•ืจ (ืชืจื•ืžื•ืช) ื‘ืคื™ืชื•ื— ื”ืคืจื•ื™ืงื˜ - ืจืฉื•ืžื•ืช)

ืœื•ื— ืžืชื’ ื”ืžื’ืข ืคื•ืชื— ื‘ืชื•ื›ื ื™ืช Deeptrace, ืชื•ืš ื”ืชื—ืฉื‘ื•ืช ื‘ื™ื™ืฆื•ืจ ืฉืœืื—ืจ ืžื›ืŸ ื‘ืฉื™ื˜ืช ืœื™ื™ื–ืจ ื’ื™ื”ื•ืฅ (LUT). ื”ืœื•ื— ืคื•ืชื— ื‘ืžื™ื“ื•ืช ืฉืœ 60x60 ืž"ืž (ืœืœื•ื— ื–ื›ื•ื›ื™ืช ืกื˜ื ื“ืจื˜ื™ ื™ืฉ ืžื™ื“ื•ืช ืฉืœ 80x80 ืž"ืž). ื”ืžืขื’ืœ ื”ื•ื“ืคืก ืขืœ ื“ืคื™ ืžื’ื–ื™ืŸ Antenna ื•ื”ื•ืขื‘ืจ ืขื ืžื’ื”ืฅ Bosch ืขื ื”ื’ื“ืจืช "Len" (ื”ืกืคืง ืžืจื‘ื™) ืขืœ ืœื•ื— ืคื™ื‘ืจื’ืœืก ื ื™ื™ืจ ื›ืกืฃ ื“ื• ืฆื“ื“ื™ 1.5 ืž"ืž, 35 ืžื™ืงืจื•ืžื˜ืจ (ื‘ื”ื™ืขื“ืจ ืื—ืจ).
ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ื”ืชื—ืจื™ื˜ ื‘ื•ืฆืข ืขื ืชืžื™ืกื” ืฉืœ ื›ืœื•ืจื™ื“ ื‘ืจื–ืœ, ืฉื”ื•ื›ื ื” ืงื•ื“ื ืœื›ืŸ ื‘ืคืจื•ืคื•ืจืฆื™ื•ืช ืฉืœ 1.5 ื›ืคื™ื•ืช ืœื›ืœ 250 ืž"ืœ ืžื™ื ื—ืžื™ื. ื”ืชื”ืœื™ืš ืืจืš 15 ื“ืงื•ืช.
ืงื™ื“ื•ื— ื—ื•ืจื™ื ืœืžืขื‘ืจื™ื ื‘ื™ืŸ-ืฉื›ื‘ืชื™ื™ื ื•ืœื”ื™ื“ื•ืง ืžื—ื–ื™ืง ื”ืกื•ืœืœื” ื‘ื•ืฆืข ืขื ืžื™ื ื™ ืžืงื“ื—ื” DREMEL 3000 ื”ืžื•ืชืงื ืช ืขืœ ืžืขืžื“ ืžืงื“ื—ื” DREMEL 220. ืงื“ื—ื• ื—ื•ืจื™ื ืœืžืขื‘ืจื™ื ื‘ื™ืŸ ืฉื›ื‘ืชื™ื™ื ืขื ืžืงื“ื—ื” 0,4 ืž"ืž, ื—ื•ืจื™ื ืœืžื—ื–ื™ืง ื”ืกื•ืœืœื” ืขื ืžืงื“ื—ื” 1,1 ืž"ืž. . ื—ื™ืชื•ืš ืœืื•ืจืš ื’ื‘ื•ืœื•ืช ื”ืœื•ื— ื ืขืฉื” ืขื ืื•ืชื• ืžื™ื ื™ ืžืงื“ื—ื” ืขื ื—ื™ื‘ื•ืจ DREMEL 540 (ืžืขื’ืœ ื—ื™ืชื•ืš d=32.0 ืž"ืž). ื”ื’ื™ื–ื•ื ื ืขืฉื” ื‘ืžื›ื•ื ืช ื”ื ืฉืžื”.
ืคื—ื™ื•ืช ื”ืœื•ื— ื”ื—ืจื•ื˜ ื ืขืฉื” ื‘ืืžืฆืขื•ืช ืกื’ืกื•ื’ืช ืจื•ื– ื‘ืชืžื™ืกื” ืžื™ืžื™ืช (ื›ืคื™ืช ื—ื•ืžืฆืช ืœื™ืžื•ืŸ ืžื’ื•ื‘ืฉืช ืœื›ืœ 1 ืž"ืœ ืžื™ื).

ืชื”ืœื™ืš ื”ื”ืœื—ืžื” ื ืžืฉืš ื›ืฉืขื”, ืจื•ื‘ ื”ื–ืžืŸ ื”ื•ืงื“ืฉ ืœื”ืœื—ืžืช ื—ื•ื˜ (ืžืฉื•ืžืจ, ืงื•ื˜ืจ 0.4 ืž"ืž) ื‘ื—ื•ืจื™ื ืœืžืขื‘ืจื™ื ื‘ื™ืŸ-ืฉื›ื‘ืชื™ื™ื.

ื”ืœื•ื— ื ืฉื˜ืฃ ืขื ืžื ืงื” ืื™ืจื•ืกื•ืœ FLUX OFF.
ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืขื™ืฆื•ื‘ ื’ื•ืฃ ื”ืžื›ืฉื™ืจ ื‘ื•ืฆืข ื‘ืขื•ืจืš ืชื›ื ื•ืŸ ืชืœืช ืžื™ืžื“ื™ ื‘ืขื–ืจืช ืžื—ืฉื‘. ืžื™ื“ื•ืช ื”ืžืืจื– 78,5 ืž"ืž X 78,5 ืž"ืž X 12 ืž"ืž.
ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ื”ื“ื’ื ื”ืžื•ืฉืœื ืฉืœ ื”ืžืืจื– ื•ืžื›ืกื” ืชื ื”ืกื•ืœืœื” ื ืฉืžืจ ื‘ืคื•ืจืžื˜ STL, ืœืื—ืจ ืžื›ืŸ ื”ื™ื” ืฆื•ืจืš ืœื”ื›ื™ืŸ ืืช ื”ื“ื’ืžื™ื ื”ืœืœื• ืœื”ื“ืคืกื” ื‘ืžื“ืคืกืช SLA (ื”ื•ืกืคืช ืชื•ืžื›ื™ื, ื›ื™ื•ื•ืŸ). ื‘ืฉืœื‘ ื–ื” ื ื•ืฆืจื” ื‘ืขื™ื” ืงื˜ื ื”, ืฉื›ืŸ ืฉื˜ื— ื”ื”ื“ืคืกื” ืฉืœ ืžื“ืคืกื•ืช SLA ื‘ื™ืชื™ื•ืช ืงื˜ืŸ. ื“ื’ื ืžืืจื– ื”ืžื›ืฉื™ืจ ื‘ืžื™ืงื•ื ื”ืื•ืคื˜ื™ืžืœื™ ื‘ื™ื•ืชืจ ื‘ื™ื—ืก ืœื–ืžืŸ ื”ื”ื“ืคืกื” ืœื ื”ืชืื™ื ืœืžื™ื“ื•ืช ืฉื˜ื— ื”ื”ื“ืคืกื”. ื‘ื”ืฆื‘ืช ื”ื“ื’ื ื‘-45 ืžืขืœื•ืช ื–ื” ื’ื ื ืชืŸ ืชื•ืฆืื” ืžืื›ื–ื‘ืช, ืžืฉืงืœ ื”ืชืžื™ื›ื” ื”ื™ื” ืฉื•ื•ื” ืœืžืฉืงืœ ื“ื’ื ื”ื’ื•ืฃ. ื”ื•ื—ืœื˜ ืœื”ื“ืคื™ืก ืืช ื”ื“ื’ื ื‘ืฆื•ืจื” ืื ื›ื™ืช, ืชื•ืš ื™ืฆื™ืจืช ืชืžื™ื›ื” ื‘ืื—ื“ ื”ืฆื“ื“ื™ื ื”ืงื“ืžื™ื™ื, ืœืื—ืจ ืฉืกื•ื›ื ืžืจืืฉ ืขื ื”ืขื•ื‘ื“ื” ืฉืœืื—ืจ ืขื™ื‘ื•ื“. ื”ื“ืคืกืช ื”ื’ื•ืฃ ืืจื›ื” 5 ืฉืขื•ืช ืขื ื”ื’ื“ืจืช ืฉื›ื‘ื” ืฉืœ 50 ืžื™ืงืจื•ืŸ. ืœืื—ืจ ืžื›ืŸ, ื”ืขื™ื‘ื•ื“ ื‘ื•ืฆืข ื‘ืืžืฆืขื•ืช ื ื™ื™ืจ ื–ื›ื•ื›ื™ืช ืขื“ื™ืŸ ืžืื•ื“ (ืœื ืื›ืชื•ื‘ ืืช ื”ืžืกืคืจ ื›ื™ ืื ื™ ืœื ื™ื•ื“ืข :)). ื”ื“ืคืกืช ืžื›ืกื” ื”ืกื•ืœืœื” ืืจื›ื” 40 ื“ืงื•ืช.
ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืœื•ื—ื•ืช ื–ื›ื•ื›ื™ืช ืž- Aliexpress ื ืžื›ืจื™ื ืขื ืžืกื’ืจืช ืคืœืกื˜ื™ืง ืฉื›ื‘ืจ ืžื•ื“ื‘ืงืช; ืœื ื”ื™ื• ื‘ืขื™ื•ืช ืขื ื”ืกืจืช ื”ืžืกื’ืจืช. ื”ืกืจืชื™ ืืช ืœื•ื— ื”ื–ื›ื•ื›ื™ืช ืœืื—ืจ ื—ื™ืžื•ื ืžืจืืฉ ืขื ืžื™ื™ื‘ืฉ ืฉื™ืขืจ ืจื’ื™ืœ.
ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ื”ืžืคื–ืจ ืœืชืื•ืจืช LED ื”ืื—ื•ืจื™ืช ื”ื™ื” ืขืฉื•ื™ ืกืจื˜ ื“ื• ืฆื“ื“ื™ ืขื ื“ื‘ืง ืืงืจื™ืœื™ 3M 9088-200. ืœืชืื•ืจืช ืคืœื•ืจืกื ื˜ ื”ื™ื• ืžืกืคืจ ื—ื•ืžืจื™ื ืœื‘ื—ื™ืจื”, ืกืจื˜ ื“ื‘ืง ืกื™ื ื™ ื•ื ื™ื™ืจ ื“ื‘ืง ื—ืชื•ื›ื™ื ืœืกืจื˜ื™ื ืฉืœ ื”ื—ื‘ืจื” ื”ืžืงื•ืžื™ืช Luminofor. ื”ื‘ื—ื™ืจื” ื ืขืฉืชื” ืœื˜ื•ื‘ืช ื™ืฆืจืŸ ื‘ื™ืชื™; ืœืคื™ ืชื—ื•ืฉื•ืชื™ื™, ื”ื•ื ื–ื•ืจื— ื‘ื”ื™ืจ ื™ื•ืชืจ ื•ืืจื•ืš ื™ื•ืชืจ. ืจื™ื‘ื•ืข ื ื™ื™ืจ ืขื ืคื™ื’ืžื ื˜ ื ื™ืื•ืŸ ื”ื•ื“ื‘ืง ืžืขืœ ืขื ืกืจื˜ ื“ื• ืฆื“ื“ื™ 3M 9088-200.

ื”ื–ื›ื•ื›ื™ืช ื”ื•ื“ื‘ืงื” ืœื’ื•ืฃ ื”ืžืชื’ ื‘ืืžืฆืขื•ืช ืกืจื˜ ื“ื• ืฆื“ื“ื™ ืขื ื“ื‘ืง ืืงืจื™ืœื™ 3M VHB 4910.
ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ื”ื›ื™ืกื•ื™ ื”ื™ื” ืงื‘ื•ืข ืขื ื‘ื•ืจื’ M 1,4 X 5 ืž"ืž.

ืขืœื•ืช ื”ืžื›ืฉื™ืจ ื”ื™ื™ืชื” 890 ืจื•ื‘ืœ.

ืœืื—ืจ ืžื›ืŸ ื”ื’ื™ืข ื—ืœืง ื”ืชื•ื›ื ื™ืช. ื”ื™ื• ื›ืžื” ื‘ืขื™ื•ืช. ืžืกืชื‘ืจ ืฉืฉื‘ื‘ื™ ื—ื™ื™ืฉืŸ TTP223 ืขื•ื‘ื“ื™ื ืžืฆื•ื™ืŸ ืขื ืืกืคืงืช ื—ืฉืžืœ ื™ืฆื™ื‘ื” ืฉืœ 3.3V ื•ืœื ืžืžืฉ ื˜ื•ื‘ ื›ืฉื”ื ืžื•ืคืขืœื™ื ื™ืฉื™ืจื•ืช ืžืกื•ืœืœื” ืฉืคืจื•ืงื” ื”ื™ื˜ื‘. ื‘ืขืช ื”ืคืขืœืช ื”ืžื›ืฉื™ืจ ืขื ืกืคืง ื›ื•ื— ื‘ืกื‘ื™ื‘ื•ืช 2.5 ื•ื•ืœื˜, ื•ื‘ื ื•ืกืฃ ืœืื—ืจ "ื ืกื™ื’ื”" ื ื•ืกืคืช ื‘ืขืช ืขื™ื‘ื•ื“ ืžืฆื’ืช Mysensors, ื”ืžื™ืงืจื•-ืžืขื’ืœ TTP223 (ืžื™ื“ ืœืื—ืจ ื›ื™ื•ืœ) ื’ืจื ืœื”ืคืจืขื” ืฉืœ ื”-MK ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ื”ื™ื” ืขื ื˜ืจื™ื’ืจ ืคืขื™ืœ.

ืžืขื’ืœ ืืกืคืงืช ื”ื—ืฉืžืœ ืœืžื™ืงืจื•-ืžืขื’ืœ ืฉื•ื ื” (ื ื™ื”ื•ืœ ืฆืจื™ื›ืช ื—ืฉืžืœ TTP223 ืขื gpio MK), ืกื•ืคืงื” ื”ืืจืงื” ื ื•ืกืคืช, ื•ื ื’ื“ื™ื ื‘ืขืœื™ ื”ืชื ื’ื“ื•ืช ื’ื‘ื•ื”ื” ื™ื•ืชืจ ื”ื•ื—ืœืคื• ื‘ืงื•ื•ื™ 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();
}

MyBoardNRF5.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

MyBoardNRF5.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

ืœืžืชื’ ื›ืคืชื•ืจ ืžื’ืข ื•ื›ืคืชื•ืจ ื˜ืืงื˜ ื‘ื’ื‘ ื”ืžื›ืฉื™ืจ. ืœื—ืฆืŸ ื˜ืืงื˜ ื–ื” ื™ืฉืžืฉ ืขื‘ื•ืจ ืžืฆื‘ื™ ืฉื™ืจื•ืช, ืžืฆื‘ ื›ืจื™ื›ื” ื‘ืื•ื•ื™ืจ ื•ืื™ืคื•ืก ื”ืžื›ืฉื™ืจ. ืœื›ืคืชื•ืจ ื™ืฉ ืชื›ื•ื ืช ื‘ืจื–ืœ ื ื’ื“ ื”ืงืคืฆื”. ื”ืงื• ืฉืœ ื”ื—ื™ื™ืฉืŸ ื”ืงื™ื‘ื•ืœื™ ื•ื”ืงื• ืฉืœ ื›ืคืชื•ืจ ื”ื˜ืืงื˜ ืžื—ื•ื‘ืจื™ื ื“ืจืš ื“ื™ื•ื“ื•ืช ืฉื•ื˜ืงื™ ื•ืžื—ื•ื‘ืจื™ื ืœืคื™ืŸ ื”ืื ืœื•ื’ื™ p0.05, ื•ื’ื ืžื”ื—ื™ื™ืฉืŸ ื”ืงื™ื‘ื•ืœื™ ื•ืžื›ืคืชื•ืจ ื”ื˜ืืงื˜ ื™ืฉ ืงื•ื•ื™ื ืœืคื™ื ื™ MK p0.25 ื•-p0.27 .0.05 ืœืงืจื™ืืช ืžืฆื‘ื™ื ืœืื—ืจ ื”ืคืขืœืช ื”ื”ืคืกืงื” ื‘ืคื™ืŸ p0.05. XNUMX. ื‘ืคื™ืŸ pXNUMX, ืžื•ืคืขืœืช ืคืกื™ืงื” ื“ืจืš ื”ืžืฉื•ื•ื” (NRF_LPCOMP) ื“ืจืš EVENTS_UP. ืงื™ื‘ืœืชื™ ื”ืฉืจืื” ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื›ืืŸ ะธ ื›ืืŸ.

ื”ืžืชื’ ื ื•ืกืฃ ืœืจืฉืช Mysensors, ื”ืžื ื•ื”ืœืช ืขืœ ื™ื“ื™ ื‘ืงืจ ื”ื‘ื™ืช ื”ื—ื›ื Majordomo (ืืชืจ ื”ืคืจื•ื™ืงื˜)

ืงื•ื“ PHP ืœื”ื•ืกืคืช ืžืชื’ ืœืฉื™ื˜ืช statusUpdate

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 - ืคืชืจื•ืŸ ืžื”ื™ืจ ืœื‘ืขื™ื•ืช ืขื Mysensors, ื˜ื™ืคื™ื, ื˜ืจื™ืงื™ื, ื”ืชืงื ืช ืœื•ื—ื•ืช, ืขื‘ื•ื“ื” ืขื ืžื™ืงืจื•-ื‘ืงืจื™ atmega 328, stm32, nRF5 ื‘-Arduino IDE - @mysensors_rus

ืžืขื˜ ืชืžื•ื ื•ืชืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืžืชื’ ืžื’ืข ืืœื—ื•ื˜ื™ ืขื ืชืื•ืจื” ืื—ื•ืจื™ืช ืคืœื•ืจื•ืกื ื˜ื™ืช ื ื•ืกืคืช

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”