рджреЛ-рдЕрдкрдиреЗ рдЖрдк рд░реЗрдбрд┐рдпреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реНрд╡рд┐рдЪред рднрд╛рдЧ 3 - рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ

рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рджреЛ-рдЪреИрдирд▓ рд░реЗрдбрд┐рдпреЛ-рдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реНрд╡рд┐рдЪ рдпреВрдирд┐рдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдмрдирд╛рдпрд╛ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ ред



рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдпрд╣ рдПрдХ "рд▓реЛрд╣реЗ рдХрд╛ рдЯреБрдХрдбрд╝рд╛" рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдПрдордХреЗ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдкрдиреА рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╢рдХреНрддрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдкрддрд╛ рдирд╣реАрдВ рдХреИрд╕реЗред

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

рдирд┐рд░реНрдорд┐рдд рд░реЗрдбрд┐рдпреЛ рд╕реНрд╡рд┐рдЪ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реАрдзреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрд╕ рдкрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдкрдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ:

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

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, "рдмреНрд░реЗрдбрдмреЛрд░реНрдб" рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЦрд╝рд╛рдХрд╛


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



рд╣рдо рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд▓реЗрдЖрдЙрдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рд╣реИ:

рджрд░рдЕрд╕рд▓, рдРрд╕рд╛ рд▓реЗрдЖрдЙрдЯ рд╣рдореЗрдВ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕реНрдХреЗрдЪ рдХреЛ рдЕрдВрддрд┐рдо рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрди рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, "рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ" рдХреА рдпрд╣ рд╕реВрдЪреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рднреА рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рд╣реИ, рдЕрдм рдореИрдВ рдЗрд╕реЗ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

рдореВрд▓ рдХрд╛рд░реНрдп

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

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

рд░реЗрдбрд┐рдпреЛ рдирд┐рдпрдВрддреНрд░рдг

рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдХрдо рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛):

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


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

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

