рдорд┐рдиреА рд▓рд╛рдЗрдЯ рдФрд░ рд╢реЙрдХ рд╕реЗрдВрд╕рд░ | nRF52840

рдЖрдЬ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд╢ рдФрд░ рдХрдВрдкрди рд╕реЗрдВрд╕рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕реЗрдВрд╕рд░ рдореЙрдбреНрдпреВрд▓ E73-2G4M08S1C (nRF52840) рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдордХреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдХрд╛рд░рдг рд╕рдВрджреАрдк рдорд┐рд╕реНрддреНрд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдХрдо рд▓рд╛рдЧрдд, рдЙрддреНрдХреГрд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ MySensors рд╕реЗ ZigBee рдХреЗ рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ Arduino IDE рдХреЛ рд╕рдорд░реНрдерди рдХреЗ рдмрдЬрд╛рдп рд╕рд░рд▓ рдЕрддрд┐рд░рд┐рдХреНрдд рдерд╛ :)



рдореЗрд░реЗ рдШрд░ рдореЗрдВ рдПрдХ рд░реЛрд▓рд░ рдмреНрд▓рд╛рдЗрдВрдб рдХреЗ рдЖрдЧрдорди рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреИрджрд╛ рд╣реБрдИ :)ред рд░реЛрд▓рд░ рдЕрдВрдзрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐ рд╡рд╣ рдЙрд╕ рдЦрд┐рдбрд╝рдХреА рд╕реЗ рд╕реАрдзреЗ рд░реЛрд╢рдиреА рдХреЗ рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗ рдЬрд┐рд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдХ рджреНрд╡рд╛рд░рд╛ рдкрд░реНрджрд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ BH1750FVI рд╕реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ, рдЗрд╕ рд╕реЗрдВрд╕рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдареАрдХ рдереАрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрд░реА рдЕрдиреНрдп diy рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдВрд╕рд░ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╕рдордп, рдХрд┐рд╕реА рдиреЗ MAX44009 рд╕реЗрдВрд╕рд░ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрд╛ рдФрд░ рдЙрд╕ рдХреНрд╖рдг рд╕реЗ рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ BH1750FVI рдпрд╛рдж рдирд╣реАрдВ рдЖрдпрд╛ред



MAX44009 рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ:

  • рдЖрдкреВрд░реНрддрд┐ рд╡реЛрд▓реНрдЯреЗрдЬ рд░реЗрдВрдЬ 1.7-3.6 V,
  • рдЕрд▓реНрдЯреНрд░рд╛-рд▓реЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдХрд░рдВрдЯ - 0.65 ╬╝A (рдХрдИ рд╕рдорд╛рди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд╡рд░ рдбрд╛рдЙрди рдореЛрдб рдореЗрдВ рдХрд░рдВрдЯ рд╕реЗ рдХрдо),
  • рд╡рд╛рдЗрдб 22-рдмрд┐рдЯ рдбрд╛рдпрдиреЗрдорд┐рдХ рд░реЗрдВрдЬ 0.045-188000,
  • рд░реБрдХрд╛рд╡рдЯ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рд░реЛрд╢рдиреА рдХреЗ рд╕реНрддрд░ рдХреА рдирд┐рд░рдВрддрд░ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдкрд░ рдПрдорд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдзрд╛ рд╕рдВрдХреЗрдд рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рднреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХрддрд╛ рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдиреНрдирдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдереЛрдбрд╝реЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдЙрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдХрдВрдкрди рд╕реЗрдВрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕реЗрдВрд╕рд░ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдШрдЯрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпреВрдбреА рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗрдВрд╕рд░ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдШрд░ рдореЗрдВ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ (рдЬрдм рдХрдорд░реЗ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рдЪрд╛рд▓реВ рдХрд░реЗрдВ), рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдкрд░, рдХреЛрдИ рднреА рдШрд░ рдкрд░ рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реЗрдВрд╕рд░ рдХреЛ рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рд╡рд╛рдЗрдмреНрд░реЗрд╢рди рдФрд░ рд╢реЙрдХ рд╕реЗрдВрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрдЯ рд╕реЗрдВрд╕рд░ рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХреЛ рд╣реА рдШреВрдорд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХреНрд╕реАрд▓рд░реЛрдореАрдЯрд░ рдХреЛ рднреА рддрдкрд╕, рдШреБрдорд╛рд╡, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, LIS2DW12 рд╕реЗрдВрд╕рд░ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдмрд╛рдЬрд╛рд░ рдкрд░ рд╕рдмрд╕реЗ рдХрд┐рдлрд╛рдпрддреА рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдпрджрд┐ рд╕рдмрд╕реЗ рдХрд┐рдлрд╛рдпрддреА рдирд╣реАрдВ рд╣реИред



LIS2DW12 рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

  • рдЖрдкреВрд░реНрддрд┐ рд╡реЛрд▓реНрдЯреЗрдЬ рд░реЗрдВрдЬ 1.62-3.6 V,
  • рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдореЛрдб рдореЗрдВ 50 рдПрдирдП
  • рдХрдо рдмрд┐рдЬрд▓реА рдореЛрдб рдореЗрдВ 1 ╬╝A,
  • рд░реБрдХрд╛рд╡рдЯ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рд╕реЗрдВрд╕рд░ рдХреЗ рдирд┐рд░рдВрддрд░ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдкрд░ рдПрдорд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдзрд╛ рд╕рдВрдХреЗрдд рдХрд╛ рдЧрдардиред

LIS2DW12 рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ Arduino рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдкреВрд░реА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдПрдХреНрд╕реАрд▓рд░реЛрдореАрдЯрд░ рдореЙрдбрд▓ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рд╛рде Arduino рднрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЖрд╢рдВрдХрд╛, рдЗрд╕реА рддрд░рд╣ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдж рдореЗрдВ рдПрдХ рдФрд░ LIS2DH12 рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХрдо рдмрд┐рдЬрд▓реА рдореЛрдб рдореЗрдВ рдЙрдЪреНрдЪ рдЦрдкрдд - 2 ╬╝Aред LIS2DH12 рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ Arduino рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИрдВред

рд▓рд╛рдЗрдЯ рд╕реЗрдВрд╕рд░ CR2032 рдмреИрдЯрд░реА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реИред



рдХрдИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП MySensors рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╢рд╛рдпрдж рдмреИрдЯрд░реА рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ MySensors рдХреЗ рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЬрдм рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдк-рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг рдореЛрдб, рдиреАрдВрдж рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реБрдХрд╛рд╡рдЯреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдк-рд░реВрдкреА рдЦрдкрдд, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рд╕рдкрдиреЗ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред рд╕рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░рддреА рд╣реИрдВ рдХрд┐ рдореЗрдиреНрд╕реЗрдВрд╕рд░реНрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдВрд╕реНрдерд╛рдкрдХреЛрдВ рдХрд╛ рдмреИрдЯрд░реА рдХреЗ рдкреНрд░рддрд┐ рдмреБрд░рд╛ рд░рд╡реИрдпрд╛ рд╣реИ :)

рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрди рдХрдорд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рд╡рд╣ рд░реБрдХрд╛рд╡рдЯ рдереАред рдЖрдорддреМрд░ рдкрд░, рдЬрдм рдиреАрдВрдж рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд░реБрдХрд╛рд╡рдЯреЛрдВ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ nRF52 MK, MK рдХреА рдЦрдкрдд (nRF52810-52811 рдХреЗ рд▓рд┐рдП 1.4 ╬╝A рд╕реЗ рдФрд░ nFF52832-52840 рдХреЗ рд▓рд┐рдП 4.7 ╬╝A рддрдХ) рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП + 10mKA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдХреБрд▓ 2 рд╡реНрдпрд╡рдзрд╛рди рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

int8_t sleep(const uint8_t interrupt1, const uint8_t mode1, const uint8_t interrupt2, const uint8_t mode2, const uint32_t sleepingMS = 0, const bool smartSleep = false); 

рдкрд╣рд▓реЗ рдПрдХ рд╕рдкрдиреЗ рдореЗрдВ рдЦрдкрдд рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЦреЛрдЬ рдореЗрдВ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдо рдЦрдкрдд рд╡рд╛рд▓реЗ рддреБрд▓рдирд┐рддреНрд░ рдкрд░ рдЗрдВрдЯрд░рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдерд╛, рдПрдХ рд╕рдкрдиреЗ рдореЗрдВ рдЦрдкрдд рдЕрдм + 10 ╬╝A рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди +1 ╬╝A рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдб рдореЗрдВ рдЕрд╕реБрд╡рд┐рдзрд╛ (рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд┐рди рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдХреЗрдд) рдФрд░ рдмреЛрд░реНрдб (рдбрд╛рдпреЛрдб) рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрддреНрд╡реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдерд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЗрд╕ рд╕рдордп рддрдХ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдереЛрдбрд╝рд╛ рдкрд░рд┐рдЪрд┐рдд рдерд╛ :) nRF5 SDK рдХреЗ рд╕рд╛рде, рдЗрд╕рд▓рд┐рдП mysensors.org рдлреЛрд░рдо (рд╕рдВрдХреЗрдд, рдЯрд┐рдкреНрд╕ :)) рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ nRF5 SDK рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ ... рдФрд░ рдкрд╛рдпрд╛ред рдЕрдм рдПрдХ рдЕрд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЬреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрджреАрдкрдорд┐рд╕реНрдЯреНрд░реА nRF5 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХреЛрдб рдореЗрдВ WInterrupts рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВред GPIOTE_IRQHandler () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ "рдХрдордЬреЛрд░" рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб - __attribute__ ((рдХрдордЬреЛрд░)) рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред



рдлрд╝рд╛рдЗрд▓ рдкрде рдкрд░ рд╕реНрдерд┐рдд рд╣реИ - C: \ Users \ USER_COMPA \ AppData \ Local \ Arduino15 \ package \ sandeepmistry \
рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ \ nRF5 \ 0.6.0 \ cores \ nRF5 \
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЗрдВ рдореЗрд░реЗ рдЧреАрддрд╛ рдореЗрдВ рдлрд╝реЛрд▓реНрдбрд░ EFEKTA-LIS2DW12-MAX44009-E73C / SOURCE CODE / ARDUINO / рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрдХреЗрдЪ EFEKTA-LIS2DW12-MAX44009-E73C / SOURCE CODE рдФрд░ COFFCE CODE рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдЧрд▓реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд╡рд╣ рдереА рд╕рдВрджреАрдкрдорд┐рд╕реНрдЯреНрд░реА nRF5 рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЬреЛ рдирдП MK nRF52840, nRF52811 рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд░реВрдк рд╕реЗ nRF52810 (рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рд╕рдкрдиреЗ рдореЗрдВ 1.4 ╬╝A рдЖрдкрдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ :))ред рдмреЗрд╢рдХ, рдЖрдк Arduino IDE рдореЗрдВ nRF52840 рдХреЗ рд╕рд╛рде рдФрд░ nRF52832 рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди ... рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдКрдкрд░, рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдиреЙрд░реНрдбрд┐рдХ рдПрд╕рдбреАрдХреЗ рдкрд░ рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдПрдордЬреА рдПрдирдЖрд░рдПрдл 5 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╕реАрдЧрд░ рдПрдВрдмреЗрдбреЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдореБрдлреНрдд рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╕рднреА рдмреЛрд░реНрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдПрд╕рдбреАрдХреЗ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрд░реБрдбрд┐рдиреЛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЕрдм рддрдХ рд╕реЛрдлреНрдЯрджреЗрд╡ рдХреЗ рдмрд┐рдирд╛, рдФрд░ рдпрд╣ mysensors рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ)ред MySensors рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдирдП рдмреЛрд░реНрдб рднреА рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред



github.com/smartboxchannel/arduino-nRF5
github.com/smartboxchannel/MySensors

рдпрджрд┐ рдкрд╛рдардХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдХрд┐ рдореИрдВрдиреЗ, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдкреНрд░рдХрд╛рд╢ рд╕рдВрд╡реЗрджрдХ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде SLA рдкрд░ рдПрдХ рддрд░рд▓ рдмрд╣реБрд▓рдХ рдкреНрд░рд┐рдВрдЯрд░ рдмрдирд╛рдпрд╛ рдерд╛ред рдЗрд╕ рддрдХрдиреАрдХ рдкрд░ рдореБрджреНрд░рдг рдХреЗ рдлрд╛рдпрджреЗ рдЗрд╕рдХреА рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ, рдкреЙрд▓рд┐рдорд░, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдШрд░реЗрд▓реВ рдПрд╕рдПрд▓рдП рдкреНрд░рд┐рдВрдЯрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдЕрднреА рднреА рдПрдлрдбреАрдПрдо рдХреЗ рд▓рд┐рдП рдкреНрд▓рд╛рд╕реНрдЯрд┐рдХ рдХреА рддрд╛рдХрдд рдореЗрдВ рд╣реАрди рд╣реИрдВред рдорд╛рдорд▓реЗ рдХреЗ 3 рдбреА рдореЙрдбрд▓ рдореЗрдВ 2 рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЖрдзреЗ рдХреЛ 40 рдорд┐рдирдЯ (рдкрд░рдд 50 рдорд╛рдЗрдХреНрд░реЛрди) рдХреЗ рд▓рд┐рдП рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдБ рд░реБрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ 3D рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЪрд┐рддреНрд░реЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реАред







