"рдЧрдВрднреАрд░" рдПрдореНрдмреЗрдбреЗрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ (рдкрдврд╝реЗрдВ: 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)
:

. () ┬л.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 . - , ( ).

тАФ , .
. , , . , - .
: (.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
( 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]
:
, :
, ( ) . тАФ 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, , , тАФ .