Arduino рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг

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


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


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


рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреИрдпрд╛рд░реА рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:


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

рдореИрдВ рдЕрдм рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдпрд╣ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ Arduino рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рд░рд▓ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред


рдЕрдЧрд▓рд╛, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


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

рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЪреБрдирдирд╛


рд╣рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • C / C ++ рдХреЗ рд▓рд┐рдП
  • Arduino рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдореБрдЭреЗ рд╣рд▓реНрдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдореЗрд░реА рдирд┐рдЬреА рдкрд╕рдВрдж) рдкрд╕рдВрдж рд╣реИрдВ

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ Arduino рдХреЗ рд▓рд┐рдП, C ++ рднрд╛рд╖рд╛ рдХреЛ C рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, C ++ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛рдо рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рд╣рдо рдбреЗрд╕реНрдХрдЯреЙрдк рдХрдВрдкреНрдпреВрдЯрд░ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рджреЛрдиреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирдХ libc рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЙрд▓ Arduino рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП libc рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдврд╛рдВрдЪреЗ рдХреЛ Arduino рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╡рд┐рдкрд░реАрдд рднреА рд╕рдЪ рд╣реИ: рдпрджрд┐ рдврд╛рдВрдЪрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрд░реБрдбрд┐рдиреЛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдореИрдВрдиреЗ рдХрдИ рдЪреМрдЦрдЯреЛрдВ рдХреЛ рджреЗрдЦрд╛ рдФрд░ 2x рдкрд░ рдмрд╕рд╛рдпрд╛:


  • ArduinoUnit : https://github.com/mmurdoch/arduinounit рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдореБрдЦреНрдп рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ Arduino (рдЬрд╛рд╣рд┐рд░ рд╣реИ рдирд╛рдо рд╕реЗ) рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рд┐рд╕реНрдЯрдо (рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдПрди рд╡рд┐рдЯреНрд░реЛ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ) рджреЛрдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░рд╕рд░реА рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ рдереЛрдбрд╝рд╛ рднрд╛рд░реА рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
  • рд╕реНрдкреБрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА (C / C ++ рдХреЗ рд▓рд┐рдП рд╕реНрдкреБрдд рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ) https://www.use-strict.de/sput-unit-nesting/ ред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╣рд▓реНрдХрд╛ рд╣реИ: рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рдмрд┐рдирд╛ рднреА рд╕рд┐рд░реНрдл рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ред "рд╕реАрдкреАрд╕реА" (рд╕рдм рдХреБрдЫ рдХрдИ рдореИрдХреНрд░реЛрдЬрд╝ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ std :: out (рдЬреЛ рдХрд┐ libc рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрднреА Arduino рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдлрд┐рд░ рднреА, рдореЗрд░реА рд╕рд╣рд╛рдиреБрднреВрддрд┐ рдереВрдХ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдкрд▓реНрд▓рд╛ рдЭрд╛рдбрд╝ рд░рд╣реА рдереА, рдФрд░ рдПрд╕рдЯреАрдбреА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ :: рдЖрдЙрдЯ рдХреЛ рдХрдИ рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╕реНрдкреНрд░рд┐рдВрдЯ + рд╕реАрд░реАрдпрд▓ рдкреНрд░рд┐рдВрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рд┐рдВрдЯ рдХреА рдЬрдЧрд╣)ред


рдкрд░рд┐рдгрд╛рдо рдПрдХ рдереВрдХ-рдЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА - Arduino рдордВрдЪ рдХреЗ рд▓рд┐рдП рдереВрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдПрдХ рдмрдВрджрд░рдЧрд╛рд╣ рдЬрдмрдХрд┐ рд╕реАрд╕реА рдХреЗ рд╕рд╛рде рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛


- рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХрд▓-рдлрд╝рд╛рдЗрд▓ рд╕реНрдХреЗрдЪ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
/ рд╕реНрдкреБрдд-рдЗрди / рдЙрджрд╛рд╣рд░рдг / рд╕реНрдкреБрдд-рдЗрди-рдореЛрдиреЛрд▓рд┐рде /


- рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдореБрдЦреНрдп рдХреЛрдб рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдереВрдХ-рдЗрди / рдЙрджрд╛рд╣рд░рдг / рдереВрдХ-рдЗрди-рдореЙрдбреНрдпреВрд▓ /


- рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд░рдирд┐рдВрдЧ рдЯреЗрд╕реНрдЯ
рдереВрдХ-рдЗрди / рдЙрджрд╛рд╣рд░рдг-рдбреЗрд╕реНрдХрдЯреЙрдк /


- рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХреЛрдб рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг - рдПрдХ рдЕрд▓рдЧ рднрдВрдбрд╛рд░ рдореЗрдВ
https://github.com/sadr0b0t/sput-ino-demo


рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдХреЗрд╡рд▓ $ $ / Arduino / рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА https://github.com/sadr0b0t/sput-ino.git рдХреНрд▓реЛрди рдХрд░реЗрдВ:


cd $HOME/Arduino/libraries/
git clone https://github.com/sadr0b0t/sput-ino.git

IDE.


github https://github.com/sadr0b0t/sput-ino/ > ZIP (Clone or download > Download ZIP), sput-ino-master.zip : > > .ZIP ....


> > sput-ino (File > Examples > sput-ino)


:


image


. () ┬л.ino┬╗. ┬л.ino┬╗ ┬л.cpp┬╗ ( Arduino.h - ), .



sput-ino/examples/sput-ino-monolith/sput-ino-monolith.ino


- :


/**
 * @return a  b
 */
int a_plus_b(int a, int b) {
    return a + b;
}

/**
 * @return a  b
 */
int a_minus_b(int a, int b) {
    return a - b;
}

/** 
 *  ,   
 * @param pin   
 * @param num 
 * @return true,   num 
 */
bool led_on_even(int pin, int num) {
    if(num % 2 == 0) {
        digitalWrite(pin, HIGH);
    } else {
        digitalWrite(pin, LOW);
    }
    return num % 2 == 0;
}