рд╕реЗрдВрд╕рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдиреЗ рдкреНрд░рд╕реНрддреБрддрд┐рдпреЛрдВ рдХреЛ рднреЗрдЬреЗ рдмрд┐рдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рд░рд┐рдмреВрдЯ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдЬрдмрдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдирдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрдВрдЬреАрдХрд░рдг рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛, рд╕рдлрд▓ рдкрдВрдЬреАрдХрд░рдг рдкрд░, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдХрд░рдг рдЕрдм рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рднреЗрдЬреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рд╕реЗрдВрд╕рд░ рдкрд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдкреНрд░рд╕реНрддреБрддрд┐ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣) рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╕рднреА рд╕реЗрдВрд╕рд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдПрдХ рдорд╛рдирдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рд╕реЗрдВрд╕рд░ рдиреЗрдЯрд╡рд░реНрдХ рдЦреЛ рджреЗрддрд╛ рд╣реИ), рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдЧреИрд░-рдорд╛рдирдХ рд╡рд┐рдХрд▓реНрдк :) рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ рд╕реЗрдВрд╕рд░ 5 рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ (рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ) рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗрдВрд╕рд░ рд╕реЗ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╢реБрд░реВ рдореЗрдВ / 2 рд╕реЗрдВрд╕рд░ рд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмрд░рд╛рдмрд░ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЦреЛрдЬ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рднреЗрдЬрдиреЗ, рд╕реНрд╡рд╕реНрде рд╕рдкрдиреЗ рднреЗрдЬрдиреЗ рдХреЗ рдмреАрдЪред рдпрд╣ рд╕рдм рдЖрдкрдХреЛ рдмреИрдЯрд░реА рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЯреЗрд╕реНрдЯ рдХреЛрдб
 // SDK PORT extern "C" { #include "app_gpiote.h" #include "nrf_gpio.h" } #define APP_GPIOTE_MAX_USERS 1 #include <LIS2DW12Sensor.h> #include <MAX44009.h> //#define MY_DEBUG #define MY_RADIO_NRF5_ESB #define MY_DISABLED_SERIAL int16_t mtwr; #define MY_TRANSPORT_WAIT_READY_MS (mtwr) #define MY_NRF5_ESB_PA_LEVEL (NRF5_PA_MAX) #include <MySensors.h> #define SN "LUX & VIBRO SENS" #define SV "1.0" #define V_SENS_CHILD_ID 1 #define LUX_SENS_CHILD_ID 2 #define WPM_SENS_CHILD_ID 3 #define INTERVAL_R_LUX_CHILD_ID 220 #define LEVEL_SENSIV_V_SENS_CHILD_ID 230 #define ENABLE_WPM_SENS_CHILD_ID 240 #define SIGNAL_Q_ID 253 #define TEMP_CHILD_ID 254 //for any tests #include <MySensors.h> MyMessage vibroMsg(V_SENS_CHILD_ID, V_TRIPPED); MyMessage brightMsg(LUX_SENS_CHILD_ID, V_LEVEL); MyMessage wpmMsg(WPM_SENS_CHILD_ID, V_LEVEL); MyMessage conf_wpmMsg(ENABLE_WPM_SENS_CHILD_ID, V_VAR1); MyMessage conf_vsensMsg(LEVEL_SENSIV_V_SENS_CHILD_ID, V_VAR1); MyMessage conf_interv_rluxMsg(INTERVAL_R_LUX_CHILD_ID, V_VAR1); MyMessage tempMsg(TEMP_CHILD_ID, V_VAR1); //for any tests bool nosleep = 0; bool button_flag = 0; bool configMode = 0; bool wpm_enable = 0; bool onoff = 1; bool flag_update_transport_param; bool flag_sendRoute_parent; bool flag_no_present; bool flag_nogateway_mode; bool flag_find_parent_process; bool flag_fcount; bool Ack_TL; bool Ack_FP; bool PRESENT_ACK; byte conf_vibro_set = 1; byte interval_reading_lux = 10; byte err_delivery_beat; byte problem_mode_count; uint8_t countbatt = 0; uint8_t batt_cap; uint8_t old_batt_cap = 100; //unsigned long BATT_TIME = 43200000; //12 hours uint32_t BATT_TIME = 7200000; //12 hours uint32_t SLEEP_TIME_TEMP = 60000; //1 minute uint32_t SLEEP_TIME; uint32_t C_BATT_TIME; uint32_t oldmillis; uint32_t newmillis; uint32_t previousMillis; uint32_t lightMillisR; uint32_t configMillis; uint32_t interrupt_time; uint32_t SLEEP_TIME_W; uint32_t axel_time; int16_t result; int16_t brightness; int16_t lastbrightness; int16_t brightThreshold = 25; int16_t myid; int16_t mypar; int16_t old_mypar = -1; int16_t master_id; float Wpm; float ODR_1Hz6_LP_ONLY = 1.6f; float ODR_12Hz5 = 12.5f; float ODR_25Hz = 25.0f; float ODR_50Hz = 50.0f; float ODR_100Hz = 100.0f; float ODR_200Hz = 200.0f; bool vibro = 1; static app_gpiote_user_id_t m_gpiote_user_id; uint32_t PIN_BUTTON1_MASK; uint32_t AXEL_INT1_MASK; volatile byte axelInt1Status = 0; volatile byte buttInt1Status = 0; uint16_t batteryVoltage; int16_t linkQuality; int16_t old_linkQuality; LIS2DW12Sensor *lis2; MAX44009 light; void preHwInit() { board_Init(); } void before() { blinky(1, 1, GREEN_LED); wait(1000); nRF_Init(); device_Conf(); happy_init(); } void setup() { interrupt_Init(); sensors_Init(); config_Happy_node(); } void presentation() { if (!sendSketchInfo(SN, SV)) { _transportSM.failedUplinkTransmissions = 0; sleep(1000); wait(50); if (!sendSketchInfo(SN, SV)) { _transportSM.failedUplinkTransmissions = 0; } } present(V_SENS_CHILD_ID, S_VIBRATION, "STATUS VIBRO", 1); wait(2500, C_PRESENTATION, S_VIBRATION); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); if (PRESENT_ACK == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); present(V_SENS_CHILD_ID, S_VIBRATION, "STATUS VIBRO", 1); wait(2500, C_PRESENTATION, S_VIBRATION); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { PRESENT_ACK = 0; } present(LUX_SENS_CHILD_ID, S_LIGHT_LEVEL, "LUX", 1); wait(2500, C_PRESENTATION, S_LIGHT_LEVEL); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); if (PRESENT_ACK == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); present(LUX_SENS_CHILD_ID, S_LIGHT_LEVEL, "LUX", 1); wait(2500, C_PRESENTATION, S_LIGHT_LEVEL); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { PRESENT_ACK = 0; } present(WPM_SENS_CHILD_ID, S_LIGHT_LEVEL, "W/M^2", 1); wait(2500, C_PRESENTATION, S_LIGHT_LEVEL); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); if (PRESENT_ACK == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); present(WPM_SENS_CHILD_ID, S_LIGHT_LEVEL, "W/M^2", 1); wait(2500, C_PRESENTATION, S_LIGHT_LEVEL); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { PRESENT_ACK = 0; } present(SIGNAL_Q_ID, S_CUSTOM, "SIGNAL QUALITY", 1); wait(2500, C_PRESENTATION, S_CUSTOM); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); if (PRESENT_ACK == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); present(SIGNAL_Q_ID, S_CUSTOM, "SIGNAL QUALITY", 1); wait(2500, C_PRESENTATION, S_CUSTOM); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { PRESENT_ACK = 0; } present(ENABLE_WPM_SENS_CHILD_ID, S_CUSTOM, "ON|OFF WPM", 1); wait(2500, C_PRESENTATION, S_CUSTOM); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); if (PRESENT_ACK == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); present(ENABLE_WPM_SENS_CHILD_ID, S_CUSTOM, "ON|OFF WPM", 1); wait(2500, C_PRESENTATION, S_CUSTOM); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { PRESENT_ACK = 0; } present(LEVEL_SENSIV_V_SENS_CHILD_ID, S_CUSTOM, "SENS LEVEL VIBRO", 1); wait(2500, C_PRESENTATION, S_CUSTOM); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); if (PRESENT_ACK == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); present(LEVEL_SENSIV_V_SENS_CHILD_ID, S_CUSTOM, "SENS LEVEL VIBRO", 1); wait(2500, C_PRESENTATION, S_CUSTOM); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { PRESENT_ACK = 0; } present(INTERVAL_R_LUX_CHILD_ID, S_CUSTOM, "INTERVAL RLUX|MIN", 1); wait(2500, C_PRESENTATION, S_CUSTOM); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); if (PRESENT_ACK == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); present(INTERVAL_R_LUX_CHILD_ID, S_CUSTOM, "INTERVAL RLUX|MIN", 1); wait(2500, C_PRESENTATION, S_CUSTOM); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER PRESENT SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { PRESENT_ACK = 0; } send(conf_wpmMsg.set(wpm_enable), 1); wait(2500, C_SET, V_VAR1); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER SEND CONF SENSOR\n")); if (Ack_TL == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); send(conf_wpmMsg.set(wpm_enable), 1); wait(2500, C_SET, V_VAR1); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER SEND CONF SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { Ack_TL = 0; } send(conf_vsensMsg.set(conf_vibro_set), 1); wait(2500, C_SET, V_VAR1); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER SEND CONF SENSOR\n")); if (Ack_TL == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); send(conf_vsensMsg.set(conf_vibro_set), 1); wait(2500, C_SET, V_VAR1); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER SEND CONF SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { Ack_TL = 0; } send(conf_interv_rluxMsg.set(interval_reading_lux), 1); wait(2500, C_SET, V_VAR1); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER SEND CONF SENSOR\n")); if (Ack_TL == 0) { _transportSM.failedUplinkTransmissions = 0; sleep(1500); wait(50); send(conf_interv_rluxMsg.set(interval_reading_lux), 1); wait(2500, C_SET, V_VAR1); CORE_DEBUG(PSTR("MyS: TEST WAIT AFTER SEND CONF SENSOR\n")); _transportSM.failedUplinkTransmissions = 0; } else { Ack_TL = 0; } } void loop() { if (flag_update_transport_param == 1) { update_Happy_transport(); } if (flag_sendRoute_parent == 1) { present_only_parent(); } if (isTransportReady() == true) { if (flag_nogateway_mode == 0) { if (flag_find_parent_process == 1) { find_parent_process(); } if (configMode == 0) { if ((axelInt1Status == AXEL_INT1) || (buttInt1Status == PIN_BUTTON1)) { if (axelInt1Status == AXEL_INT1) { nosleep = 1; send_Axel(); axelInt1Status = 0; newmillis = millis(); interrupt_time = newmillis - oldmillis; SLEEP_TIME_W = SLEEP_TIME_W - interrupt_time; if (SLEEP_TIME_W < 5000) { SLEEP_TIME_W = SLEEP_TIME; send_Brigh(1); countbatt++; if (countbatt == C_BATT_TIME) { sendBatteryStatus(1); countbatt = 0; } } nosleep = 0; } if (buttInt1Status == PIN_BUTTON1) { if (digitalRead(PIN_BUTTON1) == 0 && button_flag == 0) { button_flag = 1; nosleep = 1; previousMillis = millis(); ledsOff(); } if (digitalRead(PIN_BUTTON1) == 0 && button_flag == 1) { if ((millis() - previousMillis > 0) && (millis() - previousMillis <= 1750)) { if (millis() - lightMillisR > 25) { lightMillisR = millis(); onoff = !onoff; digitalWrite(GREEN_LED, onoff); } } if ((millis() - previousMillis > 1750) && (millis() - previousMillis <= 2000)) { ledsOff(); } if ((millis() - previousMillis > 2000) && (millis() - previousMillis <= 4000)) { if (millis() - lightMillisR > 25) { lightMillisR = millis(); onoff = !onoff; digitalWrite(BLUE_LED, onoff); } } if ((millis() - previousMillis > 4000) && (millis() - previousMillis <= 4250)) { ledsOff(); } if ((millis() - previousMillis > 4250) && (millis() - previousMillis <= 6250)) { if (millis() - lightMillisR > 25) { lightMillisR = millis(); onoff = !onoff; digitalWrite(RED_LED, onoff); } } if ((millis() - previousMillis > 6250) && (millis() - previousMillis <= 6500)) { ledsOff(); } if ((millis() - previousMillis > 6500) && (millis() - previousMillis <= 8500)) { if (millis() - lightMillisR > 50) { lightMillisR = millis(); onoff = !onoff; digitalWrite(RED_LED, onoff); } } if (millis() - previousMillis > 8500) { ledsOff(); } } if (digitalRead(PIN_BUTTON1) == 1 && button_flag == 1) { if (millis() - previousMillis <= 2000) { ledsOff(); send_Brigh(0); nosleep = 0; button_flag = 0; buttInt1Status = 0; } if ((millis() - previousMillis > 2000) && (millis() - previousMillis <= 4000)) { ledsOff(); configMode = 1; button_flag = 0; configMillis = millis(); } if ((millis() - previousMillis > 4250) && (millis() - previousMillis <= 6250)) { ledsOff(); blinky(2, 2, RED_LED); button_flag = 0; buttInt1Status = 0; presentation(); nosleep = 0; } if ((millis() - previousMillis > 6500) && (millis() - previousMillis <= 8500)) { ledsOff(); blinky(3, 3, RED_LED); new_device(); } if (((millis() - previousMillis > 1750) && (millis() - previousMillis <= 2000)) || ((millis() - previousMillis > 4000) && (millis() - previousMillis <= 4250)) || ((millis() - previousMillis > 6250) && (millis() - previousMillis <= 6500)) || ((millis() - previousMillis > 8500))) { ledsOff(); blinky(1, 2, GREEN_LED); nosleep = 0; button_flag = 0; buttInt1Status = 0; } } } } else { SLEEP_TIME_W = SLEEP_TIME; send_Brigh(1); countbatt++; if (countbatt == C_BATT_TIME) { sendBatteryStatus(1); countbatt = 0; } nosleep = 0; } } else { if (millis() - configMillis > 30000) { blinky(3, 3, GREEN_LED); configMode = 0; nosleep = 0; button_flag = 0; buttInt1Status = 0; } } } else { if (buttInt1Status == PIN_BUTTON1) { if (digitalRead(PIN_BUTTON1) == 0 && button_flag == 0) { button_flag = 1; nosleep = 1; previousMillis = millis(); ledsOff(); } if (digitalRead(PIN_BUTTON1) == 0 && button_flag == 1) { if ((millis() - previousMillis > 0) && (millis() - previousMillis <= 500)) { ledsOff(); } if ((millis() - previousMillis > 500) && (millis() - previousMillis <= 2500)) { lightMillisR = millis(); onoff = !onoff; digitalWrite(BLUE_LED, onoff); } if ((millis() - previousMillis > 2500) && (millis() - previousMillis <= 2750)) { ledsOff(); } if ((millis() - previousMillis > 2750) && (millis() - previousMillis <= 4750)) { if (millis() - lightMillisR > 50) { lightMillisR = millis(); onoff = !onoff; digitalWrite(RED_LED, onoff); } } if (millis() - previousMillis > 4750) { ledsOff(); blinky(3, 1, GREEN_LED); button_flag = 0; nosleep = 0; buttInt1Status = 0; } } if (digitalRead(PIN_BUTTON1) == 1 && button_flag == 1) { if (millis() - previousMillis <= 500) { ledsOff(); button_flag = 0; nosleep = 0; buttInt1Status = 0; } if ((millis() - previousMillis > 500) && (millis() - previousMillis <= 2500)) { ledsOff(); blinky(1, 1, BLUE_LED); check_parent(); button_flag = 0; nosleep = 0; buttInt1Status = 0; } if ((millis() - previousMillis > 2500) && (millis() - previousMillis <= 2750)) { ledsOff(); button_flag = 0; nosleep = 0; buttInt1Status = 0; } if ((millis() - previousMillis > 2750) && (millis() - previousMillis <= 4750)) { ledsOff(); blinky(3, 3, RED_LED); new_device(); } if (millis() - previousMillis > 4750) { ledsOff(); button_flag = 0; nosleep = 0; buttInt1Status = 0; } } } else { check_parent(); } } } if (_transportSM.failureCounter > 0) { _transportConfig.parentNodeId = loadState(101); _transportConfig.nodeId = myid; _transportConfig.distanceGW = loadState(103); mypar = _transportConfig.parentNodeId; nosleep = 0; flag_fcount = 1; err_delivery_beat = 5; happy_node_mode(); gateway_fail(); } if (configMode == 0) { if (nosleep == 0) { oldmillis = millis(); axelInt1Status = 0; buttInt1Status = 0; wait(100); sleep(SLEEP_TIME_W, false); wait(50); nosleep = 1; } } } float GetWpm() { float SunLuxCoef = 0.0079; float Wpm_temp = 0; Wpm_temp = (float)brightness; Wpm_temp *= SunLuxCoef; return Wpm_temp; } void blinky(uint8_t pulses, uint8_t repit, uint8_t ledColor) { for (int x = 0; x < repit; x++) { if (x > 0) { sleep(300); } for (int i = 0; i < pulses; i++) { if (i > 0) { sleep(80); } digitalWrite(ledColor, LOW); sleep(20); digitalWrite(ledColor, HIGH); } } } void ledsOff() { digitalWrite(RED_LED, HIGH); digitalWrite(GREEN_LED, HIGH); digitalWrite(BLUE_LED, HIGH); } void nRF_Init() { NRF_POWER->DCDCEN = 1; NRF_NFCT->TASKS_DISABLE = 1; NRF_NVMC->CONFIG = 1; NRF_UICR->NFCPINS = 0; NRF_NVMC->CONFIG = 0; NRF_SAADC ->ENABLE = 0; NRF_PWM0 ->ENABLE = 0; NRF_PWM1 ->ENABLE = 0; NRF_PWM2 ->ENABLE = 0; NRF_TWIM1 ->ENABLE = 0; NRF_TWIS1 ->ENABLE = 0; NRF_RADIO->TXPOWER = 8; } void sensors_Init() { Wire.begin(); wait(100); light.begin(); wait(100); lis2 = new LIS2DW12Sensor (&Wire); vibro_Init(); if (isTransportReady() == true) { blinky(3, 1, BLUE_LED); wait(200); blinky(3, 1, GREEN_LED); wait(200); blinky(3, 1, RED_LED); SLEEP_TIME_W = SLEEP_TIME; send_Brigh(0); wait(50); sendBatteryStatus(0); axel_time = millis(); } else { blinky(5, 3, RED_LED); } } void vibro_Init() { if (conf_vibro_set == 1) { lis2->ODRTEMP = ODR_1Hz6_LP_ONLY; } if (conf_vibro_set == 2) { lis2->ODRTEMP = ODR_12Hz5; } if (conf_vibro_set == 3) { lis2->ODRTEMP = ODR_25Hz; } if (conf_vibro_set == 4) { lis2->ODRTEMP = ODR_100Hz; } if (conf_vibro_set == 5) { lis2->ODRTEMP = ODR_200Hz; } lis2->Enable_X(); wait(50); lis2->Enable_Wake_Up_Detection(); wait(50); } void board_Init() { pinMode(PIN_BUTTON1, INPUT); pinMode(AXEL_INT1, INPUT); pinMode(AXEL_INT2, INPUT); pinMode(AMBI_INT, INPUT); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); pinMode(BLUE_LED, OUTPUT); ledsOff(); } void send_Axel() { if (millis() - axel_time >= 5000) { blinky(6, 1, RED_LED); lis2->Disable_Wake_Up_Detection(); wait(100); if (_transportConfig.parentNodeId == 0) { if (send(vibroMsg.set(vibro))) { wait(100); err_delivery_beat = 0; if (flag_nogateway_mode == 1) { flag_nogateway_mode = 0; CORE_DEBUG(PSTR("MyS: NORMAL GATEWAY MODE\n")); err_delivery_beat = 0; } } else { _transportSM.failedUplinkTransmissions = 0; if (err_delivery_beat < 5) { err_delivery_beat++; } if (err_delivery_beat == 4) { if (flag_nogateway_mode == 0) { gateway_fail(); CORE_DEBUG(PSTR("MyS: LOST GATEWAY MODE\n")); } } } lis2->Enable_Wake_Up_Detection(); wait(100); axel_time = millis(); nosleep = 0; } if (_transportConfig.parentNodeId > 0) { send(vibroMsg.set(vibro), 1); wait(2500, C_SET, V_TRIPPED); if (Ack_TL == 1) { Ack_TL = 0; err_delivery_beat = 0; //sleep_flag = 0; if (flag_nogateway_mode == 1) { flag_nogateway_mode = 0; CORE_DEBUG(PSTR("MyS: NORMAL GATEWAY MODE\n")); err_delivery_beat = 0; } } else { _transportSM.failedUplinkTransmissions = 0; if (err_delivery_beat < 5) { err_delivery_beat++; } if (err_delivery_beat == 4) { if (flag_nogateway_mode == 0) { gateway_fail(); CORE_DEBUG(PSTR("MyS: LOST GATEWAY MODE\n")); } } } lis2->Enable_Wake_Up_Detection(); wait(100); axel_time = millis(); nosleep = 0; } } else { nosleep = 0; } } void send_Brigh(bool start) { brightness = light.get_lux() * 2; wait(50); if (start == 1) { if (abs(brightness - lastbrightness) >= brightThreshold) { if (_transportConfig.parentNodeId == 0) { if (send(brightMsg.set(brightness, 0))) { err_delivery_beat = 0; if (flag_nogateway_mode == 1) { flag_nogateway_mode = 0; CORE_DEBUG(PSTR("MyS: NORMAL GATEWAY MODE\n")); err_delivery_beat = 0; } lastbrightness = brightness; if (wpm_enable == 1) { Wpm = GetWpm(); wait(100); send(wpmMsg.set(Wpm, 0)); } wait(50); blinky(2, 2, BLUE_LED); } else { _transportSM.failedUplinkTransmissions = 0; if (err_delivery_beat < 5) { err_delivery_beat++; } if (err_delivery_beat == 4) { if (flag_nogateway_mode == 0) { gateway_fail(); CORE_DEBUG(PSTR("MyS: LOST GATEWAY MODE\n")); } } } } if (_transportConfig.parentNodeId > 0) { send(brightMsg.set(brightness, 0), 1); wait(2500, C_SET, V_LEVEL); if (Ack_TL == 1) { Ack_TL = 0; err_delivery_beat = 0; if (flag_nogateway_mode == 1) { flag_nogateway_mode = 0; CORE_DEBUG(PSTR("MyS: NORMAL GATEWAY MODE\n")); err_delivery_beat = 0; } lastbrightness = brightness; if (wpm_enable == 1) { Wpm = GetWpm(); wait(100); send(wpmMsg.set(Wpm, 0)); } wait(50); blinky(2, 2, BLUE_LED); } else { _transportSM.failedUplinkTransmissions = 0; if (err_delivery_beat < 5) { err_delivery_beat++; } if (err_delivery_beat == 4) { if (flag_nogateway_mode == 0) { gateway_fail(); CORE_DEBUG(PSTR("MyS: LOST GATEWAY MODE\n")); } } } } } } else { send(brightMsg.set(brightness, 0)); lastbrightness = brightness; if (wpm_enable == 1) { Wpm = GetWpm(); wait(100); send(wpmMsg.set(Wpm, 0)); } wait(50); blinky(2, 2, BLUE_LED); } } void interrupt_Init() { //*** //SET //NRF_GPIO_PIN_NOPULL //NRF_GPIO_PIN_PULLUP //NRF_GPIO_PIN_PULLDOWN //*** nrf_gpio_cfg_input(PIN_BUTTON1, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_input(AXEL_INT1, NRF_GPIO_PIN_NOPULL); APP_GPIOTE_INIT(APP_GPIOTE_MAX_USERS); PIN_BUTTON1_MASK = 1 << PIN_BUTTON1; AXEL_INT1_MASK = 1 << AXEL_INT1; // app_gpiote_user_register(p_user_id, pins_low_to_high_mask, pins_high_to_low_mask, event_handler) app_gpiote_user_register(&m_gpiote_user_id, AXEL_INT1_MASK, PIN_BUTTON1_MASK, gpiote_event_handler); app_gpiote_user_enable(m_gpiote_user_id); axelInt1Status = 0; buttInt1Status = 0; } void gpiote_event_handler(uint32_t event_pins_low_to_high, uint32_t event_pins_high_to_low) { MY_HW_RTC->CC[0] = (MY_HW_RTC->COUNTER + 2); if (PIN_BUTTON1_MASK & event_pins_high_to_low) { if ((buttInt1Status == 0) && (axelInt1Status == 0)) { buttInt1Status = PIN_BUTTON1; } } if (flag_nogateway_mode == 0) { if (configMode == 0) { if (AXEL_INT1_MASK & event_pins_low_to_high) { if ((axelInt1Status == 0) && (buttInt1Status == 0)) { axelInt1Status = AXEL_INT1; } } } } /*** if ((PIN_BUTTON_MASK & event_pins_low_to_high) || (PIN_BUTTON1_MASK & event_pins_high_to_low)) ***/ } void device_Conf() { conf_vibro_set = loadState(230); if ((conf_vibro_set > 5) || (conf_vibro_set == 0)) { conf_vibro_set = 1; saveState(230, conf_vibro_set); } wpm_enable = loadState(240); if (wpm_enable > 1) { wpm_enable = 0; saveState(240, wpm_enable); } interval_reading_lux = loadState(220); if (interval_reading_lux > 60) { interval_reading_lux = 60; saveState(230, interval_reading_lux); } else if (interval_reading_lux < 1) { interval_reading_lux = 1; saveState(230, interval_reading_lux); } SLEEP_TIME = SLEEP_TIME_TEMP * interval_reading_lux; C_BATT_TIME = BATT_TIME / SLEEP_TIME; } void sendBatteryStatus(bool start) { sleep(5000); wait(200); batteryVoltage = hwCPUVoltage(); wait(10); batt_cap = battery_level_in_percent(batteryVoltage); if (start == 1) { if (batt_cap < old_batt_cap) { sendBatteryLevel(battery_level_in_percent(batteryVoltage), 1); wait(2500, C_INTERNAL, I_BATTERY_LEVEL); old_batt_cap = batt_cap; } } else { sendBatteryLevel(battery_level_in_percent(batteryVoltage), 1); wait(2500, C_INTERNAL, I_BATTERY_LEVEL); } linkQuality = calculationRxQuality(); if (linkQuality != old_linkQuality) { wait(10); sendSignalStrength(linkQuality); wait(50); old_linkQuality = linkQuality; } } bool sendSignalStrength(const int16_t level, const bool ack) { return _sendRoute(build(_msgTmp, GATEWAY_ADDRESS, SIGNAL_Q_ID, C_SET, V_VAR1, ack).set(level)); } int16_t calculationRxQuality() { int16_t nRFRSSI_temp = transportGetReceivingRSSI(); int16_t nRFRSSI = map(nRFRSSI_temp, -85, -40, 0, 100); if (nRFRSSI < 0) { nRFRSSI = 0; } if (nRFRSSI > 100) { nRFRSSI = 100; } return nRFRSSI; } void happy_init() { //hwWriteConfig(EEPROM_NODE_ID_ADDRESS, 255); // ******************** checking the node config reset ************************* if (hwReadConfig(EEPROM_NODE_ID_ADDRESS) == 0) { hwWriteConfig(EEPROM_NODE_ID_ADDRESS, 255); } if (loadState(100) == 0) { saveState(100, 255); } CORE_DEBUG(PSTR("EEPROM NODE ID: %d\n"), hwReadConfig(EEPROM_NODE_ID_ADDRESS)); CORE_DEBUG(PSTR("USER MEMORY SECTOR NODE ID: %d\n"), loadState(100)); if (hwReadConfig(EEPROM_NODE_ID_ADDRESS) == 255) { mtwr = 0; } else { mtwr = 10000; no_present(); } CORE_DEBUG(PSTR("MY_TRANSPORT_WAIT_MS: %d\n"), mtwr); } void new_device() { hwWriteConfig(EEPROM_NODE_ID_ADDRESS, 255); saveState(100, 255); wdt_enable(WDTO_15MS); } void config_Happy_node() { if (mtwr == 0) { myid = getNodeId(); saveState(100, myid); mypar = _transportConfig.parentNodeId; old_mypar = mypar; master_id = 0; // *************************** master slave mode is not initialized in this example, ..stub ******************************* saveState(101, mypar); saveState(102, _transportConfig.distanceGW); } if (mtwr != 0) { myid = getNodeId(); if (myid != loadState(100)) { saveState(100, myid); } if (isTransportReady() == true) { mypar = _transportConfig.parentNodeId; master_id = 0; // *************************** master slave mode is not initialized in this example, ..stub ******************************* if (mypar != loadState(101)) { saveState(101, mypar); } if (_transportConfig.distanceGW != loadState(102)) { saveState(102, _transportConfig.distanceGW); } present_only_parent(); } if (isTransportReady() == false) { no_present(); flag_fcount = 1; err_delivery_beat = 5; _transportConfig.nodeId = myid; _transportConfig.parentNodeId = loadState(101); _transportConfig.distanceGW = loadState(102); mypar = _transportConfig.parentNodeId; happy_node_mode(); gateway_fail(); } } } void no_present() { _coreConfig.presentationSent = true; _coreConfig.nodeRegistered = true; } void happy_node_mode() { _transportSM.findingParentNode = false; _transportSM.transportActive = true; _transportSM.uplinkOk = true; _transportSM.pingActive = false; transportSwitchSM(stReady); _transportSM.failureCounter = 0; } void gateway_fail() { flag_nogateway_mode = 1; flag_update_transport_param = 0; SLEEP_TIME_W = SLEEP_TIME / 2; lis2->Disable_Wake_Up_Detection(); } void find_parent_process() { flag_update_transport_param = 1; flag_find_parent_process = 0; CORE_DEBUG(PSTR("MyS: STANDART TRANSPORT MODE IS RESTORED\n")); err_delivery_beat = 0; lis2->Enable_Wake_Up_Detection(); } void update_Happy_transport() { CORE_DEBUG(PSTR("MyS: UPDATE TRANSPORT CONFIGURATION\n")); mypar = _transportConfig.parentNodeId; master_id = 0; // *************************** master slave mode is not initialized in this example, ..stub ******************************* if (mypar != loadState(101)) { saveState(101, mypar); } if (_transportConfig.distanceGW != loadState(102)) { saveState(102, _transportConfig.distanceGW); } present_only_parent(); wait(50); nosleep = 0; flag_update_transport_param = 0; } void present_only_parent() { if (old_mypar != mypar) { CORE_DEBUG(PSTR("MyS: SEND LITTLE PRESENT:) WITH PARENT ID\n")); if (_sendRoute(build(_msgTmp, 0, NODE_SENSOR_ID, C_INTERNAL, 6).set(mypar))) { flag_sendRoute_parent = 0; old_mypar = mypar; } else { flag_sendRoute_parent = 1; } } } void check_parent() { _transportSM.findingParentNode = true; CORE_DEBUG(PSTR("MyS: SEND FIND PARENT REQUEST, WAIT RESPONSE\n")); _sendRoute(build(_msg, 255, NODE_SENSOR_ID, C_INTERNAL, 7).set("")); wait(1500, C_INTERNAL, 8); if (_msg.sensor == 255) { if (mGetCommand(_msg) == 3) { if (_msg.type == 8) { Ack_FP = 1; CORE_DEBUG(PSTR("MyS: PARENT RESPONSE FOUND\n")); } } } if (Ack_FP == 1) { CORE_DEBUG(PSTR("MyS: FIND PARENT PROCESS\n")); Ack_FP = 0; transportSwitchSM(stParent); flag_nogateway_mode = 0; flag_find_parent_process = 1; SLEEP_TIME_W = SLEEP_TIME; problem_mode_count = 0; } else { _transportSM.findingParentNode = false; CORE_DEBUG(PSTR("MyS: PARENT RESPONSE NOT FOUND\n")); _transportSM.failedUplinkTransmissions = 0; nosleep = 0; if (problem_mode_count < 24) { CORE_DEBUG(PSTR("PROBLEM MODE COUNTER: %d\n"), problem_mode_count); problem_mode_count++; SLEEP_TIME_W = SLEEP_TIME / 100 * 120; } else if (problem_mode_count == 24) { SLEEP_TIME_W = SLEEP_TIME * 30; CORE_DEBUG(PSTR("PROBLEM MODE COUNTER: %d\n"), problem_mode_count); } } } void receive(const MyMessage & message) { if (message.sensor == ENABLE_WPM_SENS_CHILD_ID) { if (message.type == V_VAR1) { if (mGetCommand(message) == C_SET) { if (message.isEcho()) { Ack_TL = 1; } else { wpm_enable = message.getBool(); saveState(240, wpm_enable); wait(10); send(conf_wpmMsg.set(wpm_enable)); wait(50); blinky(3, 3, GREEN_LED); configMode = 0; nosleep = 0; button_flag = 0; buttInt1Status = 0; } } } } if (message.sensor == LEVEL_SENSIV_V_SENS_CHILD_ID) { if (message.type == V_VAR1) { if (mGetCommand(message) == C_SET) { if (message.isEcho()) { Ack_TL = 1; } else { conf_vibro_set = message.getByte(); vibro_Init(); saveState(230, conf_vibro_set); wait(10); send(conf_vsensMsg.set(conf_vibro_set)); wait(50); blinky(3, 3, GREEN_LED); configMode = 0; nosleep = 0; button_flag = 0; buttInt1Status = 0; } } } } if (message.sensor == INTERVAL_R_LUX_CHILD_ID) { if (message.type == V_VAR1) { if (mGetCommand(message) == C_SET) { if (message.isEcho()) { Ack_TL = 1; } else { interval_reading_lux = message.getByte(); SLEEP_TIME = SLEEP_TIME_TEMP * interval_reading_lux; C_BATT_TIME = BATT_TIME / SLEEP_TIME; saveState(220, interval_reading_lux); wait(10); send(conf_interv_rluxMsg.set(interval_reading_lux)); wait(50); blinky(3, 3, GREEN_LED); configMode = 0; nosleep = 0; button_flag = 0; buttInt1Status = 0; } } } } if (message.sensor == LUX_SENS_CHILD_ID) { if (message.type == V_LEVEL) { if (mGetCommand(message) == C_SET) { if (message.isEcho()) { Ack_TL = 1; } } } } if (message.sensor == V_SENS_CHILD_ID) { if (message.type == V_TRIPPED) { if (mGetCommand(message) == C_SET) { if (message.isEcho()) { Ack_TL = 1; } } } } if (mGetCommand(message) == 0) { PRESENT_ACK = 1; CORE_DEBUG(PSTR("MyS: !!!ACK OF THE PRESENTATION IN THE FUNCTION RECEIVE RECEIVED!!!\n")); } } 


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреАрдердм (рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрдд, рдпреЛрдЬрдирд╛рдПрдВ, рдЧреЗрд░рдмрд░рд╕, рдмреАрдУрдПрдо):
github.com/smartboxchannel/EFEKTA-LIS2DW12-MAX44009-E73C