рдЪреИрдирд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдИ:
typedef struct { int button; //   int relay; //   boolean state; //  (/) unsigned long power_on; // ,     unsigned long auto_off; // ,      unsigned long time_off; // ,  boolean autostate; // , ,    unsigned long press_start; // ,    unsigned long press_stop; // ,    } Channel; 

рдЕрдм рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдХреЗрдЪ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реЗрдЯрдЕрдк () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЖрд░рдВрднреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЧрд╛рд░реНрдб рдХреБрддреНрддреЗ рдХреЛ рдореБрд░реНрдЧрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓реВрдк (рд▓реВрдк ()) рдореЗрдВ рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдЙрдард╛рдПрдВрдЧреЗ:

рдпрджрд┐ рдХрд╛рдо рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдкреНрд░рдХрд╛рд╢ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реЗрдВрдЯрд┐рд▓реЗрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдФрд░ рдмрдВрдж рдХрд░рдирд╛ рд╣реИ) - chkLogic () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╕ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдРрд╕рд╛ рд╕реНрдХреЗрдЪ рдорд┐рд▓рд╛
 //  #include <avr/wdt.h> #include <Bounce.h> //#define DEBUG //      -  //    #define CH 2 //      #define LONGPRESS 2000 // 2  //      "" typedef struct { int button; //   int relay; //   boolean state; //  (/) unsigned long power_on; // ,     unsigned long auto_off; // ,      unsigned long time_off; // ,  boolean autostate; // , ,    unsigned long press_start; // ,    unsigned long press_stop; // ,    } Channel; //    Channel MySwitch[CH] = { 15, 3, LOW, 0, 3600000, 0, false, 0, 0, 14, 4, LOW, 0, 600000, 0, false, 0, 0 }; //    Bounce.  ,         . Bounce bouncer0 = Bounce(MySwitch[0].button,5); Bounce bouncer1 = Bounce(MySwitch[1].button,5); //     boolean logicFlag = false; boolean onFlag = false; boolean offFlag = false; void setup() { wdt_disable(); //         bootloop #ifndef DEBUG Serial.begin(9600); Serial.println("Start!"); pinMode(13, OUTPUT); #endif //  pinMode(MySwitch[0].relay, OUTPUT); pinMode(MySwitch[1].relay, OUTPUT); //  pinMode(MySwitch[0].button, INPUT); pinMode(MySwitch[1].button, INPUT); //      digitalWrite(MySwitch[0].button, HIGH); digitalWrite(MySwitch[1].button, HIGH); //delay(5000); // ,        bootloop #ifndef DEBUG Serial.println("Ready!"); #endif wdt_enable (WDTO_8S); //        8 . } void loop() { //    button_read(); //   autoOff(); //     chkLogic(); //    wdt_reset(); } void button_read(){ //    1 if ( bouncer0.update() ) { if ( bouncer0.read() == LOW) { //     MySwitch[0].press_start = millis(); } else { // ,    (  )  ,  . pressDetect(0, millis()); } } //    2 if ( bouncer1.update() ) { if ( bouncer1.read() == LOW) { MySwitch[1].press_start = millis(); } else { pressDetect(1, millis()); } } } //   void doSwitch(int ch, boolean state){ //    MySwitch[ch].state = state; //      ""      if (MySwitch[ch].state == HIGH) { //    MySwitch[ch].power_on = millis(); if(MySwitch[ch].auto_off > 0) { //  ,      MySwitch[ch].time_off = MySwitch[ch].power_on + MySwitch[ch].auto_off; MySwitch[ch].autostate = true; } #ifndef DEBUG Serial.print("ON "); Serial.println(ch); #endif } else { //    MySwitch[ch].autostate = false; //    MySwitch[ch].time_off = 0; #ifndef DEBUG Serial.print("OFF "); Serial.println(ch); #endif } digitalWrite(MySwitch[ch].relay,MySwitch[ch].state); } //  void autoOff(){ //     for (int i=0; i < CH; i++) { //     -   if ((millis() >= MySwitch[i].time_off) && MySwitch[i].autostate) { MySwitch[i].autostate = false; doSwitch(i, LOW); #ifndef DEBUG Serial.print("Auto OFF "); Serial.println(i); #endif } } } //         void pressDetect(int ch, unsigned long p_stop) { if (MySwitch[ch].press_start != 0) { if ((p_stop-MySwitch[ch].press_start) < LONGPRESS) { //   MySwitch[ch].press_stop = p_stop; #ifndef DEBUG Serial.print("Short press "); Serial.println(ch); #endif doSwitch(ch, MySwitch[ch].state ? LOW : HIGH); } else { //   #ifndef DEBUG Serial.print("Long press "); Serial.println(ch); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); #endif } } } //    void chkLogic(){ /*   ( /) 0- -  / 1- -  /  0   ,  1.5 ,     1 .   0  - 1    10  */ //     1,5 ,     -    if ((onFlag == false) && (millis() > (MySwitch[0].power_on + 90000)) && (MySwitch[0].state == HIGH) && (MySwitch[1].state == LOW) && (MySwitch[1].press_stop < MySwitch[0].power_on)) { //   doSwitch(1, HIGH); //    onFlag = true; logicFlag = true; //      MySwitch[1].autostate = false; #ifndef DEBUG Serial.println("Auto Logic ON"); #endif } //    -      -  10     if ((logicFlag == true) && (offFlag == false) && (MySwitch[1].state == HIGH) && (MySwitch[0].state == LOW)) { MySwitch[1].time_off = millis() + 600000; MySwitch[1].autostate = true; offFlag = true; #ifndef DEBUG Serial.println("Auto Logic OFF started"); #endif } //   ,    if ((logicFlag == true) && (MySwitch[0].state == LOW) && (MySwitch[1].state == LOW)) { offFlag = false; onFlag = false; logicFlag = false; #ifndef DEBUG Serial.println("Logic reset"); #endif } //        -    if ((logicFlag == false) && (offFlag == false) && (MySwitch[0].press_stop > MySwitch[1].power_on) && (MySwitch[1].state == HIGH) && (MySwitch[0].state == LOW)) { logicFlag = true; #ifndef DEBUG Serial.println("Auto OFF 1 after manual OFF 0"); #endif } } 


рдореВрд▓ рдХрд╛рд░реНрдп рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд▓рдШреБ рдмрдЯрди рдкреНрд░реЗрд╕ рдЗрд╕реА рдПрд▓ рдИ рдбреА рдкрд░ рдмрд╛рд░реА; рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдмрдЯрди рдХреА рдПрдХ рд▓рдВрдмреА рдкреНрд░реЗрд╕ рджреНрд╡рд╛рд░рд╛ - рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд┐рдд рдПрд▓рдИрдбреА (рдбреА 13) рдкрд░ рдЖрд░реНрдбрд┐рдиреЛ рд▓рд╛рдЗрдЯреНрд╕ред

