рдИрдерд░рдиреЗрдЯ рдореМрд╕рдо рд╕реНрдЯреЗрд╢рди (HTTP + рдореЛрдбрдмрд╕) POE рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд

рд╢реБрдн рджрд┐рди рд╣реИрдмрд░ рд╕рдореБрджрд╛рдпред
рд╕реНрдорд╛рд░реНрдЯ рдШрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдЖрдЦрд┐рд░реА рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рдж рд╕реЗ , рдмрд╣реБрдд рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдореМрд╕рдо рдХреЗрдВрджреНрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред


рдЪрд┐рддреНрд░ 1 - рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдлреЛрдЯреЛ

Arduino (http://habrahabr.ru/post/165747/), habrahabr.ru/post/171525 , habrahabr.ru/post/213405 рдкрд░ рдореМрд╕рдо рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдкреНрд░рдЪреБрд░рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВрдиреЗ рдЕрднреА рднреА рдЕрдкрдирд╛ рдирд┐рд░реНрдгрдп рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИред

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


рдпрд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:


рдХрд╛рд░реНрдп рдЬрд┐рдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛:

рд▓рд╛рдЧрдд ~ 1700rub (рдЦрд░реАрдж рдХреЗ рд╕рдордп рджрд░ рдкрд░), рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
  1. DHT22 рдбрд┐рдЬрд┐рдЯрд▓ рддрд╛рдкрдорд╛рди рдФрд░ рдЖрд░реНрджреНрд░рддрд╛ рд╕реЗрдВрд╕рд░ $ 5.13
  2. GY-65 BMP085 рд╡рд╛рдпреБрдордВрдбрд▓реАрдп рджрдмрд╛рд╡ Altimeter рдореЙрдбреНрдпреВрд▓ $ 4.09
  3. GY-302 BH1750 рдЪрд┐рдк рд▓рд╛рдЗрдЯ рдЗрдВрдЯреЗрдВрд╕рд┐рдЯреА рд▓рд╛рдЗрдЯ рдореЙрдбреНрдпреВрд▓ $ 2.85
  4. POE / Xbee рдФрд░ рдПрд╕рдбреА рдХрд╛рд░реНрдб рд╕реНрд▓реЙрдЯ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде Arduino рд╡рд┐рдХрд╛рд╕ рдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП IBOARD W5100 рдИрдерд░рдиреЗрдЯ рдореЙрдбреНрдпреВрд▓ 18.46
  5. MAX7219 рдбрд┐рдЬрд┐рдЯрд▓ рдЯреНрдпреВрдм рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЙрдбреНрдпреВрд▓ $ 4.74
  6. 40pcs 20 рд╕реЗрдореА 2.54 рдорд┐рдореА 1 рдкреА -1 рдкреА рдкрд┐рди рдбреБрдкреЛрдВрдЯ рддрд╛рд░ рдХреЗрдмрд▓ рд▓рд╛рдЗрди рд▓рд╛рдЗрди рдХрдиреЗрдХреНрдЯрд░ $ 2.42
  7. FT232RL USB рд╕реЗ рд╕реАрд░рд┐рдпрд▓ рд▓рд╛рдЗрди рдбрд╛рдЙрдирд▓реЛрдб рд▓рд╛рдЗрди рдбрд╛рдЙрдирд▓реЛрдбрд░ USB рд╕реЗ 232 $ 4.47
  8. рдкреНрд▓рд╛рд╕реНрдЯрд┐рдХ рдХреЗ рдорд╛рдорд▓реЗ ~ 100 рд░рдЧрдбрд╝


рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд░реАрджреЗ рдЧрдП Arduino- рдЖрдзрд╛рд░рд┐рдд рдШрдЯрдХреЛрдВ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рднреА рд╕реЗрдВрд╕рд░ рд╡рд╛рдпрд░реНрдб рдФрд░ рдЦрд░реАрджреЗ рдЧрдП рдмрд┐рдЬрд▓реА рдХреЗ рдЖрд╡рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рдереЗред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢реА рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рдкрд╛рд░рджрд░реНрд╢реА рдЪрд┐рдкрдХрдиреЗ рд╡рд╛рд▓реА рдЯреЗрдк рд╕реЗ рдмрдиреА рд╣реЛрддреА рд╣реИрдВред

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

Iboard w5100 рдмреЛрд░реНрдб рдХреЛ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЗрд╕рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдмрд┐рдЬрд▓реА рдФрд░ рдЬрдореАрди рдХреЛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА arduino + рдИрдерд░рдиреЗрдЯ рдврд╛рд▓ + рд╕реЗрдВрд╕рд░ рдмреЛрд░реНрдб рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЙрдЪреНрдЪ рдПрдХреАрдХреГрдд рдмреЛрд░реНрдб рд╕реЗ рдкреИрд╕реЗ рдФрд░ рдЬрдЧрд╣ рдХреА рдмрдЪрдд рд╣реЛрдЧреАред рд╕рд╛рде рд╣реА рдпрд╣ рдмреЛрд░реНрдб Passiv POE рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЛ рд╡рд╛рдпрд░реНрдб (рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо рд╕реЙрд▓реНрдпреВрд╢рдВрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд) рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛:
  1. рд╡реИрд╕реЗ рднреА рддрд╛рд░ рдЦреАрдВрдЪреЛ - рдпрд╣ рд╢рдХреНрддрд┐ рдпрд╛ рдбреЗрдЯрд╛ рд╣реЛ
  2. рдпрджрд┐ рдЙрдкрдХрд░рдг рдХреЛ рд░рд╛рд╕рд╛рдпрдирд┐рдХ рдКрд░реНрдЬрд╛ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдмрд┐рдЬрд▓реА рджреЗрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рдЙрдареЗрдЧрд╛
  3. рд╡рд╛рдпрд░реНрдб рд╕рдВрдЪрд╛рд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд▓рдЧрддрд╛ рд╣реИ:
    1. Roskomnadzor рд╕реЗ рдХреЛрдИ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреБрдЫ рднреА рд╡рд┐рдХрд┐рд░рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
    2. рдПрдХ рд╣реА рдЖрд╡реГрддреНрддрд┐ рдореЗрдВ рдЕрдиреНрдп рдЯреНрд░рд╛рдВрд╕реАрд╡рд░ рдХреЗ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА
    3. рд░реЗрдбрд┐рдпреЛ рд╕рдВрдЪрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдИрдерд░ рдХреЗ рдЕрд╕реНрдерд╛рдпреА рдкреГрдердХреНрдХрд░рдг, рд╕рд┐рдЧреНрдирд▓ рдХреНрд╖реАрдгрди, рд░рд┐рд╕реЗрдкреНрд╢рди рдЬрд╝реЛрди рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╕рдордп рдЕрдиреНрдп рдРрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
    4. рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рд╡рд╛рдИрдлрд╛рдИ рдЧрд░реНрдо рд╣реЛрддрд╛ рд╣реИ рд╡реЗ рд╢рд╛рдВрдд рд╣реЛрдВрдЧреЗред

рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЗ рд▓рд┐рдП рдИрдерд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред Passiv POE рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рддрд╛рд░ рдкрд░ рдкрд╛рд╡рд░ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░реЗрдВред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдлрд╛рдпрджреЗ - рдпрджрд┐ рд╕рднреА рдбрд┐рд╡рд╛рдЗрд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдИрдерд░рдиреЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ - рддреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ convectors / рджреНрд╡рд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рдЪрд┐рддреНрд░рд╛ 2 - рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмреНрд▓реЙрдХ рдЖрд░реЗрдЦ


рдЪрд┐рддреНрд░рд╛ 3 - рдХрдиреЗрдХреНрд╢рди рдЖрд░реЗрдЦ


рдЪрд┐рддреНрд░ 4 - рдЕрдВрджрд░ рдХрд╛ рджреГрд╢реНрдп

Passiv POE рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдкреИрд╕рд┐рд╡ POE - рдпрд╣ POE рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдореВрд▓ рдкреАрдУрдИ рдореЗрдВ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ рдЗрдВрдЬреЗрдХреНрдЯрд░ рд╕рдВрдЪрд╛рд░ рдХреЗ рджреМрд░рд╛рди рджреВрд░рд╕реНрде рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╢рдХреНрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдЗрд╕реЗ рд╢рдХреНрддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдкреИрд╕рд┐рд╡ POE рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдЪрд╛рд▓рд╛рдХ рдЪреАрдирд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд╛рд▓рд╛рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди POE рдЙрдкрдХрд░рдг рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡реЗ рд╢реНрд░реЗрдгреА 5E рдХреЗрдмрд▓ рдХреЗ рдЕрдкреНрд░рдпреБрдХреНрдд-рдпреБрдЧреНрдорд┐рдд рдХреЗрдмрд▓ рдкрд░ рд╡реЛрд▓реНрдЯреЗрдЬ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╡рдХреВрдл рддрд░реАрдХреЗ рд╕реЗ рдЖрдПред рдХреБрдЫ рдиреЗ рдпрд╣ рднреА рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХрдерд┐рдд рддреМрд░ рдкрд░ рдмрд┐рдЬрд▓реА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ IEEE 802.3af рдорд╛рдирдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

IBOARD W5100 рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк 6-20V рд╡реЛрд▓реНрдЯреЗрдЬ рдХреЛ рдИрдерд░рдиреЗрдЯ рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рдЯрд░реНрдорд┐рдирд▓реЛрдВ 4.5 рдФрд░ 7.8 рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ 20 рд╡реА рдХреА рд╕реЗрд╡рд╛ рдХрд░рддрд╛ рд╣реВрдВред


рдЪрд┐рддреНрд░рд╛ 5 - POE рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдЖрд░реЗрдЦ

рдореИрдВрдиреЗ рдбреА-рд▓рд┐рдВрдХ 320 рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯрд░ рд▓рдЧрд╛рдпрд╛, рдЗрд╕рдореЗрдВ рдПрдХ рдЪреАрдиреА рд╕реНрдЯреЗрдк-рдЕрдк рдбреАрд╕реА-рдбреАрд╕реА рдХрдирд╡рд░реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред


рдЪрд┐рддреНрд░рд╛ 6 - рдлреЛрдЯреЛ рд╕рдВрд╢реЛрдзрди

рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж - рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ред

рдЪреЗрддрд╛рд╡рдиреА! рдЪрд╛рд▓реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рдмрд┐рдЬрд▓реА рдХреА рдЖрдкреВрд░реНрддрд┐ 20 рд╡реА рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╕реЗрдЯ рд╣реИред


рдЪрд┐рддреНрд░рд╛ 7 - рдкреВрд░реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

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

рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ 192.168.0.20 рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ; рдЬрд╡рд╛рдм рдореЗрдВ Arduino рдПрдХ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреЗрдЬрддрд╛ рд╣реИ:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="http://192.168.0.20/z1.xsl"?> <response> <temperature> <celsius>30.70</celsius> <sensors> <sensor name='BMP' unit='C'>32.62</sensor> <sensor name='DHT' unit='C'>30.70</sensor> </sensors> </temperature> <humidity> <percentage>21.60</percentage> </humidity> <pressure> <pa>99309</pa> <mmHg>745</mmHg> </pressure> <illuminance> <lx>11</lx> </illuminance> </response> 


рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХ рд╕реБрдВрджрд░ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреНрд░рд╛рдЙрдЬрд╝рд░ XSLT рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рдХреЛрдб
 <?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match='/'> <html> <head> <title>Weather station</title> <meta http-equiv='refresh' content='5'/> <style> .z1 { font-family:Arial, Helvetica, sans-serif; color:#666; font-size:12px; text-shadow: 1px 1px 0px #fff; background:#eaebec; margin:20px; border:#ccc 1px solid; border-collapse:separate; border-radius:3px; box-shadow: 0 1px 2px #d1d1d1; } .z1 th { font-weight:bold; padding:15px; border-bottom:1px solid #e0e0e0; background: #ededed; background: linear-gradient(to top, #ededed, #ebebeb); } .z1 td { padding:10px; background: #f2f2f2; background: linear-gradient(to top, #f2f2f2, #f0f0f0); } .z1 tr:hover td{ background: #aaaaaa; background: linear-gradient(to top, #f2f2f2, #e0e0e0); } </style> </head> <body> <h2>Weather station</h2> <table class='z1'> <tr> <th>Property</th> <th>Value</th> </tr> <tr> <td> Temperature </td> <td><xsl:value-of select='response/temperature/celsius'/> C</td> </tr> <tr> <td> Humidity </td> <td><xsl:value-of select='response/humidity/percentage'/> %</td> </tr> <tr> <td> Pressure </td> <td><xsl:value-of select='response/pressure/mmHg'/> mm.Hg</td> </tr> <tr> <td> Illuminance </td> <td><xsl:value-of select='response/illuminance/lx'/> lx</td> </tr> </table> <h2>Termosensor</h2> <table class='z1'> <tr> <th>Sensor</th> <th>Value</th> </tr> <xsl:for-each select='response/temperature/sensors/sensor'> <tr> <td> <xsl:value-of select='@name'/> </td> <td><xsl:value-of select='.'/> <xsl:value-of select='@unit'/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 



рдЗрди рд╕рднреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╣ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЪрд┐рддреНрд░ 8 - рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рд╡реЗрдм-рдЖрдзрд╛рд░рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ obechpechenie


рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдореИрдВрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рддрд░реНрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред

рдЪрдХреНрд░ рдореЗрдВ рд╣рдо рд╕рднреА рд╕реЗрдВрд╕рд░ рд░реАрдбрд┐рдВрдЧ рдкрдврд╝рддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ - 8-рдмрд┐рдЯ рдПрд▓рдИрдбреА-рд╕рдВрдХреЗрддрдХ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдИрдерд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


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

рд╕реНрд░реЛрдд рдХреЛрдб
 #include <Ethernet.h> #include <SPI.h> #include <Wire.h> #include "DHT.h" #include "BH1750.h" #include "Adafruit_BMP085.h" #include "LedControl.h" #include "Mudbus.h" #include "WebServer.h" #define WEATHER_STATION_Z1 0x20 // =============================================================== #define DHT_S1_PIN A0 //    DHT22 // =============================================================== // assign a MAC address for the ethernet controller. // fill in your address here: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // assign an IP address for the controller: IPAddress ip(192,168,0,20); IPAddress gateway(192,168,0,1); IPAddress subnet(255, 255, 255, 0); // =============================================================== float humidity = 0, temp_dht = 0, temp_bmp = 0, temp = 0; uint16_t light = 0; int32_t pressure_pa = 0, pressure_mm = 0; int mode = 0; dht dht_s1; BH1750 lightMeter; Adafruit_BMP085 bmp; /* This creates an instance of the webserver. By specifying a prefix * of "", all pages will be at the root of the server. */ #define PREFIX "" WebServer webserver(PREFIX, 80); //EthernetServer webserver(80); #define DEV_ID Mb.R[0] #define TEMPERATURE Mb.R[1] #define TEMPERATURE_DHT Mb.R[2] #define TEMPERATURE_BMP Mb.R[3] #define HUMIDITY Mb.R[4] #define PRESSURE_MM Mb.R[5] #define LIGHT Mb.R[6] Mudbus Mb; // pin A5 is connected to the DataIn // pin A6 is connected to the CLK // pin A7 is connected to LOAD LedControl lc=LedControl(A1,A2,A3,1); // ======================== Web pages ========================== void web_index(WebServer &server, WebServer::ConnectionType type, char *, bool) { /* this line sends the standard "we're all OK" headers back to the browser */ server.httpSuccess("application/xml; charset=utf-8"); /* if we're handling a GET or POST, we can output our data here. For a HEAD request, we just stop after outputting headers. */ if (type != WebServer::HEAD) { /* this defines some HTML text in read-only memory aka PROGMEM. * This is needed to avoid having the string copied to our limited * amount of RAM. */ P(index_p1) = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "<?xml-stylesheet type=\"text/xsl\" href=\"http://192.168.0.20/z1.xsl\"?>" "<response>" " <temperature>" " <celsius>"; P(index_p2) = "</celsius>" " <sensors>" " <sensor name='BMP' unit='C'>"; P(index_p3) = "</sensor>" " <sensor name='DHT' unit='C'>"; P(index_p4) = "</sensor>" " </sensors>" " </temperature>" " <humidity>" " <percentage>"; P(index_p5) = "</percentage>" " </humidity>" " <pressure>" " <pa>"; P(index_p6) = "</pa>" " <mmHg>"; P(index_p7) = "</mmHg>" " </pressure>" " <illuminance>" " <lx>"; P(index_p8) = "</lx>" " </illuminance>" "</response>"; /* this is a special form of print that outputs from PROGMEM */ server.printP(index_p1); server.print(temp); server.printP(index_p2); server.print(temp_bmp); server.printP(index_p3); server.print(temp_dht); server.printP(index_p4); server.print(humidity); server.printP(index_p5); server.print(pressure_pa); server.printP(index_p6); server.print(pressure_mm); server.printP(index_p7); server.print(light); server.printP(index_p8); } } void web_z1_xsl(WebServer &server, WebServer::ConnectionType type, char *, bool) { server.httpSuccess("text/xsl; charset=utf-8"); if (type != WebServer::HEAD) { P(z1_xsl) = "<?xml version='1.0' encoding='UTF-8'?>" "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>" "<xsl:template match='/'>" " <html>" " <head>" " <title>Weather station</title>" " <meta http-equiv='refresh' content='5'/>" " <style>" " .z1 {" " font-family:Arial, Helvetica, sans-serif;" " color:#666;" " font-size:12px;" " text-shadow: 1px 1px 0px #fff;" " background:#eaebec;" " margin:20px;" " border:#ccc 1px solid;" " border-collapse:separate; " " border-radius:3px;" " box-shadow: 0 1px 2px #d1d1d1;" " }" " .z1 th {" " font-weight:bold;" " padding:15px;" " border-bottom:1px solid #e0e0e0;" " background: #ededed;" " background: linear-gradient(to top, #ededed, #ebebeb);" " }" " .z1 td {" " padding:10px;" " background: #f2f2f2;" " background: linear-gradient(to top, #f2f2f2, #f0f0f0); " " }" " .z1 tr:hover td{" " background: #aaaaaa;" " background: linear-gradient(to top, #f2f2f2, #e0e0e0); " " }" " </style>" " </head>" " <body>" " <h2>Weather station</h2>" " <table class='z1'>" " <tr>" " <th>Property</th>" " <th>Value</th>" " </tr>" " <tr>" " <td> Temperature </td>" " <td><xsl:value-of select='response/temperature/celsius'/> C</td>" " </tr>" " <tr>" " <td> Humidity </td>" " <td><xsl:value-of select='response/humidity/percentage'/> %</td>" " </tr>" " <tr>" " <td> Pressure </td>" " <td><xsl:value-of select='response/pressure/mmHg'/> mm.Hg</td>" " </tr>" " <tr>" " <td> Illuminance </td>" " <td><xsl:value-of select='response/illuminance/lx'/> lx</td>" " </tr>" " </table>" " <h2>Termosensor</h2>" " <table class='z1'>" " <tr>" " <th>Sensor</th>" " <th>Value</th>" " </tr>" " <xsl:for-each select='response/temperature/sensors/sensor'>" " <tr>" " <td> <xsl:value-of select='@name'/> </td>" " <td><xsl:value-of select='.'/> <xsl:value-of select='@unit'/></td>" " </tr>" " </xsl:for-each>" " </table>" " </body>" " </html>" "</xsl:template>" "</xsl:stylesheet>"; /* this is a special form of print that outputs from PROGMEM */ server.printP(z1_xsl); } } // ===================================================== void setup(){ // Init LED display lc.shutdown(0,false); lc.setIntensity(0,2); lc.clearDisplay(0); lc.setChar(0,7,'L',false); lc.setChar(0,6,'O',false); lc.setChar(0,5,'A',false); lc.setChar(0,4,'d',false); // Ethernet SPI.begin(); Ethernet.begin(mac, ip); // Init Light sensor lightMeter.begin(); // Init pressure sensor if (!bmp.begin()) { Serial.println("ERROR: BMP085 sensor failed"); } //enable serial datada print Serial.begin(9600); Serial.println("Weather Z1 v 0.1"); //        webserver.setDefaultCommand(&web_index); webserver.addCommand("index.html", &web_index); webserver.addCommand("z1.xsl", &web_z1_xsl); webserver.begin(); } void loop(){ char buff[64]; int len = 64; mode = (mode + 1) % 100; Z1_sensors_update(); Z1_SerialOutput(); Z1_ledDisplay(); Z1_modbus_tcp_slave(); // Z1_http_server(); webserver.processConnection(buff, &len); } void Z1_sensors_update() { if (mode%30==0) { // BH1750 (light) light = lightMeter.readLightLevel(); // BMP085 (Temp and Pressure) temp_bmp = bmp.readTemperature(); pressure_pa = bmp.readPressure(); pressure_mm = pressure_pa/133.3; // DHT22 (Temp) if (dht_s1.read22(DHT_S1_PIN) == DHTLIB_OK) { humidity = dht_s1.humidity; temp_dht = dht_s1.temperature; temp = temp_dht; } else { temp = temp_bmp; } } } void Z1_SerialOutput() { Serial.print("T1= "); Serial.print(temp_dht); Serial.print(" *C \t"); Serial.print("T2= "); Serial.print(temp_bmp); Serial.print(" *C \t"); Serial.print("Pressure= "); Serial.print(pressure_mm); Serial.print(" mm \t"); Serial.print("Humidity= "); Serial.print(humidity); Serial.print(" %\t"); Serial.print("Light= "); Serial.print(light); Serial.print(" lx \t"); Serial.print("\n"); } void Z1_ledDisplay() { int v; if (light<50) { lc.setIntensity(0,0); } else if (light>80 && light<200) { lc.setIntensity(0,2); } else if (light>250 && light<1000) { lc.setIntensity(0,5); } else if (light>1100) { lc.setIntensity(0,15); } if (mode<=25) { // lc.clearDisplay(0); lc.setChar(0,7,'t',false); if (temp>=0) { lc.setChar(0,6,' ',false); } else { lc.setChar(0,6,'-',false); } v = (int)( temp / 10 ) % 10; lc.setDigit(0,5,(byte)v,false); v = (int)( temp ) % 10; lc.setDigit(0,4,(byte)v,true); v = (int)( temp * 10 ) % 10; lc.setDigit(0,3,(byte)v,false); lc.setChar(0,2,' ',false); lc.setChar(0,1,'*',false); lc.setChar(0,0,'C',false); delay(1); } else if (mode<=50) { // lc.clearDisplay(0); lc.setChar(0,7,'H',false); lc.setChar(0,6,' ',false); v = (int)( humidity / 10 ) % 10; lc.setDigit(0,5,(byte)v,false); v = (int)( humidity ) % 10; lc.setDigit(0,4,(byte)v,true); v = (int)( humidity * 10 ) % 10; lc.setDigit(0,3,(byte)v,false); lc.setChar(0,2,' ',false); lc.setChar(0,1,'*',false); lc.setChar(0,0,'o',false); delay(1); } else if (mode<=75) { // lc.clearDisplay(0); lc.setChar(0,7,'P',false); lc.setChar(0,6,' ',false); v = (int)( pressure_mm / 100 ) % 10; lc.setDigit(0,5,(byte)v,false); v = (int)( pressure_mm/10 ) % 10; lc.setDigit(0,4,(byte)v,false); v = (int)( pressure_mm ) % 10; lc.setDigit(0,3,(byte)v,false); lc.setChar(0,2,' ',false); lc.setChar(0,1,'n',false); lc.setChar(0,0,'n',false); delay(1); } else { // lc.clearDisplay(0); lc.setChar(0,7,'L',false); lc.setChar(0,6,' ',false); v = (int)( light / 1000 ) % 10; lc.setDigit(0,5,(byte)v,false); v = (int)( light / 100 ) % 10; lc.setDigit(0,4,(byte)v,false); v = (int)( light / 10 ) % 10; lc.setDigit(0,3,(byte)v,false); v = (int)( light ) % 10; lc.setDigit(0,2,(byte)v,false); lc.setChar(0,1,' ',false); lc.setChar(0,0,' ',false); delay(1); } } void Z1_modbus_tcp_slave() { Mb.Run(); DEV_ID = WEATHER_STATION_Z1; TEMPERATURE = temp*10; TEMPERATURE_DHT = temp_dht*10; TEMPERATURE_BMP = temp_bmp*10; HUMIDITY = humidity*10; PRESSURE_MM = pressure_mm; LIGHT = light; } 



Arduino рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА: github.com/krotos139/sh1_arduino_weather_station_v1

рдирд┐рд╖реНрдХрд░реНрд╖

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

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


All Articles