sput ( : http://www.use-strict.de/sput-unit-testing/tutorial.html):


#include "sput.h"

/** Test a_plus_b call */
void test_a_plus_b() {
    sput_fail_unless(a_plus_b(2, 2) == 4, "2 + 2 == 4");
    sput_fail_unless(a_plus_b(-2, 2) == 0, "-2 + 2 == 0");

    // this one would pass on 32-bit controllers and would fail on AVR with 16-bit int
    sput_fail_unless(a_plus_b(34000, 34000) == 68000, "34000 + 34000 == 68000");
}

/** Test a_minus_b call */
void test_a_minus_b() {
    sput_fail_unless(a_minus_b(115, 6) == 109, "115 - 6 == 109");
    sput_fail_unless(a_minus_b(13, 17) == -4, "13 - 17 == -4");
}

/** Test test_led_on_even call */
bool test_led_on_even() {
    pinMode(13, OUTPUT);

    sput_fail_unless(led_on_even(13, 2), "num=2 => led#13 on");
    // would pass on desktop, might fail or pass on difference devices
    // (e.g.: Arduino Due - fail, ChipKIT Uno32 - pass)
    sput_fail_unless(digitalRead(13) == HIGH, "num=2 => led#13 on");

    sput_fail_unless(!led_on_even(13, 5), "num=5 => led#13 off");
    sput_fail_unless(digitalRead(13) == LOW, "num=5 => led#13 off");

    sput_fail_unless(led_on_even(13, 18), "num=18 => led#13 on");
    sput_fail_unless(digitalRead(13) == HIGH, "num=18 => led#13 on");
}

(-).


:


/** All tests in one bundle */
int mylib_test_suite() {
    sput_start_testing();

    sput_enter_suite("a plus b");
    sput_run_test(test_a_plus_b);

    sput_enter_suite("a minus b");
    sput_run_test(test_a_minus_b);

    sput_enter_suite("led on even");
    sput_run_test(test_led_on_even);

    sput_finish_testing();
    return sput_get_return_value();
}

:


/** Test suite for a_plus_b call */
int mylib_test_suite_a_plus_b() {
    sput_start_testing();

    sput_enter_suite("a plus b");
    sput_run_test(test_a_plus_b);

    sput_finish_testing();
    return sput_get_return_value();
}

/** Test suite for a_minus_b call */
int mylib_test_suite_a_minus_b() {
    sput_start_testing();

    sput_enter_suite("a minus b");
    sput_run_test(test_a_minus_b);

    sput_finish_testing();
    return sput_get_return_value();
}

/** Test suite for led_on_even call */
int mylib_test_suite_led_on_even() {
    sput_start_testing();

    sput_enter_suite("led on even");
    sput_run_test(test_led_on_even);

    sput_finish_testing();
    return sput_get_return_value();
}

. -, , /, . (, , - ).


:


void run_tests() {
    Serial.println("#################### Start testing...");

    // comment out specific test suites if firmware does not
    // fit to device memory

    // Test suite for a_plus_b call
    mylib_test_suite_a_plus_b();

    // Test suite for a_minus_b call
    mylib_test_suite_a_minus_b();

    // Test suite for led_on_even call
    mylib_test_suite_led_on_even();

    // All tests in one bundle
    //mylib_test_suite();

    Serial.println("#################### Finished testing");
}

setup/loop, run_tests setup , Serial.begin, :


void setup() {
    Serial.begin(9600);
    while (!Serial);

    // run tests
    run_tests();

    // other code - kinda application business logic
    Serial.println("Just show that we call functions from tested lib, nothing useful here");

    pinMode(13, OUTPUT);

    Serial.print("14+23=");
    Serial.println(a_plus_b(14, 23));
    Serial.print("14-23=");
    Serial.println(a_minus_b(14, 23));
    Serial.print("34000+34000=");
    Serial.println(a_plus_b(34000, 34000));
}

void loop() {
    static int i = 0;
    led_on_even(13, i++);
    delay(2000);
}

. , run_tests, .


, , ( > / Tools > Serial monitor)


ChipKIT Uno32 ( 32- PIC32):


#################### Start testing...

== Entering suite #1, "a plus b" ==

[1:1]  test_a_plus_b:#1  "2 + 2 == 4"  pass
[1:2]  test_a_plus_b:#2  "-2 + 2 == 0"  pass
[1:3]  test_a_plus_b:#3  "34000 + 34000 == 68000"  pass

--> 3 check(s), 3 ok, 0 failed (0.00%)

==> 3 check(s) in 1 suite(s) finished after 0.00 second(s),
    3 succeeded, 0 failed (0.00%)

[SUCCESS]

== Entering suite #1, "a minus b" ==

[1:1]  test_a_minus_b:#1  "115 - 6 == 109"  pass
[1:2]  test_a_minus_b:#2  "13 - 17 == -4"  pass

--> 2 check(s), 2 ok, 0 failed (0.00%)

==> 2 check(s) in 1 suite(s) finished after 0.00 second(s),
    2 succeeded, 0 failed (0.00%)

[SUCCESS]

== Entering suite #1, "led on even" ==

[1:1]  test_led_on_even:#1  "num=2 => led#13 on"  pass
[1:2]  test_led_on_even:#2  "num=2 => led#13 on"  pass
[1:3]  test_led_on_even:#3  "num=5 => led#13 off"  pass
[1:4]  test_led_on_even:#4  "num=5 => led#13 off"  pass
[1:5]  test_led_on_even:#5  "num=18 => led#13 on"  pass
[1:6]  test_led_on_even:#6  "num=18 => led#13 on"  pass

--> 6 check(s), 6 ok, 0 failed (0.00%)

==> 6 check(s) in 1 suite(s) finished after 0.00 second(s),
    6 succeeded, 0 failed (0.00%)

[SUCCESS]
#################### Finished testing
Just show that we call functions from tested lib, nothing useful here
14+23=37
14-23=-9
34000+34000=68000

Arduino Uno ( AVR 16 ):


#################### Start testing...

== Entering suite #1, "a#################### Start testing...

== Entering suite #1, "a plus b" ==

[1:1]  test_a_plus_b:#1  "2 + 2 == 4"  pass
[1:2]  test_a_plus_b:#2  "-2 + 2 == 0"  pass
[1:3]  test_a_plus_b:#3  "34000 + 34000 == 68000"  FAIL
!    Type:      fail-unless
!    Condition: a_plus_b(34000, 34000) == 68000
!    Line:      14

--> 3 check(s), 2 ok, 1 failed (?%)

==> 3 check(s) in 1 suite(s) finished after ? second(s),
    2 succeeded, 1 failed (?%)

[FAILURE]

== Entering suite #1, "a minus b" ==

[1:1]  test_a_minus_b:#1  "115 - 6 == 109"  pass
[1:2]  test_a_minus_b:#2  "13 - 17 == -4"  pass

--> 2 check(s), 2 ok, 0 failed (?%)

==> 2 check(s) in 1 suite(s) finished after ? second(s),
    2 succeeded, 0 failed (?%)

[SUCCESS]

== Entering suite #1, "led on even" ==

[1:1]  test_led_on_even:#1  "num=2 => led#13 on"  pass
[1:2]  test_led_on_even:#2  "num=2 => led#13 on"  pass
[1:3]  test_led_on_even:#3  "num=5 => led#13 off"  pass
[1:4]  test_led_on_even:#4  "num=5 => led#13 off"  pass
[1:5]  test_led_on_even:#5  "num=18 => led#13 on"  pass
[1:6]  test_led_on_even:#6  "num=18 => led#13 on"  pass

--> 6 check(s), 6 ok, 0 failed (?%)

==> 6 check(s) in 1 suite(s) finished after ? second(s),
    6 succeeded, 0 failed (?%)

[SUCCESS]
#################### Finished testing
Just show that we call functions from tested lib, nothing useful here
14+23=37
14-23=-9
34000+34000=2464

:


тАФ PIC32 , AVR . 34000 + 34000 == 68000 32- PIC32, AVR int = 2 (16 ), , = 2^16-1=65536-1=65535 ( unsigned). AVR 16- int , 32- PIC32 ( 64- x86_64) . , , .


тАФ test_led_on_even ( , ) , , , digitalRead digitalWrite тАФ .


-, digitalRead ( GPIO pinMode INPUT) , GPIO digitalWrite pinMode OUTPUT: digitalRead , .


-, , digitalRead digitalWrite, , . , , digitalWrite/digitalRead (, Arduino UNO AVR , pinMode(13, OUTPUT), ChipKIT Uno32 PIC32 ).


, digitalWrite GPIO , digitalRead . , digitalWriite . - , ( ).



image


тАФ , .


. , , . , - .


: (.ino) (*.h), (.c) C++ (.cpp). #include, C/C++ . Arduino IDE .


:
sput-ino/examples/sput-ino-modules/


: mylib.h+mylib.cpp


тАФ :
sput-ino/examples/sput-ino-modules/mylib.h


#ifndef MYLIB_H
#define MYLIB_H

/**
 * @return a  b
 */
int a_plus_b(int a, int b);

/**
 * @return a  b
 */
int a_minus_b(int a, int b);

/** 
 *  ,   
 * @param pin   
 * @param num 
 * @return true,   num 
 */
bool led_on_even(int pin, int num);

#endif // MYLIB_TEST_H

. API Arduino, Arduino.h.


sput-ino/examples/sput-ino-modules/mylib.cpp


#include "Arduino.h"

/**
 * @return a  b
 */
int a_plus_b(int a, int b) {
    return a + b;
}

/**
 * @return a  b
 */
int a_minus_b(int a, int b) {
    return a - b;
}

/** 
 *  ,   
 * @param pin   
 * @param num 
 * @return true,   num 
 */
bool led_on_even(int pin, int num) {
    if(num % 2 == 0) {
        digitalWrite(pin, HIGH);
    } else {
        digitalWrite(pin, LOW);
    }
    return num % 2 == 0;
}

: mylib-test.h+mylib-test.cpp


тАФ (-), :
sput-ino/examples/sput-ino-modules/mylib-test.h


#ifndef MYLIB_TEST_H
#define MYLIB_TEST_H

/** Test suite for a_plus_b call */
int mylib_test_suite_a_plus_b();

/** Test suite for a_minus_b call */
int mylib_test_suite_a_minus_b();

/** Test suite for led_on_even call */
int mylib_test_suite_led_on_even();

/** All tests in one bundle */
int mylib_test_suite();

#endif // MYLIB_TEST_H

: , mylib.h Arduino.h .


sput-ino/examples/sput-ino-modules/mylib-test.cpp


// http://www.use-strict.de/sput-unit-testing/tutorial.html
#include "sput.h"

#include "Arduino.h"
#include "mylib.h"

/** Test a_plus_b call */
void test_a_plus_b() {
    sput_fail_unless(a_plus_b(2, 2) == 4, "2 + 2 == 4");
    sput_fail_unless(a_plus_b(-2, 2) == 0, "-2 + 2 == 0");

    // this one would pass on 32-bit controllers and desktop (libc) and would fail on AVR with 16-bit int
    sput_fail_unless(a_plus_b(34000, 34000) == 68000, "34000 + 34000 == 68000");
}

/** Test a_minus_b call */
void test_a_minus_b() {
    sput_fail_unless(a_minus_b(115, 6) == 109, "115 - 6 == 109");
    sput_fail_unless(a_minus_b(13, 17) == -4, "13 - 17 == -4");
}

/** Test test_led_on_even call */
bool test_led_on_even() {
    pinMode(13, OUTPUT);

    sput_fail_unless(led_on_even(13, 2), "num=2 => led#13 on");
    // would pass on desktop, might fail or pass on difference devices
    // (e.g.: Arduino Due - fail, ChipKIT Uno32 - pass)
    sput_fail_unless(digitalRead(13) == HIGH, "num=2 => led#13 on");

    sput_fail_unless(!led_on_even(13, 5), "num=5 => led#13 off");
    sput_fail_unless(digitalRead(13) == LOW, "num=5 => led#13 off");

    sput_fail_unless(led_on_even(13, 18), "num=18 => led#13 on");
    sput_fail_unless(digitalRead(13) == HIGH, "num=18 => led#13 on");
}

/*******************************************/
// test suites

/** Test suite for a_plus_b call */
int mylib_test_suite_a_plus_b() {
    sput_start_testing();

    sput_enter_suite("a plus b");
    sput_run_test(test_a_plus_b);

    sput_finish_testing();
    return sput_get_return_value();
}

/** Test suite for a_minus_b call */
int mylib_test_suite_a_minus_b() {
    sput_start_testing();

    sput_enter_suite("a minus b");
    sput_run_test(test_a_minus_b);

    sput_finish_testing();
    return sput_get_return_value();
}

/** Test suite for led_on_even call */
int mylib_test_suite_led_on_even() {
    sput_start_testing();

    sput_enter_suite("led on even");
    sput_run_test(test_led_on_even);

    sput_finish_testing();
    return sput_get_return_value();
}

/** All tests in one bundle */
int mylib_test_suite() {
    sput_start_testing();

    sput_enter_suite("a plus b");
    sput_run_test(test_a_plus_b);

    sput_enter_suite("a minus b");
    sput_run_test(test_a_minus_b);

    sput_enter_suite("led on even");
    sput_run_test(test_led_on_even);

    sput_finish_testing();
    return sput_get_return_value();
}

: mylib.h mylib-test.h.


sput-ino/examples/sput-ino-modules/sput-ino-modules.ino


#include "mylib.h"
#include "mylib-test.h"

/** run tests on device */
void run_tests() {
    Serial.println("#################### Start testing...");

    // comment out specific test suites if firmware does not
    // fit to device memory

    // Test suite for a_plus_b call
    mylib_test_suite_a_plus_b();

    // Test suite for a_minus_b call
    mylib_test_suite_a_minus_b();

    // Test suite for led_on_even call
    mylib_test_suite_led_on_even();

    // All tests in one bundle
    //mylib_test_suite();

    Serial.println("#################### Finished testing");
}

void setup() {
    Serial.begin(9600);
    while (!Serial);

    // run tests
    run_tests();

    // other code - kinda application business logic
    Serial.println("Just show that we call functions from tested lib, nothing useful here");

    pinMode(13, OUTPUT);

    Serial.print("14+23=");
    Serial.println(a_plus_b(14, 23));
    Serial.print("14-23=");
    Serial.println(a_minus_b(14, 23));
    Serial.print("34000+34000=");
    Serial.println(a_plus_b(34000, 34000));
}

void loop() {
    static int i = 0;
    led_on_even(13, i++);
    delay(2000);
}

, , .


, :
sput-ino-modules/


тАФ :
sput-ino-modules/sput-ino-modules.ino


тАФ :
sput-ino-modules/mylib.h
sput-ino-modules/mylib.cpp


тАФ :
sput-ino-modules/mylib-test.h
sput-ino-modules/mylib-test.cpp


, . , , , / - / ,



, , , :


  • ┬л.ino┬╗ (), (: ┬лmyproj1/myproj1.ino┬╗).
  • тАФ ┬л.h┬╗, ┬л.c┬╗, ++ ┬л.cpp┬╗, ┬л.ino┬╗.
  • (- /tmp/build2b91b1aecd83593cdd811791fcf30e97.tmp/), ┬л.ino┬╗ ┬л.cpp┬╗, ┬л.cpp┬╗ ┬л.c┬╗ gcc ┬л.o┬╗, ┬л.o┬╗ ┬л.hex┬╗ ( ┬л ┬╗) avrdude (: > , ).
  • $HOME/Arduino/libraries/ тАФ .

, :


  • ┬л.ino┬╗. ┬л.ino┬╗, .
  • #include (: #include "mylib.h") .
  • , (: #include "../proj2/proj2lib.h"), .. .
  • ┬л.h┬╗ , ( , , ), ┬л.cpp┬╗ ┬л.c┬╗, .
  • , , .

, :


  • $HOME/Arduino/libraries/
  • ,

( , ) :
https://github.com/sadr0b0t/sput-ino-demo


- .


$HOME/Arduino/libraries


cd $HOME/Arduino/libraries/
ln -s /path/to/projects/dir/sput-ino-demo

, , .


:


$HOME/Arduino/libraries/sput-ino-demo/

тАФ .


тАФ /++:
sput-ino-demo/src/
sput-ino-demo/src/mylib.h
sput-ino-demo/src/mylib.cpp


:


#include "mylib.h"

, library.properties:
sput-ino-demo/library.properties


name=sput-ino-demo
version=0.0.1
author=sadr0b0t
maintainer=sadr0b0t
sentence=Demo project for sput-ino, Sput unit testing framework for C/C++ port to Arduino
paragraph=Demo project for sput-ino. Sput is an unit testing framework for C/C++ that focuses on simplicity of use and maximum portability. It is implemented as a single ANSI C compliant header file that provides all macros needed to start unit testing in nearly no time.
category=Other
url=https://github.com/sadr0b0t/sput-ino-demo
architectures=*

(, library.properties, .h, .c, .cpp src/, sput-ino-demo/. / , , .. src/, , .)


тАФ , :
sput-ino-demo/sput-ino-demo/sput-ino-demo.ino


-2, - > > sput-ino-demo/sput-ino-demo, . , > .


-3, - mylib.h mylib.cpp Arduino IDE (.. sput-ino-demo/), . , , .


-4, ┬л.ino┬╗.


, , .


:
sput-ino-demo/test/


:
sput-ino-demo/test/mylib-test-arduino/
sput-ino-demo/test/mylib-test-arduino/mylib-test-arduino.ino
sput-ino-demo/test/mylib-test-arduino/mylib-test.h
sput-ino-demo/test/mylib-test-arduino/mylib-test.cpp


:
sput-ino-demo/test/mylib-test-desktop/


.



, . , . ? -, : , , , ; , . -, , (, , , mock), (, , ). , , .


, :


  • ,
  • , .

, , -, , . , sput-ino : sput libc, sput-ino тАФ sput API, . , , sput-ino, libc, .


, :


  • , , API .
  • , , API .

API


( a_plus_b a_minis_b) тАФ , /++. - , . , . ( , - 16- int AVR, 32- PIC32 64- Intel/AMD ). .


API


( led_on_even) . , , digitalRead digitalWrite. , digitalRead digitalWrite libc , , ( GPIO?). ? - ? x86? AVR ?


, , - , , . , . , .


, API : ( ), . , . .


sput-ino/example-desktop/


Arduino.h
sput-ino/example-desktop/Arduino.h


#ifndef WPROGRAM_H
#define WPROGRAM_H

#define OUTPUT 1
#define INPUT 0

#define HIGH 1
#define LOW 0

unsigned long micros();

void pinMode(int pin, int mode);

void digitalWrite(int pin, int val);

int digitalRead(int pin);

#endif // WPROGRAM_H

Arduino.cpp:
sput-ino/example-desktop/Arduino.cpp


// saved values for pins
static int _pin_modes[64];
static int _pin_values[64];

// from Arduino.h

/**
 * micros stub
 */
unsigned long micros() {
    return 0;
}

/**
 * Set GPIO pin mode
 */
void pinMode(int pin, int mode) {
    _pin_modes[pin] = mode;
}

/**
 * Write GPIO pin value
 */
void digitalWrite(int pin, int val) {
    _pin_values[pin] = val;
}

/**
 * Read GPIO pin value
 */
int digitalRead(int pin) {
    return _pin_values[pin];
}

API , , ( ). .


, , . main:
sput-ino/example-desktop/mylib-test-main.cpp


#include "mylib-test.h"

int main() {
    return mylib_test_suite();
}


sput-ino/example-desktop/build.sh


#!/bin/sh
# simple build script, feel free to modify or convert it
# to your favourite build system config

#gcc -c c_file_stub.c
#g++ -std=c++11 -c cpp_file_stub.cpp

g++ -std=c++11 -c \
    -I. -I../examples/sput-ino-modules -I$HOME/Arduino/libraries/sput-ino/src \
    Arduino.cpp \
    ../examples/sput-ino-modules/mylib.cpp \
    ../examples/sput-ino-modules/mylib-test.cpp \
    mylib-test-main.cpp
g++ *.o -o test_mylib

( )



./test_mylib

:


== Entering suite #1, "a plus b" ==

[1:1]  test_a_plus_b:#1  "2 + 2 == 4"  pass
[1:2]  test_a_plus_b:#2  "-2 + 2 == 0"  pass
[1:3]  test_a_plus_b:#3  "34000 + 34000 == 68000"  pass

--> 3 check(s), 3 ok, 0 failed (0.00%)

== Entering suite #2, "a minus b" ==

[2:1]  test_a_minus_b:#1  "115 - 6 == 109"  pass
[2:2]  test_a_minus_b:#2  "13 - 17 == -4"  pass

--> 2 check(s), 2 ok, 0 failed (0.00%)

== Entering suite #3, "led on even" ==

[3:1]  test_led_on_even:#1  "num=2 => led#13 on"  pass
[3:2]  test_led_on_even:#2  "num=2 => led#13 on"  pass
[3:3]  test_led_on_even:#3  "num=5 => led#13 off"  pass
[3:4]  test_led_on_even:#4  "num=5 => led#13 off"  pass
[3:5]  test_led_on_even:#5  "num=18 => led#13 on"  pass
[3:6]  test_led_on_even:#6  "num=18 => led#13 on"  pass

--> 6 check(s), 6 ok, 0 failed (0.00%)

==> 11 check(s) in 3 suite(s) finished after 0.00 second(s),
    11 succeeded, 0 failed (0.00%)

[SUCCESS]

, , . , .


API ; ,


, , digitalWrite GPIO , digitalRead . , digitalWriite . , , digitalWrite , digitalRead. , digitalWrite/digitalRead, - ( digitalRead ), API , (, pinMode).


, API , .


, _Arduino.h ( ):
sput-ino/example-desktop/_Arduino.h


#ifndef _ARDUINO_H
#define _ARDUINO_H

// Additional calls to get extended info from Arduino mocks

/** Get pin mode */
int _get_pin_mode(int pin);

/** Get pin value */
int _get_pin_value(int pin);

#endif // _ARDUINO_H

Arduino.cpp:
sput-ino/example-desktop/Arduino.cpp


// From _Arduino.h
// Calls to get extended info from Arduino mocks

/** Get pin mode */
int _get_pin_mode(int pin) {
    return _pin_modes[pin];
}

/** Get pin value */
int _get_pin_value(int pin) {
    return _pin_values[pin];
}

, _get_pin_value digitalRead, _get_pin_mode API .


test_led_on_even тАФ test_led_on_even_desktoponly, _get_pin_value digitalRead. , тАФ sput-ino/example-desktop/


:
sput-ino/example-desktop/mylib-test-desktoponly.h


#ifndef MYLIB_TEST_DESKTOPONLY_H
#define MYLIB_TEST_DESKTOPONLY_H

/** Test suite for led_on_even call */
int mylib_test_suite_led_on_even_desktoponly();

/** Desktop-only tests in one bundle */
int mylib_test_suite_desktoponly();

#endif // MYLIB_TEST_DESKTOPONLY_H

:
sput-ino/example-desktop/mylib-test-desktoponly.cpp


// http://www.use-strict.de/sput-unit-testing/tutorial.html
#include "sput.h"

#include "_Arduino.h"
#include "Arduino.h"
#include "mylib.h"

/** Test test_led_on_even call */
bool test_led_on_even_desktoponly() {
    // we do not use Arduino API calls here to get info about
    // moked chip state, use calls from _Arduino.h instead

    sput_fail_unless(led_on_even(13, 2), "num=2 => led#13 on");
    sput_fail_unless(_get_pin_value(13) == HIGH, "num=2 => led#13 on");

    sput_fail_unless(!led_on_even(13, 5), "num=5 => led#13 off");
    sput_fail_unless(_get_pin_value(13) == LOW, "num=5 => led#13 off");

    sput_fail_unless(led_on_even(13, 18), "num=18 => led#13 on");
    sput_fail_unless(_get_pin_value(13) == HIGH, "num=18 => led#13 on");
}

/*******************************************/
// test suites

/** Test suite for led_on_even call */
int mylib_test_suite_led_on_even_desktoponly() {
    sput_start_testing();

    sput_enter_suite("led on even (only desktop)");
    sput_run_test(test_led_on_even_desktoponly);

    sput_finish_testing();
    return sput_get_return_value();
}

/** All tests in one bundle */
int mylib_test_suite_desktoponly() {
    sput_start_testing();

    sput_enter_suite("led on even (only desktop)");
    sput_run_test(test_led_on_even_desktoponly);

    sput_finish_testing();
    return sput_get_return_value();
}

тАФ : - , .


sput-ino/example-desktop/mylib-test-main.cpp


#include "mylib-test.h"
#include "mylib-test-desktoponly.h"

int main() {
    return mylib_test_suite() | mylib_test_suite_desktoponly();
}

( mylib-test-desktoponly.cpp)


#!/bin/sh
# simple build script, feel free to modify or convert it
# to your favourite build system config

#gcc -c c_file_stub.c
#g++ -std=c++11 -c cpp_file_stub.cpp

g++ -std=c++11 -c \
    -I. -I../examples/sput-ino-modules -I$HOME/Arduino/libraries/sput-ino/src \
    Arduino.cpp \
    ../examples/sput-ino-modules/mylib.cpp \
    ../examples/sput-ino-modules/mylib-test.cpp \
    mylib-test-desktoponly.cpp \
    mylib-test-main.cpp
g++ *.o -o test_mylib


./build.sh


./test_mylib

== Entering suite #1, "a plus b" ==

[1:1]  test_a_plus_b:#1  "2 + 2 == 4"  pass
[1:2]  test_a_plus_b:#2  "-2 + 2 == 0"  pass
[1:3]  test_a_plus_b:#3  "34000 + 34000 == 68000"  pass

--> 3 check(s), 3 ok, 0 failed (0.00%)

== Entering suite #2, "a minus b" ==

[2:1]  test_a_minus_b:#1  "115 - 6 == 109"  pass
[2:2]  test_a_minus_b:#2  "13 - 17 == -4"  pass

--> 2 check(s), 2 ok, 0 failed (0.00%)

== Entering suite #3, "led on even" ==

[3:1]  test_led_on_even:#1  "num=2 => led#13 on"  pass
[3:2]  test_led_on_even:#2  "num=2 => led#13 on"  pass
[3:3]  test_led_on_even:#3  "num=5 => led#13 off"  pass
[3:4]  test_led_on_even:#4  "num=5 => led#13 off"  pass
[3:5]  test_led_on_even:#5  "num=18 => led#13 on"  pass
[3:6]  test_led_on_even:#6  "num=18 => led#13 on"  pass

--> 6 check(s), 6 ok, 0 failed (0.00%)

==> 11 check(s) in 3 suite(s) finished after 0.00 second(s),
    11 succeeded, 0 failed (0.00%)

[SUCCESS]

== Entering suite #1, "led on even (only desktop)" ==

[1:1]  test_led_on_even_desktoponly:#1  "num=2 => led#13 on"  pass
[1:2]  test_led_on_even_desktoponly:#2  "num=2 => led#13 on"  pass
[1:3]  test_led_on_even_desktoponly:#3  "num=5 => led#13 off"  pass
[1:4]  test_led_on_even_desktoponly:#4  "num=5 => led#13 off"  pass
[1:5]  test_led_on_even_desktoponly:#5  "num=18 => led#13 on"  pass
[1:6]  test_led_on_even_desktoponly:#6  "num=18 => led#13 on"  pass

--> 6 check(s), 6 ok, 0 failed (0.00%)

==> 6 check(s) in 1 suite(s) finished after 0.00 second(s),
    6 succeeded, 0 failed (0.00%)

[SUCCESS]


:


, :


  • HIGH > LOW,
  • .

, ( ) . тАФ 3 : 1 тАФ ( ), 2 тАФ STEP HIGH, 3 тАФ : STEP LOW, .


:


#define ACTION_STOP 0
#define ACTION_CHECK_BOUNDS 1
#define ACTION_GO_HIGH 2
#define ACTION_STEP 3

int step_count = 0;
int action = ACTION_STOP;

void timer_handle_interrupts() {
    //     ,
    //     
    if(!timeForStep()) return;

    //   
    if(ACTION_CHECK_BOUNDS == action) {
        //   -  
        if(checkBounds()) {
            //   - 
            action = ACTION_STOP;
        } else {
            //  ,     
            action = ACTION_GO_HIGH;
        }
    } else if(ACTION_GO_HIGH == action) {
        //   STEP,     
        digitalWrite(STEP_PIN, HIGH);
        action = ACTION_STEP;
    } else if(ACTION_STEP == action) {
        // 
        digitalWrite(STEP_PIN, LOW);
        step_count++;

        if(step_count < max_steps) {
            //   
            action = ACTION_CHECK_BOUNDS;
        } else {
            // 
            action = ACTION_STOP;
        }
    }
}

timer_handle_interrupts тАФ , ( : arduino-timer-api).


, , , , - : , , - . , , . ? , , IDE. 100500 ? ? - .


, :


void test_timer_handle_interrupts() {
    //  1
    test_timer_handle_interrupts();
    //  1
    //  2
    //  3

    //  2
    test_timer_handle_interrupts();
    //  1
    //  2
    //  3

    //  3
    test_timer_handle_interrupts();
    //  1
    //  2
    //  3

    //  100500
    for(long i = 0; i < 100500 - 3; i++) {
    }
    //  1
    //  2
    //  3

    //  100500+1
    test_timer_handle_interrupts();
    //  1
    //  2
    //  3

    // ...
    //   
}

test_timer_handle_interrupts. , : 1, 2, 3, 103, , , тАФ .

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


All Articles