DIY рдХреНрд▓рд┐рдХрд░

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрдХ рдорд┐рддреНрд░ рдиреЗ рдореБрдЭреЗ рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛: рдПрдХ рдЫреЛрдЯреЗ рд▓реИрдкрдЯреЙрдк рд░рд┐рдореЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдВрдбреЛрдЬ рд▓реИрдкрдЯреЙрдк рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдореИрдВрдиреЗ рдЖрдИрдЖрд░ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред рдФрд░ рдПрд╡реАрдЖрд░-рдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдХрд╛рдлреА рд╕рдВрдЦреНрдпрд╛ рдмрд╛рдХреА рд╣реИ, рдзреАрд░реЗ-рдзреАрд░реЗ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред


рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдХрд╛рд░реНрдп, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ:


  • рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░, рдФрд░
  • рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЬреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд░рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рд╣рдо AVR рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ Arduino рдХреНрдпреЛрдВ рдирд╣реАрдВ?


рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдордВрдЪ:
HW1ред рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
HW2ред рд╣рдо 3 рдмрдЯрди рдХреА рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ (рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд┐рддрдиреЗ рдирд╣реАрдВ);
HW3ред рджрдмрд╛рдиреЗ рдХреЛ рдХрдо рд╕реЗ рдХрдо 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдмрдЯрди рдкрдХрдбрд╝рдирд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ;
HW4ред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░реЗрд╕ рдХреА рдЕрдирджреЗрдЦреА рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ рдмрд╛рд░ рдореЗрдВ 1 рд╕реЗ рдЕрдзрд┐рдХ рдмрдЯрди рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
HW5ред рдЬрдм рдПрдХ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рдХреА рдЬрд╛рддреА рд╣реИ;
HW6ред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЗрд░рд┐рдпрд▓ / рдпреВрдПрд╕рдмреА-рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЪрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ;
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо:
SW1ред рдПрдХ рдЪрдпрди рдпреЛрдЧреНрдп рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ;
SW2ред рд╡рд╛рдВрдЫрд┐рдд рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреЛ рджрд┐рдП рдЧрдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдорд╛рдВрдб рдХреЛ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВред
SW3ред рдХрдорд╛рдВрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд░реЛрдХреЗрдВред рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рд╕реЗ рдХрдорд╛рдВрдб рд╢рд╛рдорд┐рд▓ рд╣реИред


рдЦреИрд░, рдЗрд╕рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпрджрд┐ рдпрд╣ рд╕рдордп рдХреЗ рдЧрдВрднреАрд░ рдирд┐рд╡реЗрд╢ рдХреЛ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдорд╛рдзрд╛рди рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмрдирд╛рдПрдВред


рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд╕рдорд╛рдзрд╛рди


HW1


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


HW2


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


рдмрдЯрди рд╡рд░реНрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


рдмрдЯрди рд╡рд░реНрдЧ рдХреЛрдб
 class Button { public: Button(uint8_t pin, ::Command command) : pin(pin), command(command) {} void Begin() { pinMode(pin, INPUT); digitalWrite(pin, 1); } bool IsPressed() { return !digitalRead(pin); } ::Command Command() const { return command; } private: uint8_t pin; ::Command command; }; 

рдЗрд╕ рдХрджрдо рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдмрдЯрди рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдлреЗрд╕рд▓реЗрд╕ рд╣реЛ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдмрдЯрди рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд┐рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:


 Button buttons[] = { Button(A0, Command::Previous), Button(A1, Command::PauseResume), Button(A2, Command::Next), }; 

рд╕рднреА рдмрдЯрди рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдХреЗ рд▓рд┐рдП Begin() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 for (auto &button : buttons) { button.Begin(); } 

рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдмрдЯрди рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдмрдЯрди рдЗрдВрдбреЗрдХреНрд╕, рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ: "рдХреБрдЫ рднреА рдирд╣реАрдВ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ" рдФрд░ "рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред" рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рдмрдЯрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


GetPressed ()
 int GetPressed() { int index = PressedNothing; for (byte i = 0; i < ButtonsCount; ++i) { if (buttons[i].IsPressed()) { if (index == PressedNothing) { index = i; } else { return PressedMultiple; } } } return index; } 

HW3