рд╕реЗрдВрд╕рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

  • рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╡реЛрд▓реНрдЯреЗрдЬ рд░реЗрдВрдЬ 2-3 V,
  • рдиреАрдВрдж рдореЛрдб рдореЗрдВ 6.7╬╝A,
  • рдиреЗрдЯрд╡рд░реНрдХ рдореЛрдб рдореЗрдВ 8mA,
  • E73-2G4M08S1C nRF52840,
  • MAX44009 рдПрдореНрдмрд┐рдПрдВрдЯ рд▓рд╛рдЗрдЯ рд╕реЗрдВрд╕рд░,
  • LIS2DW12 \ LIS2DH12 3-рдЕрдХреНрд╖ MEMS рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░,
  • RGB рдПрд▓рдИрдбреА
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмреЛрддрд▓рдмрдВрдж,
  • рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреЛрд░реНрдЯ SWD + рд╕реАрд░рд┐рдпрд▓ред

рдиреАрдЪреЗ рдорд╛рдЬрд░реНрдбреЛрдореЛ рдпреВрдбреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реЗрдВрд╕рд░ рдСрдкрд░реЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдпреВрдбреА рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдорд╛рдИрд╕реЗрдВрд╕рд░реНрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рдЬреНрдЮрд╛рдд рд╣реИред





рдмреЛрд░реНрдб рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ, рд╕реЗрдВрд╕рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг


рд╕реЗрдВрд╕рд░ рдлреЛрдЯреЛ






.

MYSENSORS ( , nRF5 Arduino IDE, mysensors, тАФ @mysensors_rus

!

PS/ , , . / , nRF52811. .

рд╕реНрдкреЙрдЗрд▓рд░




















Source: https://habr.com/ru/post/hi478960/


All Articles