tag:blogger.com,1999:blog-11475609455424364242023-11-16T11:44:57.515-05:00The Netduino ExperienceGilberto Garciahttp://www.blogger.com/profile/05853652520485252429noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-1147560945542436424.post-39677566643501279322012-05-13T21:41:00.002-04:002013-04-06T22:40:11.045-04:00Home Alarm System using Netduino Plus (HomeAlarmPlus project)<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-3967756664350127932' itemprop='articleBody'>
<span style="font-family: Arial, Helvetica, sans-serif;">Latest update: Sunday, April 1, 2013</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Arial, Helvetica, sans-serif;">This is a simple alarm monitoring system using </span><a href="http://www.netduino.com/netduinoplus/specs.htm" style="font-family: Arial, Helvetica, sans-serif;">Netduino Plus</a><span style="font-family: Arial, Helvetica, sans-serif;"> and a typical alarm panel. This implementation could be used in conjunction with the PC5010 Digital Security Controls (DSC) PowerSeries Security System control panel and sensors. Tested with .NET Micro Framework 4.2 (QFE1 and QFE2).</span><br />
<br />
<b><span style="font-size: x-large;">Objective</span></b><br />
<span style="font-family: Arial, Helvetica, sans-serif;">Use full capabilities of <a href="http://www.netduino.com/netduinoplus/specs.htm">Netduino Plus</a> to monitor home alarm system and report any sensor/motion detector activities via email (using </span><span style="font-family: Arial, Helvetica, sans-serif;">Simple Mail Transfer Protocol (SMTP))</span><span style="font-family: Arial, Helvetica, sans-serif;">, local web server and Pachube (now <a href="https://cosm.com/">Cosm</a>).</span><br />
<br />
<b><span style="font-size: x-large;">Programming Languages and Web Development</span></b><br />
<br />
<li> C# for Netduino Plus</li>
<li> HTML for Web Server with Cascading Style Sheets (CSS)</li>
<li> JavaScript for Web Server</li>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span><br />
<b><span style="font-size: x-large;">Warning</span></b>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">This code contains information related to a typical home alarm systems. Please, be aware that this procedure may void any warranty. Any alarm system of any type may be compromised deliberately or may fail to operate as expected for a variety of reasons.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Arial, Helvetica, sans-serif;">The author, Gilberto García, is not liable for any System Failures such as: inadequate installation, </span><span style="font-family: Arial, Helvetica, sans-serif;">criminal knowledge, access by intruders, power failure, failure of replaceable batteries, </span><span style="font-family: Arial, Helvetica, sans-serif;">compromise of Radio Frequency (Wireless) devices, system users, smoke detectors, motion </span><span style="font-family: Arial, Helvetica, sans-serif;">detectors, warning devices (sirens, bells, horns), telephone lines, insufficient time, component failure, inadequate testing, security and insurance (property or life insurance).</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><u>One last thing:</u></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">DISCONNECT AC POWER AND TELEPHONE LINES PRIOR TO DOING ANYTHING.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<br />
<div style="font-family: 'Times New Roman';">
<span style="font-family: Arial, Helvetica, sans-serif;"><b><span style="font-size: x-large;">Required Hardware</span></b></span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><a href="http://www.netduino.com/netduinoplus/specs.htm">Netduino Plus</a></span></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYYZ-aqe7Iv-w-EhTqiwpKJ3GpkoIDKRm1I4uv3W-dEcjmEhSED0Hn643D1Oj4u8MLBhX2d9qfTMNzVCZ8mw5VkUutBlTQ0coBPjWHcmfeEPy5gDdYchZJEpbiTMZmKHrHoJAHEfz_T0U/s1600/2012-05-13+17.45.58+-+Copy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYYZ-aqe7Iv-w-EhTqiwpKJ3GpkoIDKRm1I4uv3W-dEcjmEhSED0Hn643D1Oj4u8MLBhX2d9qfTMNzVCZ8mw5VkUutBlTQ0coBPjWHcmfeEPy5gDdYchZJEpbiTMZmKHrHoJAHEfz_T0U/s320/2012-05-13+17.45.58+-+Copy.jpg" width="320" /></a></div>
<div>
<br /></div>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Micro SD Card </span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">SD Card Adapter</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">3mm <a href="http://www.mouser.com/ProductDetail/Lumex/SSL-LX3044GD-12V/?qs=sGAEpiMZZMs4quMj8r4lmjaw8B5qKY8aADi79wrY8og%3D">green Light Emitting Diode (LED)</a> per alarm zone and motion detector. </span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">330 ohm for each LED.</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">5600 ohm resistor per alarm zone and motion detector.</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Schottky diode per alarm zone. Schottky diode should have low forward voltage drop like the <a href="http://www.diodes.com/datasheets/sbr/SBR10U40.pdf">SBR10U40CT</a>.</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Sparkfun ProtoScrewShield (sku:<a href="http://www.sparkfun.com/products/9729"> DEV-09729</a>). Other shields that will work are: Proto-Screwshield (Wingshield) kit from <a href="http://www.adafruit.com/products/196">Adafruit</a> or <a href="http://wingshieldindustries.com/products/screwshield/">WingShield Industries</a>.</span></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivXt2YKrJAlF0tWwkFfHPssAdDSV5MvaUWa9HWb4D2dZ1UX0Qme1Jq3hQDn3g8um8IZzPRGwIhVDlPpZXZ10z1k0h0sq_ofnOm_WTyZWcwHDV6B2Jh2gYEktnDgpHc254ouuCKHY3Zx1k/s1600/2012-09-23+14.33.21_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivXt2YKrJAlF0tWwkFfHPssAdDSV5MvaUWa9HWb4D2dZ1UX0Qme1Jq3hQDn3g8um8IZzPRGwIhVDlPpZXZ10z1k0h0sq_ofnOm_WTyZWcwHDV6B2Jh2gYEktnDgpHc254ouuCKHY3Zx1k/s320/2012-09-23+14.33.21_b.jpg" width="263" /></a></div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">WiFi connection via <a href="http://www.sparkfun.com/products/9954">WiFly Shield</a> or any WiFi Internet Adapter. Tested on Netgear <a href="http://www.netgear.com/home/products/hometheater/networking-for-home-theater-and-gaming/WNCE3001.aspx">WNCE3001</a> and IOGEAR <a href="http://www.iogear.com/product/GWU627/">GWU627</a>. </span></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxeLcso5vwmv52aFeYy_kvHDvxHJzWgycM3iHGE06tnh1t3W9LOXqO3xXvS8_xLrzuHnDOOEHZ_uSV1FVucYRjFdaF3MRecFdUG4VJSxVsSD_LlIDAPI-_Q6iTkAhVk4Yw45VnyE32a3M/s1600/2012-04-02+20.57.25+-+Copy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxeLcso5vwmv52aFeYy_kvHDvxHJzWgycM3iHGE06tnh1t3W9LOXqO3xXvS8_xLrzuHnDOOEHZ_uSV1FVucYRjFdaF3MRecFdUG4VJSxVsSD_LlIDAPI-_Q6iTkAhVk4Yw45VnyE32a3M/s320/2012-04-02+20.57.25+-+Copy.jpg" width="164" /></a></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<b style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-large;">Optional Hardware</span></b>
<br />
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Panel Mount LED (<a href="http://www.radioshack.com/product/index.jsp?productId=2062556">Green LED with Holder</a>)</span></li>
</ul>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrldmzlMLk3rBQWYBGmNdvlRVks3gSTutb_U-BuUaG4a7RJ-ICy7rbZ3lnCpcTjCH9LP3Asa2Oju7sZ1LLaQneH4TnzVG2QdlW-wTpDivJOf7isakBrmfrlEHiP9xM05UFmJsNxfBQPE4/s1600/LED.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="308" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrldmzlMLk3rBQWYBGmNdvlRVks3gSTutb_U-BuUaG4a7RJ-ICy7rbZ3lnCpcTjCH9LP3Asa2Oju7sZ1LLaQneH4TnzVG2QdlW-wTpDivJOf7isakBrmfrlEHiP9xM05UFmJsNxfBQPE4/s320/LED.jpg" width="320" /></a></div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">USB Ruggedized / Waterproof Panel Connector (<a href="http://www.usbfirewire.com/Parts/rr-211300-30.html">RR-211300-30</a>)</span></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhINnohGL9nkwSTluWH_snOEt6heFWpMHq0Km0uWkHmyFnhnJ37SPbwlue5LqNhZ1wa9aQU9ZcLfLwEXTuxZQc5eTGxEUpIM94ENSPVnaXn1obFEvKmQd5S64LT56H50Ar0-XbxB6DAEIY/s1600/USB.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="308" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhINnohGL9nkwSTluWH_snOEt6heFWpMHq0Km0uWkHmyFnhnJ37SPbwlue5LqNhZ1wa9aQU9ZcLfLwEXTuxZQc5eTGxEUpIM94ENSPVnaXn1obFEvKmQd5S64LT56H50Ar0-XbxB6DAEIY/s320/USB.jpg" width="320" /></a></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">USB 2.0 Cable, Type A Male to A Male (10 Feet or above). Used to access the <a href="http://www.netduino.com/netduinoplus/specs.htm">Netduino Plus</a> board on the alarm panel.</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">200 Watts / 350 VA UPS (<a href="http://www.apc.com/resource/include/techspec_index.cfm?base_sku=BE350G">APC BE350G UPS System or similar</a>).</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Push button for external reset.</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Arduino Proto Shield R3. More space for additional components. <a href="http://www.mouser.com/Search/ProductDetail.aspx?qs=gMoqXxk%2F%2F5aggMnDXD028g%3D%3D">Mouser Electronics</a> and <a href="http://arduino.cc/en/Main/ArduinoProtoShield">others</a>.</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Basic 16x2 Character LCD, <a href="https://www.sparkfun.com/products/9053">3.3V</a> for Netduino or <a href="https://www.sparkfun.com/products/255">5V</a> for Arduino.</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://www.sparkfun.com/products/597">DPDT switch</a> (<a href="http://www.mouser.com/Search/ProductDetail.aspx?R=AYZ0102AGRLCvirtualkey61170000virtualkey611-AYZ0102AGRLC">or this one from Mouser Electronics</a>) for LCD voltage selection.</span></li>
</ul>
<div>
<b><span style="font-size: x-large;">Circuitry</span></b><span style="font-family: Arial, Helvetica, sans-serif;"></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">The following Fritzing diagram shows how the Netduino plus, LEDs and the alarm zones (or motion detector) are wired. LCD circuitry reference from <a href="http://geekswithblogs.net/kobush/archive/2010/09/05/netmf_liquid_crystal.aspx">Szymon Kobalczy</a>.</span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQjW7KHvecvZZC1-muNl_bfSkoCHfBxoFF_Gr-V258pOlKES_7XxOkBFlppRniXhWKpXgUReb7_RBvW496llCAr0wEB3lCUykcy9d-9N26vEFQ-3xlyi0wfVrKnuZcjGIwLxk7QnoB77w/s1600/BasicCircuit.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQjW7KHvecvZZC1-muNl_bfSkoCHfBxoFF_Gr-V258pOlKES_7XxOkBFlppRniXhWKpXgUReb7_RBvW496llCAr0wEB3lCUykcy9d-9N26vEFQ-3xlyi0wfVrKnuZcjGIwLxk7QnoB77w/s400/BasicCircuit.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">HomeAlarmPlus connection diagram (basic circuit) Rev-</td></tr>
</tbody></table>
<br />
<span style="font-family: Arial, Helvetica, sans-serif;"></span>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG4X4CxwbFzLnet9DgfwIKb9wfnPbqQt3M6zIF7hzyEu3TYjJjVh7v-Wy0NEAi81XjWLgjrqV30ymn0hWN1eCYB7uvcnMQ_RYa1pVCzLhm4VbqwFI-A-k0LkLVjtBN16jifqHu1xs3oy8/s1600/AlarmCircuit_bb.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="218" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG4X4CxwbFzLnet9DgfwIKb9wfnPbqQt3M6zIF7hzyEu3TYjJjVh7v-Wy0NEAi81XjWLgjrqV30ymn0hWN1eCYB7uvcnMQ_RYa1pVCzLhm4VbqwFI-A-k0LkLVjtBN16jifqHu1xs3oy8/s320/AlarmCircuit_bb.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">HomeAlarmPlus connection diagram (basic circuit) RevA</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td><br class="Apple-interchange-newline" />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQIiRsvZraIQc_DK6ryKe48wR_5vTEeoYZa8ExfBlxRB2-HTHx18G17QZPaXdggmhGenh9VCMXa-m7XHLYxJpSRh1Wdsp2THGry-qPm-mxbp2FCvR113g3ihpfIuaDjyoIGEpttL6gGTA/s1600/AlarmCircuit_g.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQIiRsvZraIQc_DK6ryKe48wR_5vTEeoYZa8ExfBlxRB2-HTHx18G17QZPaXdggmhGenh9VCMXa-m7XHLYxJpSRh1Wdsp2THGry-qPm-mxbp2FCvR113g3ihpfIuaDjyoIGEpttL6gGTA/s320/AlarmCircuit_g.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">HomeAlarmPlus connection diagram (enhanced circuit) RevG</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXYngZZHqE7d3xOVUGo4EuII3s_7UzRtN4v-OnUBW1e7pSrPaPV7DJJfKayaLwmVB219PIGKDKcRnfYfEMQwk4SVTi0vpf3EEN09rtgLr2PuJitKiUCbnVG2hAuoZSA8w25y8tp4_Ht_0/s1600/ModifiedAlarmCircuit.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXYngZZHqE7d3xOVUGo4EuII3s_7UzRtN4v-OnUBW1e7pSrPaPV7DJJfKayaLwmVB219PIGKDKcRnfYfEMQwk4SVTi0vpf3EEN09rtgLr2PuJitKiUCbnVG2hAuoZSA8w25y8tp4_Ht_0/s400/ModifiedAlarmCircuit.png" width="321" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Zone/Sensor connection</td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-family: Arial, Helvetica, sans-serif;">Keep in mind that one or more zone consist in the following:</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">a) 1 Normally Open contact and 1 Normally closed contact with End Of Line (EOL) resistor.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">b) Double EOL circuit, 1 Normally closed contact with 5.6kohm EOL resistor and </span><span style="font-family: Arial, Helvetica, sans-serif;">Schottky diode</span><span style="font-family: Arial, Helvetica, sans-serif;">. This will bring the protection needed for the Netduino or Arduino.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">c) Each ground zone should be connected to the </span>
<span style="font-family: Arial, Helvetica, sans-serif;">ProtoScrewShield</span> <span style="font-family: Arial, Helvetica, sans-serif;">GND.</span><br />
<br />
<br />
<center>
<table border="1">
<tbody>
<tr>
<td style="width: 50px;"><div style="text-align: center;">
<strong>Netduino/ProtoScrewShield Pin</strong></div>
</td>
<td style="width: 200;"><div style="text-align: center;">
<strong>Description</strong></div>
</td>
</tr>
<tr>
<td>A0</td>
<td>Zone #1</td>
</tr>
<tr>
<td>A1</td>
<td>Zone #2</td>
</tr>
<tr>
<td>A2</td>
<td>Zone #3</td>
</tr>
<tr>
<td>A3</td>
<td>Zone #4</td>
</tr>
<tr>
<td>A4</td>
<td>Sensor #1 [Motion Detector]</td>
</tr>
<tr>
<td>D2</td>
<td>LED Zone #1</td>
</tr>
<tr>
<td>D3</td>
<td>LED Zone #2</td>
</tr>
<tr>
<td>D4</td>
<td>LED Zone #3</td>
</tr>
<tr>
<td>D5</td>
<td>LED Zone #4</td>
</tr>
<tr>
<td>D6 or D7</td>
<td>LED Sensor #1 [Motion Detector]</td>
</tr>
</tbody></table>
</center>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAf2JM3h2NkqfHednQ4ERaoYqWNVWxpkSWgrQvCzyaq5-CpUfUdTwcFCxWTEK4ZHkkJLzk2IyUfzaYCr2zKXAIY5GoAoyljgtuzymSLj103rn-DRx8XxZfeFKIMHxtLSNX9RUWs1jKhD0/s1600/AlarmCircuit_schem.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="324" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAf2JM3h2NkqfHednQ4ERaoYqWNVWxpkSWgrQvCzyaq5-CpUfUdTwcFCxWTEK4ZHkkJLzk2IyUfzaYCr2zKXAIY5GoAoyljgtuzymSLj103rn-DRx8XxZfeFKIMHxtLSNX9RUWs1jKhD0/s640/AlarmCircuit_schem.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">HomeAlarmPlus schematic (basic circuit)</td></tr>
</tbody></table>
<br />
<b><span style="font-size: x-large;">References</span></b><br />
<ul>
<li>Simple Mail Transfer Protocol (SMTP) based on BanskySPOTMail by: <a href="http://bansky.net/blog/2008/08/sending-e-mails-from-net-micro-framework/" target="_blank">Pavel Bánský</a>.</li>
<br />
<li>Web Server based on MFToolkit library by: <a href="http://mftoolkit.codeplex.com/" target="_blank">Michael Schwarz</a>.</li>
<br />
<li>Pachube Embeddable Graph Generator (Beta) by: <a href="http://pachube.github.com/pachube_graph_library/" target="_blank">Pachube</a>, adapted by Gilberto García.</li>
<br />
<li>NTP Server and Extensions class based on a post/implementation by: <a href="http://forums.netduino.com/index.php?/topic/475-still-learning-internet-way-to-grab-date-and-time-on-startup/" target="_blank">Valkyrie-MT</a>.</li>
<br />
<li>StopWatch class based on a post/implementation by: <a href="http://forums.netduino.com/index.php?/topic/97-systemdiagnosticsstopwatch-class/" target="_blank">Chris Walker</a>.</li>
<br />
<li>LCD display using <a href="http://microliquidcrystal.codeplex.com/">uLiquidCrystal</a> library.</li>
</ul>
<div>
<br /></div>
<b><span style="font-size: x-large;">Web server options</span></b><br />
<b><span style="font-size: x-large;"><br /></span></b>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisUspgV8sqbDGQ8idDHXu-yjl6IIZ3Oght2Gdrz5F8O7Q7bLkeJDIZI46h_CoFn3arUrLPmXLxnyPRR6GhCsVXrqZvWS8ctpI9a9gc79g3q-4gwfOrcaQYzZkIHmCrjirbS6qNf8t0MCE/s1600/webserver_snapshot_02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="520" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisUspgV8sqbDGQ8idDHXu-yjl6IIZ3Oght2Gdrz5F8O7Q7bLkeJDIZI46h_CoFn3arUrLPmXLxnyPRR6GhCsVXrqZvWS8ctpI9a9gc79g3q-4gwfOrcaQYzZkIHmCrjirbS6qNf8t0MCE/s640/webserver_snapshot_02.png" title="Web Server snapshot" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Web Server snapshot</td></tr>
</tbody></table>
<br />
<br />
<center>
<table border="1"><tbody>
<tr><td style="width: 50px;"><div style="text-align: center;">
<strong>Options</strong></div>
</td><td style="width: 200px;"><div style="text-align: center;">
<strong>Description</strong></div>
</td></tr>
<tr><td>/</td><td>Root page</td></tr>
<tr><td>/open</td><td>Open last file on SD card.</td></tr>
<tr><td>/sdcard</td><td>List files on SD card.</td></tr>
<tr><td>/su</td><td>Super user. Shows additional options.</td></tr>
<tr><td>/pachube</td><td>Shows Pachube activity per zone/Datastream.</td></tr>
<tr><td>/about</td><td>Application credits and version.</td></tr>
<tr><td>/delete-confirm</td><td>Delete last file on SD card [confirm window].</td></tr>
<tr><td>/delete-last</td><td>Delete last file on SD card [no confirm window].</td></tr>
<tr><td>/diagnostics</td><td>For now, displays available memory on Netduino and forces to clear the garbage collector.</td>
</tr>
</tbody></table>
<br />
</center>
<b><span style="font-size: x-large;"></span></b><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<b><span style="font-size: x-large;">
Code</span></b></div>
<div>
Config.ini file should be copied to the root directory on the SD Card. The purpose of this file is to customize parameters on SD Card and avoid minimal source code modification. CSS files (header_style.css and table_style.css) should be located in WebResources folder.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdAtPbKE8b70PPs0ojW2X7kr1EqLGJ-YL7ieuDNEetcTwT8dcgY5WnPCur6ED4oEs8aheMLG3jRfwDMPsOCMf-sv7EZLnd1YN2Nvuz18ydHyjm6vrRJ6D0Kz5i9I9dTeVfwnAGHMSpwg/s1600/DirectoryStructure_01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdAtPbKE8b70PPs0ojW2X7kr1EqLGJ-YL7ieuDNEetcTwT8dcgY5WnPCur6ED4oEs8aheMLG3jRfwDMPsOCMf-sv7EZLnd1YN2Nvuz18ydHyjm6vrRJ6D0Kz5i9I9dTeVfwnAGHMSpwg/s400/DirectoryStructure_01.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">microSD directory structure</td></tr>
</tbody></table>
<br />
<br />
Config.ini content:<br />
<pre class="brush: text"> ;AlarmByZones - Programmed for Netduino by Gilberto García - 5/9/2012
;Feel free to customize this file with your own definitions.
;[NETDUINO_PLUS_HTTP_PORT] HTTP server port.
;[ALARM_ZONES] should match with ACTIVE_ZONES constant defined in AlarmByZones.cs and Definitions.cs .
;[SENSORS] should match with MOTION_SENSORS constant defined in AlarmByZones.cs and Definitions.cs .
;[USE_EMAIL] Activate/Deactivate email option. Y or N arguments expected.
;[EMAIL_FREQ] Email frequency in minutes when the alarm/sensor is active.
; This will define EMAIL_FREQUENCY in ConfigDefault.cs .
;[STORE_LOG] Saves alarm/sensor log. Y or N arguments expected.
;[STORE_EXCEPTION] Saves Netduino exceptions. Y or N arguments expected.
;[USE_PACHUBE] Activate/Deactivate Pachube option. Y or N arguments expected.
;
;
;
[NETDUINO_PLUS_HTTP_PORT]
8080
[ALARM_ZONES]
Zone1=FIRST FLOOR - Living room windows, Dining room windows, Porch (sliding doors), Garage door access.
Zone2=SECOND FLOOR - Master Bedroom and Bathroom Windows.
Zone3=FIRST FLOOR - Master Bedroom windows.
Zone4=SECOND FLOOR - Bedroom 2 and bathroom windows.
[SENSORS]
Sensor1=Main door access
[USE_EMAIL]
Y
[EMAIL_FREQ]
10
[STORE_LOG]
Y
[STORE_EXCEPTION]
N
[USE_PACHUBE]
Y
</pre>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxUeGXqC1gsWHHFVRlgqq38pWEPhVMIX2iP3-xVkMMQ69rB83JvSqhWhS2eG4AuPuIY57OCoqsISw4SlvdKGMgmCtJ0Zg3i5XC-IEBd9xX_EBJGdy24-F0Nq-In0Sbl1VMxv-rs-ibhd0/s1600/SoftwareArchitecture.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="497" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxUeGXqC1gsWHHFVRlgqq38pWEPhVMIX2iP3-xVkMMQ69rB83JvSqhWhS2eG4AuPuIY57OCoqsISw4SlvdKGMgmCtJ0Zg3i5XC-IEBd9xX_EBJGdy24-F0Nq-In0Sbl1VMxv-rs-ibhd0/s640/SoftwareArchitecture.png" title="Architecture of AlarmByZones class" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Architecture of AlarmByZones (main)</td></tr>
</tbody></table>
<br />
<br />
Declaration<br />
<pre class="brush: c-sharp; "> /// <summary>
/// Alarm zones (Analog Input)
/// </summary>
static SecretLabs.NETMF.Hardware.AnalogInput[] Zones = new SecretLabs.NETMF.Hardware.AnalogInput[Alarm.User_Definitions.Constants.ACTIVE_ZONES];
/// <summary>
/// Alarm zones LEDs (Digital Output)
/// </summary>
static Microsoft.SPOT.Hardware.OutputPort[] AlarmLeds = new Microsoft.SPOT.Hardware.OutputPort[Alarm.User_Definitions.Constants.ACTIVE_ZONES];
/// <summary>
/// Motion detector sensors (Analog Input)
/// </summary>
static SecretLabs.NETMF.Hardware.AnalogInput[] Sensors = new SecretLabs.NETMF.Hardware.AnalogInput[Alarm.User_Definitions.Constants.MOTION_SENSORS];
/// <summary>
/// Motion detector LEDs (Digital Output)
/// </summary>
static Microsoft.SPOT.Hardware.OutputPort[] MotionLeds = new Microsoft.SPOT.Hardware.OutputPort[Alarm.User_Definitions.Constants.MOTION_SENSORS];
/// <summary>
/// Gets the total elapsed time measured by the current instance of each alarm zone.
/// </summary>
static System.Diagnostics.Stopwatch[] stopwatchZones = new Stopwatch[Alarm.User_Definitions.Constants.ACTIVE_ZONES];
/// <summary>
/// Gets the total elapsed time measured by the current instance of each motion detector sensor.
/// </summary>
static System.Diagnostics.Stopwatch[] stopwatchSensors = new Stopwatch[Alarm.User_Definitions.Constants.MOTION_SENSORS];
/// <summary>
/// Flag for detected zones when trigger.
/// </summary>
static bool[] detectedZones = new bool[Alarm.User_Definitions.Constants.ACTIVE_ZONES];
/// <summary>
/// Flag for detected sensors when is trigger.
/// </summary>
static bool[] detectedSensors = new bool[Alarm.User_Definitions.Constants.MOTION_SENSORS];
/// <summary>
/// Email
/// </summary>
/// <example> SMTPClient.Email("mail.gmx.com", 587, "user@gmx.com", "destination@email.com", "user password");
/// </example>
static SMTPClient.Email email = new SMTPClient.Email(Alarm.UserData.Email.host, Alarm.UserData.Email.port,
Alarm.UserData.Email.From, Alarm.UserData.Email.To, Alarm.UserData.Email.smtpPassword);
/// <summary>
/// SD Card Event Logger
/// </summary>
public static EventLogger SdCardEventLogger = new EventLogger();
</pre>
<pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"></pre>
<br />
Delegates
<br />
<pre class="brush: c-sharp; "> /// <summary>
/// Monitor zones delegate
/// </summary>
public delegate void MonitorZonesDelegate();
/// <summary>
/// Monitor motion sensor delegate
/// </summary>
public delegate void MonitorMotionSensorDelegate();
</pre>
<br />
Main
<br />
<pre class="brush: c-sharp; "> public static void Main()
{
Zones[0] = new SecretLabs.NETMF.Hardware.AnalogInput(SecretLabs.NETMF.Hardware.NetduinoPlus.Pins.GPIO_PIN_A0);
Zones[1] = new SecretLabs.NETMF.Hardware.AnalogInput(SecretLabs.NETMF.Hardware.NetduinoPlus.Pins.GPIO_PIN_A1);
Zones[2] = new SecretLabs.NETMF.Hardware.AnalogInput(SecretLabs.NETMF.Hardware.NetduinoPlus.Pins.GPIO_PIN_A2);
Zones[3] = new SecretLabs.NETMF.Hardware.AnalogInput(SecretLabs.NETMF.Hardware.NetduinoPlus.Pins.GPIO_PIN_A3);
AlarmLeds[0] = new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D2, false);
AlarmLeds[1] = new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D3, false);
AlarmLeds[2] = new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D4, false);
AlarmLeds[3] = new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D5, false);
Sensors[0] = new SecretLabs.NETMF.Hardware.AnalogInput(SecretLabs.NETMF.Hardware.NetduinoPlus.Pins.GPIO_PIN_A4);
MotionLeds[0] = new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D7, false);
MonitorZonesDelegate monitorZones = new MonitorZonesDelegate(MonitorZones);
MonitorMotionSensorDelegate monitorMotion = new MonitorMotionSensorDelegate(MonitorSensors);
//based on a post by Valkyrie-MT
//http://forums.netduino.com/index.php?/topic/475-still-learning-internet-way-to-grab-date-and-time-on-startup/
Console.DEBUG_ACTIVITY("Setting NTP-time");
SetTime();
SdCardEventLogger.parseConfigFileContents(Alarm.User_Definitions.Constants.ALARM_CONFIG_FILE_PATH);
InitArrays();
Console.DEBUG_ACTIVITY(Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()[0].IPAddress);
SdCardEventLogger.SDCardAccess();
new Thread(Alarm.ProtoScrewShield_LED.Blink).Start();
new Thread(Alarm.WebServer.startHttp).Start();
if (Alarm.ConfigDefault.Data.USE_PACHUBE)
{
Pachube.PachubeLibrary.InitPachubleLibrary(SdCardEventLogger.IsSDCardAvailable(), Alarm.ConfigDefault.Data.STORE_EXCEPTION);
new Thread(Pachube.PachubeLibrary.PachubeConnect).Start();
}
while (true)
{
Debug.Print("Memory available: " + Debug.GC(true));
monitorZones();
monitorMotion();
Thread.Sleep(Alarm.Common.Alarm_Constants.ALARM_DELAY_TIME);
}
}
</pre>
<br />
Main Methods
<br />
<pre class="brush: c-sharp; "> /// <summary>
/// Loops thru each alarm zone
/// </summary>
static void MonitorZones()
{
for (int i = 0; i < Zones.Length; i++)
{
int vInput = Zones[i].Read();
float volts = ((float)vInput / 1024.0f) * 3.3f;
string strZoneDescription = "N/A"; //If zone description is not found on SD Card N/A is default description.
Console.DEBUG_ACTIVITY("Zone " + (i + 1).ToString() + ": Volts: " + volts);
//format: //Zone number, voltage
Pachube.PachubeLibrary.statusToPachube = i == 0 ? (i + 1).ToString() + "," + volts : (i + 1).ToString() + "," + volts + "\r\n" + Pachube.PachubeLibrary.statusToPachube;
AlarmLeds[i].Write(volts >= 3);
//elapsed seconds
double eSeconds = stopwatchZones[i].ElapsedSeconds;
//elapsed minutes
double eMinutes = stopwatchZones[i].ElapsedMinutes;
Console.DEBUG_ACTIVITY("stopwatch[" + i.ToString() + "] = " + eSeconds.ToString() + " seconds");
Console.DEBUG_ACTIVITY("stopwatch[" + i.ToString() + "] = " + eMinutes.ToString() + " minutes\n");
if (volts >= 3 )
{
/*
Case #1:
!detectedZones[i] = not triggered before. This is the first time in this cycle and first email to send.
Case #2:
detectedZones[i] && eMinutes >= EMAIL_FREQUENCY = triggered before and time is up for sending another email.
*/
if (!detectedZones[i] || (detectedZones[i] && eMinutes >= Alarm.ConfigDefault.Data.EMAIL_FREQUENCY))
{
if (Alarm.Common.Alarm_Info.zoneDescription.Count>0)
{
if (Alarm.Common.Alarm_Info.zoneDescription.Contains("Zone" + (i + 1).ToString()))
{
strZoneDescription = (string)Alarm.Common.Alarm_Info.zoneDescription["Zone" + (i + 1).ToString()];
}
}
string info = "Zone " + (i + 1).ToString() + " " + strZoneDescription;
stopwatchZones[i] = Stopwatch.StartNew();
detectedZones[i] = true;
email.SendEmail("Alarm Trigger!", info);
Alarm.Common.Alarm_Info.sbActivity.AppendLine("<tr>");
Alarm.Common.Alarm_Info.sbActivity.AppendLine("<td><center>" + DateTime.Now.ToString() + "</center></td> ");
Alarm.Common.Alarm_Info.sbActivity.AppendLine("<td><center> Zone " + (i + 1).ToString() + "</center></td>");
Alarm.Common.Alarm_Info.sbActivity.AppendLine("<td><center>" + strZoneDescription + "</center></td>");
Alarm.Common.Alarm_Info.sbActivity.AppendLine("</tr>"); if (Alarm.ConfigDefault.Data.USE_PACHUBE)
{
//supress timer and update Pachube with new status
Pachube.PachubeLibrary.forceUpdate = true;
}
if (SdCardEventLogger.IsSDCardAvailable() && Alarm.ConfigDefault.Data.STORE_LOG)
{
SdCardEventLogger.saveFile(DateTime.Now.ToString("d_MMM_yyyy--HH_mm_ss") + ".log", info, "Log");
}
}
}
else
{
detectedZones[i] = false;
}
}
}
/// <summary>
/// Loops thru each sensor
/// </summary>
static void MonitorSensors()
{
for (int i = 0; i < Sensors.Length; i++)
{
int vInput = Sensors[i].Read();
float volts = ((float)vInput / 1024.0f) * 3.3f;
string strSensorDescription = "N/A"; //If sensor description is not found on SD Card N/A is default description.
Console.DEBUG_ACTIVITY("Sensor " + (i + 1).ToString() + ": Volts: " + volts);
MotionLeds[i].Write(volts >= 3);
double eSeconds = stopwatchSensors[i].ElapsedSeconds;
double eMinutes = stopwatchSensors[i].ElapsedMinutes;
Console.DEBUG_ACTIVITY("stopwatch[" + i.ToString() + "] = " + eSeconds.ToString() + " seconds");
Console.DEBUG_ACTIVITY("stopwatch[" + i.ToString() + "] = " + eMinutes.ToString() + " minutes\n");
if (volts >= 3)
{
/*
Case #1:
!detectedZones[i] = not triggered before. This is the first time in this cycle and first email to send.
Case #2:
detectedZones[i] && eMinutes >= EMAIL_FREQUENCY = triggered before and time is up for sending another email.
*/
if (!detectedSensors[i] || (detectedSensors[i] && eMinutes >= Alarm.ConfigDefault.Data.EMAIL_FREQUENCY))
{
if (Alarm.Common.Alarm_Info.sensorDescription.Count > 0)
{
if (Alarm.Common.Alarm_Info.sensorDescription.Contains("Sensor" + (i + 1).ToString()))
{
strSensorDescription = (string)Alarm.Common.Alarm_Info.sensorDescription["Sensor" + (i + 1).ToString()];
}
}
string info = "Sensor " + (i + 1).ToString() + " " + strSensorDescription;
stopwatchSensors[i] = Stopwatch.StartNew();
detectedSensors[i] = true;
email.SendEmail("Alarm Trigger!", info);
Alarm.Common.Alarm_Info.sbActivity.AppendLine("<tr>");
Alarm.Common.Alarm_Info.sbActivity.AppendLine("<td><center>" + DateTime.Now.ToString() + "</center></td> ");
Alarm.Common.Alarm_Info.sbActivity.AppendLine("<td><center> Sensor " + (i + 1).ToString() + "</center></td>");
Alarm.Common.Alarm_Info.sbActivity.AppendLine("<td><center>" + strSensorDescription + "</center></td>");
Alarm.Common.Alarm_Info.sbActivity.AppendLine("</tr>");
if (Alarm.ConfigDefault.Data.USE_PACHUBE)
{
//supress timer and update Pachube with new status
Pachube.PachubeLibrary.forceUpdate = true;
}
if (SdCardEventLogger.IsSDCardAvailable() && Alarm.ConfigDefault.Data.STORE_LOG)
{
SdCardEventLogger.saveFile(DateTime.Now.ToString("d_MMM_yyyy--HH_mm_ss") + ".log", info, "Log");
}
}
}
else
{
detectedSensors[i] = false;
}
}
}
/// <summary>
/// Synchronize Netduino time with NTP Server
/// </summary>
public static void SetTime()
{
//based on a post from user "Valkyrie-MT" at http://forums.netduino.com/index.php?/topic/475-still-learning-internet-way-to-grab-date-and-time-on-startup/
Extension.SetFromNetwork(DateTime.Now, new TimeSpan(-5, 0, 0));
}
/// <summary>
/// Initializes stopwatch and alarms/sensors arrays
/// </summary>
private static void InitArrays()
{
for (int i = 0; i < Alarm.User_Definitions.Constants.ACTIVE_ZONES; i++)
{
stopwatchZones[i] = Stopwatch.StartNew();
detectedZones[i] = false;
}
for (int i = 0; i < Alarm.User_Definitions.Constants.MOTION_SENSORS; i++)
{
stopwatchSensors[i] = Stopwatch.StartNew();
detectedSensors[i] = false;
}
}
</pre>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia-JowXL-JWNvCfWxKmQ4s7XETDilmlq5xCemZwucAR0uAYypJBogf6ihiFyR-sNjJrq_PAcQFieind1VL-MkbYIwA8NptWdaUSx11x0Dr1gGYw7W5k-vJ876iRl5QLChQp7hVV1uMryE/s1600/Pachube-Cosm_Console.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia-JowXL-JWNvCfWxKmQ4s7XETDilmlq5xCemZwucAR0uAYypJBogf6ihiFyR-sNjJrq_PAcQFieind1VL-MkbYIwA8NptWdaUSx11x0Dr1gGYw7W5k-vJ876iRl5QLChQp7hVV1uMryE/s640/Pachube-Cosm_Console.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cosm, formerly Pachube, Alarm Console</td></tr>
</tbody></table>
<br />
<b style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-large;">Final Product</span></b><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy-4v9bXxUj0vaj141WpLZs-chGQ9rvIYoW1PGppsF7UC7l8hPEUFm_ZU9-DPXsbeEghBUypa5HtfQL4-Dgp4KRtPB2oZFljPNo-4NzMCIq2zi5Y_NhYqF-GVP5HsgNU5UIqU-k3L-pRU/s1600/2013-02-24+20.51.25.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy-4v9bXxUj0vaj141WpLZs-chGQ9rvIYoW1PGppsF7UC7l8hPEUFm_ZU9-DPXsbeEghBUypa5HtfQL4-Dgp4KRtPB2oZFljPNo-4NzMCIq2zi5Y_NhYqF-GVP5HsgNU5UIqU-k3L-pRU/s320/2013-02-24+20.51.25.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">LCD and WiFi Internet Adapter</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4UR2Ar4OJaD_5QCLS0I-XmnbPkwmynaUfloA0D57fXY_HXaJjEQe4jbf0Gn_uGcH6Bb2338XzKgjImpkb3pjvZ0hjnBcGMD48mxDVtU9RxCyhkpZfKZNIpf8naNLtNQth3Y3P8rNUBm4/s1600/2013-02-24+20.52.48.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4UR2Ar4OJaD_5QCLS0I-XmnbPkwmynaUfloA0D57fXY_HXaJjEQe4jbf0Gn_uGcH6Bb2338XzKgjImpkb3pjvZ0hjnBcGMD48mxDVtU9RxCyhkpZfKZNIpf8naNLtNQth3Y3P8rNUBm4/s400/2013-02-24+20.52.48.jpg" width="225" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Alarm Panel with Netduino Plus, LCD and WiFi Internet Adapter</td></tr>
</tbody></table>
<b style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-large;"><br /></span></b>
<b style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-large;">Comments from Netduino Community</span></b><br />
<a href="http://forums.netduino.com/index.php?/topic/4202-home-alarm-system-using-netduino-plus-homealarmplus-project/">http://forums.netduino.com/index.php?/topic/4202-home-alarm-system-using-netduino-plus-homealarmplus-project/</a>
<br />
<br />
<b style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-large;">Base Code Repository</span></b><br />
<a href="https://github.com/ferraripr/HomeAlarmPlus">https://github.com/ferraripr/HomeAlarmPlus</a>
<br />
<br />
<h2>
<b style="font-family: Arial, Helvetica, sans-serif; font-size: medium;"><span style="font-size: x-large;">Video</span></b></h2>
<a href="http://youtu.be/8BVISWQhfTw">YouTube video</a></div>Gilberto Garciahttp://www.blogger.com/profile/05853652520485252429noreply@blogger.com34