рдмрдЯрди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ (рдХрд╣рддреЗ рд╣реИрдВ, 10 рдПрдордПрд╕) рдХреЗ рд╕рд╛рде рдорддрджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░реЗрд╕ рдПрдХ рд╣реА рдмрдЯрди (рдФрд░ рдареАрдХ рдПрдХ) рдорддрджрд╛рди рдЪрдХреНрд░реЛрдВ рдХреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдорддрджрд╛рди рдЕрд╡рдзрд┐ (10 рдПрдордПрд╕) рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рдг рд╕рдордп (100 рдПрдордПрд╕) рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ, рд╣рдореЗрдВ 10 рдорд┐рд▓рддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рдбрд┐рдХреНрд░реАрдореЗрдВрдЯ рдХрд╛рдЙрдВрдЯрд░ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреАрд░рд┐рдпрдб рдХреЛ рджрдмрд╛рдиреЗ рдкрд░ 10, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрд╡рдзрд┐ рдореЗрдВ рдбреАрд░реЗрд╕рдореЗрдВрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рдпрд╣ 1 рд╕реЗ 0 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдПрдЪрдбрдмреНрд▓реНрдпреВ 5 рджреЗрдЦреЗрдВ)


HW4


рдпрджрд┐ рдХрд╛рдЙрдВрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 0 рд╣реИ, рддреЛ рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред


HW5


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХрдорд╛рдВрдб рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЗрд╕реЗ рд╕рдВрдЪрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдк рдПрдХ рдХреАрдмреЛрд░реНрдб рд░рдгрдиреАрддрд┐ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдореБрдЦреНрдп рд▓реВрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 void HandleButtons() { static int CurrentButton = PressedNothing; static byte counter; int button = GetPressed(); if (button == PressedMultiple || button == PressedNothing) { CurrentButton = button; counter = -1; return; } if (button == CurrentButton) { if (counter > 0) { if (--counter == 0) { InvokeCommand(buttons[button]); return; } } } else { CurrentButton = button; counter = PressInterval / TickPeriod; } } void loop() { HandleButtons(); delay(TickPeriod); } 

HW6


рд╕рдВрдЪрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░реЗрд╖рдХ рдФрд░ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рд╕реАрд░рд┐рдпрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ 1 рдмрд╛рдЗрдЯ рдХреА рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдпреВрдирд┐рдЯ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдмрд╛рдЗрдЯ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдмрд╛рдбрд╝ рд▓рдЧрд╛рдиреЗ рдФрд░ рдкреНрд░рддрд┐ рдХрдорд╛рдВрдб рдПрдХ рдмрд╛рдЗрдЯ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддрд┐ рдЖрджреЗрд╢ рдПрдХ ASCII рд╡рд░реНрдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред


Arduino рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЕрдм рд╣рдо рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВред рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдХреЛ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирдП рдХрдорд╛рдВрдб рдХреЗ рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ рдХреЛрдб рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдмреЗрд╢рдХ, рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддреАрдХ рдХреЛрдб рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ: рдПрдХ рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдХрдорд╛рдВрдб рдирд╛рдордХрд░рдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред


рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 const int TickPeriod = 10; //ms const int PressInterval = 100; //ms enum class Command : char { None = 0, Previous = 'P', Next = 'N', PauseResume = 'C', SuspendResumeCommands = '/', }; class Button { public: Button(uint8_t pin, Command command) : pin(pin), command(command) {} void Begin() { pinMode(pin, INPUT); digitalWrite(pin, 1); } bool IsPressed() { return !digitalRead(pin); } Command GetCommand() const { return command; } private: uint8_t pin; Command command; }; Button buttons[] = { Button(A0, Command::Previous), Button(A1, Command::PauseResume), Button(A2, Command::Next), Button(12, Command::SuspendResumeCommands), }; const byte ButtonsCount = sizeof(buttons) / sizeof(buttons[0]); void setup() { for (auto &button : buttons) { button.Begin(); } Serial.begin(9600); } enum { PressedNothing = -1, PressedMultiple = -2, }; int GetPressed() { int index = PressedNothing; for (byte i = 0; i < ButtonsCount; ++i) { if (buttons[i].IsPressed()) { if (index == PressedNothing) { index = i; } else { return PressedMultiple; } } } return index; } void InvokeCommand(const class Button& button) { Serial.write((char)button.GetCommand()); } void HandleButtons() { static int CurrentButton = PressedNothing; static byte counter; int button = GetPressed(); if (button == PressedMultiple || button == PressedNothing) { CurrentButton = button; counter = -1; return; } if (button == CurrentButton) { if (counter > 0) { if (--counter == 0) { InvokeCommand(buttons[button]); return; } } } else { CurrentButton = button; counter = PressInterval / TickPeriod; } } void loop() { HandleButtons(); delay(TickPeriod); } 