рдЕрдм рдЖрдк рд╡рд╛рдпрд░рд▓реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╢реБрд░реБрдЖрддреА рдкрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ: рд╡рд╛рдпрд░рд▓реЗрд╕ рд╕рдВрдЪрд╛рд░ "рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо" ред

рдореИрдВрдиреЗ рдЬреЛ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ - рд╡реЗ рд╕рдордп рдХреА рдХрд╕реМрдЯреА рдкрд░ рдЦрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдЖрдП рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ:
 typedef struct{ float Value; //  boolean Status; //  // 0 - RO // 1 - RW char Note[16]; //  } Parameter; 

рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:
 typedef struct{ int SensorID; //   int CommandTo; //    ... int Command; //  // 0 -  // 1 -   // 2 -   int ParamID; //   float ParamValue; //   boolean Status; //  // 0 -    (RO) // 1 -   (RW) char Comment[16]; //  } Message; 

рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореЗрд░рд╛ рдореЙрдбреНрдпреВрд▓ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
 #define SID 701 //   #define NumSensors 8 //   Parameter MySensors[NumSensors+1] = { //   (  ) NumSensors,0,"BR 2Floor", //    0,1,"Ch.1 (Light)", //   1 () 0,1,"Ch.2 (Vent)", //   2 () 0,1,"Ch.1 (LP)", //     1  0,1,"Ch.2 (LP)", //     2  0,1,"Auto-delayON", //      (  ),   0,1,"Auto-delayOFF", //      (  ),   0,1,"Ch.1 AutoOFF", //    1 ,   0,1,"Ch.2 AutoOFF" //    2 ,   }; Message sensor; 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд░рд╛рдЬреНрдп рдФрд░ рд╕рдордп рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдореБрдЦ рдкреИрд░рд╛рдореАрдЯрд░ рдореМрдЬреВрдж рд╣реИрдВред

рдереЛрдбрд╝реА рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдХреЛрдб рддреИрдпрд╛рд░ рд╣реИред
 //  #include <avr/wdt.h> #include <Bounce.h> #include <SPI.h> #include "RF24.h" #include <EEPROM.h> #define DEBUG //    -  //    #define CH 2 //      #define LONGPRESS 2000 // 2  //    #define SID 701 //   #define NumSensors 8 //   //      "" typedef struct { int button; //   int relay; //   boolean state; //  (/) unsigned long power_on; // ,     unsigned long auto_off; // ,      unsigned long time_off; // ,  boolean autostate; // , ,    unsigned long press_start; // ,    unsigned long press_stop; // ,    } Channel; //    Channel MySwitch[CH] = { 15, 3, LOW, 0, 0, 0, false, 0, 0, 14, 4, LOW, 0, 0, 0, false, 0, 0 }; //      typedef struct{ float Value; //  boolean Status; //  // 0 - RO // 1 - RW char Note[16]; //  } Parameter; //      typedef struct{ int SensorID; //   int CommandTo; //    ... int Command; //  // 0 -  // 1 -   // 2 -   int ParamID; //   float ParamValue; //   boolean Status; //  // 0 -    (RO) // 1 -   (RW) char Comment[16]; //  } Message; ///////////////////////////////////////////////////////////////////////////// Parameter MySensors[NumSensors+1] = { //   (  ) NumSensors,0,"701 (2F, bath)", //   ""         0,1,"Ch.1 (Light)", //   1 () 0,1,"Ch.2 (Vent)", //   2 () 0,1,"Ch.1 (LP)", //     1  0,1,"Ch.2 (LP)", //     2  0,1,"Auto-delayON", //      (  ),   0,1,"Auto-delayOFF", //      (  ),   0,1,"Ch.1 AutoOFF", //    1 ,   0,1,"Ch.2 AutoOFF" //    2 ,   }; Message sensor; ///////////////////////////////////////////////////////////////////////////// //    Bounce.  ,         . Bounce bouncer0 = Bounce(MySwitch[0].button,5); Bounce bouncer1 = Bounce(MySwitch[1].button,5); //     boolean logicFlag = false; boolean onFlag = false; boolean offFlag = false; //RF24 radio(CE,CSN); RF24 radio(10,9); unsigned long measureTime; #define DELTAMEASURE 15000 //   15      const uint64_t pipes[2] = { 0xF0F0F0F0A1LL, 0xF0F0F0F0A2LL }; volatile boolean waitRF24 = false; void setup() { wdt_disable(); //         bootloop //    EEPROM prepareFromEEPROM(); #ifndef DEBUG Serial.begin(9600); Serial.println("Start!"); pinMode(13, OUTPUT); #endif for(int i=0; i<CH; i++) { //  pinMode(MySwitch[i].relay, OUTPUT); //  pinMode(MySwitch[i].button, INPUT); //      digitalWrite(MySwitch[i].button, HIGH); } //  initRF24(); //    ( -   ) attachInterrupt(0, isr_RF24, FALLING); measureTime = millis()+DELTAMEASURE; //delay(5000); // ,        bootloop #ifndef DEBUG Serial.println("Ready!"); #endif wdt_enable (WDTO_8S); //        8 . } void loop() { //    button_read(); //   autoOff(); //     chkLogic(); //   listenRF24(); //   -    floodRF24(); //    wdt_reset(); } void button_read(){ //    1 if ( bouncer0.update() ) { if ( bouncer0.read() == LOW) { //     MySwitch[0].press_start = millis(); } else { // ,    (  )  ,  . pressDetect(0, millis()); } } //    2 if ( bouncer1.update() ) { if ( bouncer1.read() == LOW) { MySwitch[1].press_start = millis(); } else { //MySwitch[1].press_stop = millis(); pressDetect(1, millis()); } } } //   void doSwitch(int ch, boolean state){ //     MySwitch[ch].state = state; //      ""      if (MySwitch[ch].state == HIGH) { //    MySwitch[ch].power_on = millis(); if((MySwitch[ch].auto_off > 0) && (MySwitch[ch].auto_off != 0)) { //  ,      MySwitch[ch].time_off = MySwitch[ch].power_on + MySwitch[ch].auto_off; MySwitch[ch].autostate = true; } #ifndef DEBUG Serial.print("ON "); Serial.println(ch); #endif } else { //    MySwitch[ch].autostate = false; //    MySwitch[ch].time_off = 0; #ifndef DEBUG Serial.print("OFF "); Serial.println(ch); #endif } digitalWrite(MySwitch[ch].relay,MySwitch[ch].state); } //  void autoOff(){ //     for (int i=0; i < CH; i++) { //     -   if ((millis() >= MySwitch[i].time_off) && MySwitch[i].autostate) { MySwitch[i].autostate = false; doSwitch(i, LOW); #ifndef DEBUG Serial.print("Auto OFF "); Serial.println(i); #endif } } } //         void pressDetect(int ch, unsigned long p_stop) { if (MySwitch[ch].press_start != 0) { if (((p_stop-MySwitch[ch].press_start) < LONGPRESS) && (p_stop-MySwitch[ch].press_start) > 0) { //   MySwitch[ch].press_stop = p_stop; #ifndef DEBUG Serial.print("Short press "); Serial.println(ch); #endif doSwitch(ch, MySwitch[ch].state ? LOW : HIGH); } else { //   #ifndef DEBUG Serial.print("Long press "); Serial.println(ch); digitalWrite(13, !digitalRead(13)); #endif //       MySensors[ch+3].Value = 1; //      ""   //    "" , -  (  ) //        ""  } } } //    void chkLogic(){ /*   ( /) 0- -  / 1- -  /  0   ,  1.5 ,     1 .   0  - 1    10  */ //       ( MySensors[5].Value   - ),     -    if ((onFlag == false) && (millis() > (MySwitch[0].power_on + MySensors[5].Value*60000)) && (MySensors[5].Value != 0) && (MySwitch[0].state == HIGH) && (MySwitch[1].state == LOW) && (MySwitch[1].press_stop < MySwitch[0].power_on)) { //   doSwitch(1, HIGH); //    onFlag = true; logicFlag = true; //      MySwitch[1].autostate = false; #ifndef DEBUG Serial.println("Auto Logic ON"); #endif } //    -      -    (( MySensors[6].Value   - )    if ((logicFlag == true) && (offFlag == false) && (MySensors[6].Value != 0) && (MySwitch[1].state == HIGH) && (MySwitch[0].state == LOW)) { MySwitch[1].time_off = millis() + MySensors[6].Value*60000; MySwitch[1].autostate = true; offFlag = true; #ifndef DEBUG Serial.println("Auto Logic OFF started"); #endif } //   ,    if ((logicFlag == true) && (MySwitch[0].state == LOW) && (MySwitch[1].state == LOW)) { offFlag = false; onFlag = false; logicFlag = false; #ifndef DEBUG Serial.println("Logic reset"); #endif } //        -    if ((logicFlag == false) && (offFlag == false) && (MySwitch[0].press_stop > MySwitch[1].power_on) && (MySwitch[1].state == HIGH) && (MySwitch[0].state == LOW)) { logicFlag = true; #ifndef DEBUG Serial.println("Auto OFF 1 after manual OFF 0"); #endif } } void floodRF24(){ //    (1   DELTAMEASURE ) //    !   -      ! if (millis() > measureTime){ getValue(); //      //for (int i=1; i<=NumSensors; i++) { //     (,    -  ) for (int i=1; i<=4; i++) { sendSlaveMessage(0, i); delay(20); } measureTime = millis()+DELTAMEASURE; } } void getValue(){ MySensors[1].Value = MySwitch[0].state; MySensors[2].Value = MySwitch[1].state; return; } //      void isr_RF24(){ waitRF24 = true; } //   (, ,  ) -   (slave) // !     ParamID void sendSlaveMessage(int To, int ParamID) { //    radio.stopListening(); radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1,pipes[1]); delay(20); //      sensor.SensorID = SID; sensor.CommandTo = To; sensor.Command = 0; sensor.ParamID = ParamID; sensor.ParamValue = MySensors[ParamID].Value; sensor.Status = MySensors[ParamID].Status; memcpy(&sensor.Comment,(char*)MySensors[ParamID].Note, 16); //   RF24 bool ok = radio.write( &sensor, sizeof(sensor) ); delay (20); //    radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1,pipes[0]); radio.startListening(); } //   void listenRF24(){ //   ,       if (waitRF24) { waitRF24 = false; // ,   //    if (radio.available()) { bool done = false; while (!done) { done = radio.read( &sensor, sizeof(sensor) ); //     -  if (sensor.CommandTo == SID) { //   ( , , , ) doCommand(sensor.SensorID, sensor.Command, sensor.ParamID, sensor.ParamValue, sensor.Status, sensor.Comment); } } } } } //   ( , , ID,  , , ) -   void doCommand(int From, int Command, int ParamID, float ParamValue, boolean Status, char* Comment) { //     -      ,    -  switch (Command) { case 0: //    break; case 1: getValue(); //     sendSlaveMessage(From, ParamID); break; case 2: //  setValue(From, ParamID, ParamValue, Comment); //  sendSlaveMessage(From, ParamID); break; default: break; } } //   (, , , ) void setValue(int From, int ParamID, float ParamValue, char* Comment) { //         -    if(MySensors[ParamID].Value != ParamValue){ //   / -  ( ) ""     //    ""    (    ) if((ParamID<3) && (MySwitch[ParamID-1].state != (boolean)ParamValue)) { // " " MySwitch[ParamID-1].press_start = millis()-50; // " " (  ""   ) pressDetect(ParamID-1, millis()); } else { //   MySensors[ParamID].Value = ParamValue; //   ,    -   EEPROM if (ParamID > 4){ EEPROM.write(ParamID-5, MySensors[ParamID].Value); //    if(ParamID > 6) { MySwitch[ParamID-7].auto_off = ((unsigned long)MySensors[ParamID].Value)*60000; } } } } } void initRF24(){ radio.begin(); radio.setRetries(15,15); //     ( ) radio.setChannel(100); radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1,pipes[1]); radio.startListening(); //    } void prepareFromEEPROM() { // 4  = 4    1 : // 0 -      (  ),   // 1 -      (  ),   // 2 -    1 ,   // 3 -    2 ,   for(int i=0; i<4; i++) { MySensors[i+5].Value = EEPROM.read(i); } //        for(int i=0; i<CH; i++) { MySwitch[i].auto_off = ((unsigned long)MySensors[i+7].Value)*60000; } } 

рджрд░рдЕрд╕рд▓, рдЕрдм рдпрд╣ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлреНрд▓реИрд╢ рдХрд░рддрд╛ рд╣реИред

рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП, рдореИрдВ USBtinyISP рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ ред

рдореИрдВрдиреЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛, рдСрдкрд░реЗрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХреА - рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ "рдХреНрд▓реАрди" рдПрдордХреЗ рдореЗрдВ рд╕рднреА EEPROM рдмрд╛рдЗрдЯреНрд╕ 255 рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдереЗ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рджреЗрд░реА рджреЗрддрд╛ рд╣реИред

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

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк EEPROM рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реАрдзреЗ рдЙрдирд╕реЗ рдЧреИрд░-рд╡рд╛рд╖реНрдкрд╢реАрд▓ рдореЗрдореЛрд░реА рдХреА рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ (рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ) рдорд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдмрд╛рдж рдХреА рдЬрд╛рдБрдЪ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЕрдм рд╕рдм рдХреБрдЫ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВ рдЕрдкрдиреЗ "рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо" рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛: рдкреНрд░рддреНрдпреЗрдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЙрдкрдХрд░рдг рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

рдЕрдм рдбрд┐рд╡рд╛рдЗрд╕ рдЖрддреНрдордирд┐рд░реНрднрд░ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд░реЗрдбрд┐рдпреЛ рдЪреИрдирд▓ рдХреЗ рдмрд┐рдирд╛) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдШреБрдбрд╝рд╕рд╡рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрдирд╛


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

рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣ рд╣реА рдмрд┐рдЬрд▓реА рдЖрдкреВрд░реНрддрд┐ рдмреЛрд░реНрдб рдХреЛ рдЕрдкрдиреЗ рдХрдмреНрдЬреЗ рдореЗрдВ рд▓реЗ рд▓рд┐рдпрд╛ - рдореИрдВрдиреЗ iPhone рдХреЗ рд▓рд┐рдП рдмрд┐рдЬрд▓реА рдХреА рдЖрдкреВрд░реНрддрд┐ рджреЗрдЦреАред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдПрдХ рд╕рдВрдзрд╛рд░рд┐рддреНрд░ рдмрд┐рдЬрд▓реА рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ )ред

рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛ (рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣рд╛рдВ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ - рдореИрдВрдиреЗ рджреАрд╡рд╛рд░ рдкрд░ рдЪрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛):



рдорд╛рдорд▓рд╛ рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдЦреЗрдд рдореЗрдВ рдЫреЛрдЯрд╛ рдПрдХ рднреА рдлрд┐рдЯ рдирд╣реАрдВ рд╣реБрдЖред

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рдкрд╣рд▓реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдорд╛рд░рдд рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдФрд░ рдЙрд╕реЗ рдлрд┐рдЯ рдмрдирд╛рдирд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдХрд╛рд░ рдкрд░ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП "рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ"ред

рдЕрдм рдЖрдк рджреАрд╡рд╛рд░ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ "рдПрдореНрдмреЗрдбрд┐рдВрдЧ" рд╕реЗ рд╕реАрдзреЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рджреВрд░ рд╣реЛ рдЧрдпрд╛ рдФрд░ рддрд╕реНрд╡реАрд░реЗрдВ рд▓реЗрдирд╛ рднреВрд▓ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкрд╛рда рд╡рд┐рд╡рд░рдг):

рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рдмрд┐рдЬрд▓реА рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред

рдкрд░рд┐рдгрд╛рдо


рдмрдирд╛рдИ рдЧрдИ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдорд╛рдЙрдВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рдбрдВрдм" рд╕реНрд╡рд┐рдЪ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдореЗрдВ "рдорди" рдХрд╛ рдПрдХ рд╕рд╛ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ (рдорд╛рд▓рд┐рдХреЛрдВ рдХреЗ "рд╡рд┐рд╕реНрдорд░рдг" рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдКрд░реНрдЬрд╛ рдХреА рдмрдЪрдд, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реБрдб рдХреЛ рдЪрд╛рд▓реВ / рдмрдВрдж рдХрд░рдирд╛ рдЖрджрд┐)ред

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...

рдкреАрдПрд╕ рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рдХреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рддрддреНрд╡ рдЖрдзрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рдереЗ, рдЬрд┐рд╕рдореЗрдВ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рдерд╛ред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирд╡рд░ рдореЗрд░реЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ:


( ) . / 220 ( , тАФ ). 5, ( ).

рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдПрдХ рд╣рдардзрд░реНрдорд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ "рдПрдХ рд╕реЗ рдПрдХ рджреЛрд╣рд░рд╛рдПрдВ") - рджреЗрдЦреЗрдВ, рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд (рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП) рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ!

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ :

рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП Nikita_Rogatnev рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж ред

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


All Articles