рдФрд░ рд╣рд╛рдБ, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдмрдЯрди рдмрдирд╛рдпрд╛ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред


рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ


рд╣рдо рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдПрдХ рдЬрдЯрд┐рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА, рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдЬреИрд╕реЗ: WinAPI, MFC, рдбреЗрд▓реНрдлреА, .NET (рд╡рд┐рдВрдбреЛрдЬ рдлреЙрд░реНрдо, WPF, рдЖрджрд┐), рдпрд╛ рдПрдХ рд╣реА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдХрдВрд╕реЛрд▓ ( рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, MFC рдХреЛ рдЫреЛрдбрд╝рдХрд░)ред


SW1


рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЪрдпрдирд┐рдд рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдВрдж рд╣реИ: рдкреЛрд░реНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╛рдЗрдЯреНрд╕ред


SW2


рд╢рд╛рдпрдж рд╕рднреА рдиреЗ рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХреАрдмреЛрд░реНрдб рджреЗрдЦреЗред рдХреАрдмреЛрд░реНрдб рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА, рдЬрд┐рд╕рдореЗрдВ рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдПрдХ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХрд╛ рдЕрдкрдирд╛ рдХреЛрдб рд╣реИред рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреАрдмреЛрд░реНрдб рдкрд░ рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реИред рдХреБрдВрдЬреА рдХреЛрдб рдореВрд▓ рд╕реНрд░реЛрдд рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - MSDN ред рдпрд╣ рд╕реАрдЦрдирд╛ рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреИрд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рдПред рдпрд╣ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ: WinAPI рдореЗрдВ SendInput рдлрд╝рдВрдХреНрд╢рди рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдХреАрд╕реНрдЯреНрд░реЛрдХ рджреЛ рдШрдЯрдирд╛рдПрдВ рд╣реИрдВ: рджрдмрд╛рдиреЗ рдФрд░ рдЬрд╛рд░реА рдХрд░рдирд╛ред
рдпрджрд┐ рд╣рдо C / C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдХреЙрд▓ рдЕрдЧреНрд░реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .NET рдкрд░ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рддрд░реНрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП .NET рдЪреБрдирд╛ред
рдореИрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдХреЗрд╡рд▓ рдореВрд▓ рднрд╛рдЧ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╡рд░реНрдЧ рддрдХ Internals : Internals ред
рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:


рдХреНрд▓рд╛рд╕ рдХреЛрдб рдЗрдВрдЯрд░реНрдирд▓реНрд╕
  internal class Internals { [StructLayout(LayoutKind.Sequential)] [DebuggerDisplay("{Type} {Data}")] private struct INPUT { public uint Type; public KEYBDINPUT Data; public const uint Keyboard = 1; public static readonly int Size = Marshal.SizeOf(typeof(INPUT)); } [StructLayout(LayoutKind.Sequential)] [DebuggerDisplay("Vk={Vk} Scan={Scan} Flags={Flags} Time={Time} ExtraInfo={ExtraInfo}")] private struct KEYBDINPUT { public ushort Vk; public ushort Scan; public uint Flags; public uint Time; public IntPtr ExtraInfo; private long spare; } [DllImport("user32.dll", SetLastError = true)] private static extern uint SendInput(uint numberOfInputs, INPUT[] inputs, int sizeOfInputStructure); private static INPUT[] inputs = { new INPUT { Type = INPUT.Keyboard, Data = { Flags = 0 // Push } }, new INPUT { Type = INPUT.Keyboard, Data = { Flags = 2 // Release } } }; public static void SendKey(Keys key) { inputs[0].Data.Vk = (ushort) key; inputs[1].Data.Vk = (ushort) key; SendInput(2, inputs, INPUT.Size); } } 

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


SW3


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


рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рд╕реБрдзрд╛рд░ рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рд╡рд┐рдВрдбреЛрдЬ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЙрдбрд╝рд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореАрдбрд┐рдпрд╛ рдкреНрд▓реЗрдпрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреБрдВрдЬреА рдХреЗ "рдХреАрд╕реНрдЯреНрд░реЛрдХ" рдХрд╛ рдПрдХ рд╕реЗрдЯ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдкреНрд░рд╕реНрддреБрддрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ред рдЖрдк рдирд┐рдпрдВрддреНрд░рдг рдореЙрдбреНрдпреВрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдпрд╛ рддреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдпрд╛ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рд╕рдВрднрд╡ рд╣реИрдВред рдореБрдЦреНрдп рдмрд╛рдд рдЗрдЪреНрдЫрд╛ рд╣реИред


рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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


All Articles