本文就要以這塊強大無比的 Arduino 開發版,來做為『Arduino投幣計時器』控制核心,並且整合相關感測器與ThingSpeak雲端平台來進行物聯網的產品設計與開發。<p>本篇是接續上篇文章『如何設計網路計時器:電路組立上、下篇』(<a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_3">曹永忠, 2016b</a>),主要是介紹讀者,接續將投幣計時器、網路投幣計時器,相關元件,進行硬體組立(<a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_2">曹永忠, 2016a</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_3">2016b</a>; <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_5">曹永忠, 許智誠, &amp; 蔡英德, 2015b</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_6">2015c</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_7">2015d</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_8">2015e</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_9">2015f</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_10">2015g</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_11">2015h</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_13">2015j</a>)。</p>
<h2 class="23421">關於組裝元件</h2>
<p>關於所需的元件,請參閱上篇文章『如何設計網路計時器:硬體組立篇』(<a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_3">曹永忠, 2016b</a>; <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_5">曹永忠 et al., 2015b</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_6">2015c</a>),網址如下:<a href="http://www.techbang.com/posts/44123-how-to-design-a-network-timer-hardware-group-legislative-review">http://www.techbang.com/posts/44123-how-to-design-a-network-timer-hardware-group-legislative-review</a>,本文不再重述。</p>
<h2 class="23421"><a></a><a><span lang="EN-US">ThingSpeak&nbsp;</span></a><span>雲端平台建立頻道</span></h2>
<p>本文我們要將『Arduino投幣計時器』(<a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_5">曹永忠 et al., 2015b</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_6">2015c</a>)送上雲端平台,本文使用『ThingSpeak雲端平台』,對於該平台,網路上已有許多文章部分已有操作上的詳細介紹,所以不再詳述之。(<a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_4">曹永忠, 許智誠, &amp; 蔡英德, 2015a</a>; <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_5">曹永忠 et al., 2015b</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_6">2015c</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_9">2015f</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_10">2015g</a>; <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_12">曹永忠, 許智誠, &amp; 蔡英德, 2015i</a>)</p>
<p>首先,先進入『ThingSpeak雲端平台』,網址:<a href="https://thingspeak.com/">https://thingspeak.com/</a>,請先建立帳號後,登入該平台(<a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_1">曹永忠, 2015</a>; <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_14">曹永忠, 許智誠, &amp; 蔡英德, 2015k</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_15">2015l</a>, <a href="file:///D:/%E5%B7%A5%E4%BD%9C/PCHome/249/10%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87/%E5%8D%81%E6%9C%88%E7%AC%AC%E4%B8%80%E7%AF%87V4.docx#_ENREF_16">2015m</a>)。</p>
<p>我們先查看目前已建立的頻道(Channel),如下圖所示:</p>
<p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/366401/original/4bdb610a116078c50c1d41b35119d284.jpeg?1475732868" alt="" /><br />▲圖1 Thinkspeak 頻道一覽表</p>
<p>如下圖紅框處所示,請讀者建立的一個頻道(Channel),並命名為『Timer』的名字,如下圖所示:</p>
<p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/366402/original/f25ef46970adb5fa5be0d3616dddd46c.jpeg?1475732868" alt="" /><br />▲圖2&nbsp;ThingSpeak 創建頻道</p>
<p style="text-align: left;">如下圖所示,請讀者在建立『NetTimer』這個頻道時,如下圖紅框處所示,請依本文內容一一鍵入,如下圖所示:</p>
<p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/366403/original/1d78995679762ed8a62f911b606fb065.jpeg?1475732869" alt="" /><br />▲圖3 創建 ThingSpeak 頻道內容一覽表(主要內容)</p>
<p>建立頻道之後,請點選『API&nbsp; Keys』,顯示『NetTimer』頻道的讀寫金鑰。</p>
<p>讀者由下圖紅框區處,可以看到『NetTimer』頻道的寫入金鑰,本文範例是『F86O9SXIVV6N3VGW』。</p>
<p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/366404/original/0ba885ed1b711fff3fe5258aaad6274d.jpeg?1475732869" alt="" /></p>
<p style="text-align: center;">▲圖4 ThingSpeak 頻道內容一覽表(API_KEY)</p>
<p style="text-align: left;">完成『NetTimer』頻道建立後,請將寫入金鑰『F86O9SXIVV6N3VGW』記住,下列開發物聯網之 Arduino 投幣計時器程式時,會用到寫入金鑰。</p>
<p style="text-align: center;">下一頁開始有計時器的程式設計唷 ~</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<h2 class="23421"><a></a><a><span>物聯網之投幣計時器程式設計</span></a></h2>
<p><span>我們打開 Arduino 開發板的開發工具,編寫一段程式,如下表所示之物聯網之 Arduino 投幣計時器程式一,我們就可以 Arduino 開發板加上乙太網路擴充版(W5100)的網路功能,透過網際網路,將使用者投幣使用投幣計時器的資訊,送到 ThingSpeak 雲端平台-我們建立的『NetTimer』頻道內。</span></p>
<blockquote>
<p><span style="text-decoration: underline;"><strong>表1 物聯網之Arduino投幣計時器</strong></span></p>
<p><span style="text-decoration: underline;"><strong>物聯網之Arduino投幣計時器(Coin_Test51)</strong></span></p>
<p class="a">#include &lt;DS1307RTC.h&gt;</p>
<p class="a">#include &lt;Time.h&gt;</p>
<p class="a">#include &lt;Ethernet.h&gt;</p>
<p class="a">#include &lt;Wire.h&gt;</p>
<p class="a">#include &lt;LiquidCrystal_I2C.h&gt;</p>
<p class="a">#define CoinMinute 5</p>
<p class="a">#define RelayPin 12</p>
<p class="a">#define turnon HIGH</p>
<p class="a">#define turnoff LOW</p>
<p class="a">boolean PowerStatus = false ;</p>
<p class="a">//=======================</p>
<p class="a">// Local Network Settings</p>
<p class="a">byte mac[] = {</p>
<p class="a">&nbsp; 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF</p>
<p class="a">};</p>
<p class="a">IPAddress ip(192, 168, 2, 200);&nbsp;&nbsp;&nbsp;&nbsp; //fix ip</p>
<p class="a">IPAddress dnServer(168, 95, 1, 1); &nbsp;&nbsp;&nbsp;//dns server ip</p>
<p class="a">// the router's gateway address:&nbsp;</p>
<p class="a">IPAddress gateway(192, 168, 2, 1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //inet gateway ip</p>
<p class="a">// the subnet:</p>
<p class="a">IPAddress subnet(255, 255, 255, 0);</p>
<p class="a">// ThingSpeak Settings</p>
<p class="a">byte server[]&nbsp; = { 184, 106, 153, 149 }; // IP Address for the ThingSpeak API</p>
<p class="a">const int updateInterval = 2000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Time interval in milliseconds to update ThingSpeak&nbsp;&nbsp;</p>
<p class="a">EthernetClient client ;</p>
<p class="a">// Variable Setup</p>
<p class="a">long lastConnectionTime = 0;</p>
<p class="a">boolean lastConnected = false;</p>
<p class="a">int resetCounter = 0;</p>
<p class="a">// Initialize Arduino Ethernet Client</p>
<p class="a">// ThingSpeak Settings</p>
<p class="a">String writeAPIKey = "F86O9SXIVV6N3VGW ";&nbsp;&nbsp;&nbsp; // Write API Key for a ThingSpeak Channel</p>
<p class="a">//=================</p>
<p class="a">//&nbsp; ===========&nbsp; use time variable</p>
<p class="a">int UseSecond = 0 ;</p>
<p class="a">int UseMinute = 0 ;</p>
<p class="a">LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display</p>
<p class="a">int coinnum = 0 ;</p>
<p class="a">&nbsp; tmElements_t tm;</p>
<p class="a">&nbsp; int TotalCoin = 0 ;</p>
<p class="a">&nbsp; int CoinTime = 0 ;</p>
<p class="a">void setup()</p>
<p class="a">{</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.begin(9600);</p>
<p class="a">&nbsp; lcd.init();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // initialize the lcd</p>
<p class="a">&nbsp; // Print a message to the LCD.</p>
<p class="a">&nbsp; lcd.backlight();</p>
<p class="a">&nbsp; pinMode(RelayPin,OUTPUT);</p>
<p class="a">&nbsp; digitalWrite(RelayPin,turnoff) ;</p>
<p class="a">&nbsp;attachInterrupt(1, addcoin, RISING);</p>
<p class="a">&nbsp; //attachInterrupt(1, addcoin, CHANGE);</p>
<p class="a">&nbsp;// attachInterrupt(RFIDIntrupNumber, ReadRfidID, CHANGE);</p>
<p class="a">&nbsp;&nbsp;&nbsp; // start the Ethernet connection:</p>
<p class="a">&nbsp; if (Ethernet.begin(mac) == 0) {</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Failed to configure Ethernet using DHCP");</p>
<p class="a">&nbsp;&nbsp;&nbsp; // no point in carrying on, so do nothing forevermore:</p>
<p class="a">&nbsp;&nbsp;&nbsp; // try to congifure using IP address instead of DHCP:</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ethernet.begin(mac, ip, dnServer, gateway, subnet);</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; // give the Ethernet shield a second to initialize:</p>
<p class="a">&nbsp; delay(1000);</p>
<p class="a">&nbsp; Serial.println("connecting...");</p>
<p class="a">}</p>
<p class="a">void loop()</p>
<p class="a">{</p>
<p class="a">&nbsp; // 將游標設到 第一行, 第二列</p>
<p class="a">&nbsp; // (注意: 第二列第五行,因為是從 0 開始數起):</p>
<p class="a">&nbsp; lcd.setCursor(5, 1);</p>
<p class="a">&nbsp; // 列印 Arduino 重開之後經過的秒數</p>
<p class="a">&nbsp; lcd.print(millis() / 1000);</p>
<p class="a">&nbsp; getDateTime() ;</p>
<p class="a">&nbsp; LCDDateTime() ;</p>
<p class="a">&nbsp;LCDCoin(TotalCoin,CoinTime) ;</p>
<p class="a">&nbsp;CheckStatus() ;</p>
<p class="a">&nbsp;if (PowerStatus)</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p class="a">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UseSecond = UseSecond + 15 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UseSecond ++ ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckUseTIme() ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p class="a">&nbsp; delay(1000);</p>
<p class="a">}</p>
<p class="a">void addcoin()</p>
<p class="a">{</p>
<p class="a">&nbsp;&nbsp;&nbsp; TotalCoin ++ ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; CoinTime = CoinTime + CoinMinute ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; updateThingSpeak("field1="+StrDate()+"&amp;field2="+StrTime()+"&amp;field3="+"1"+"&amp;field4="+CoinMinute);</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Update thingspeak is ok");</p>
<p class="a">}</p>
<p class="a">String&nbsp; print2digits(int number) {</p>
<p class="a">&nbsp; String ttt ;</p>
<p class="a">&nbsp; if (number &gt;= 0 &amp;&amp; number &lt; 10)</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp; ttt =String("0")+String(number);</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; else</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp; ttt =String(number);</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp;&nbsp; return ttt ;</p>
<p class="a">}</p>
<p class="a">String&nbsp; print4digits(int number) {</p>
<p class="a">&nbsp; String ttt ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp; ttt =String(number);</p>
<p class="a">&nbsp;&nbsp; return ttt ;</p>
<p class="a">}</p>
<p class="a">String&nbsp; StrDate() {</p>
<p class="a">&nbsp; String ttt ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; ttt = print4digits(tmYearToCalendar(tm.Year))+"/"+print2digits(tm.Month)+"/"+print2digits(tm.Day) ;</p>
<p class="a">&nbsp;&nbsp; return ttt ;</p>
<p class="a">}</p>
<p class="a">String&nbsp; StrTime() {</p>
<p class="a">&nbsp; String ttt ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; ttt = print2digits(tm.Hour)+":"+print2digits(tm.Minute)+":"+print2digits(tm.Second) ;</p>
<p class="a">&nbsp;&nbsp; return ttt ;</p>
<p class="a">}</p>
<p class="a">boolean&nbsp; getDateTime()</p>
<p class="a">{&nbsp;&nbsp; if (RTC.read(tm))</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false ;</p>
<p class="a">}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p class="a">&nbsp; void LCDDateTime()</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.setCursor(0, 0);</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.print(StrDate());</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.setCursor(11, 0);</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcd.print(StrTime());</p>
<p class="a">&nbsp; }</p>
<p class="a">void LCDCoin(int c1,int c2)</p>
<p class="a">{</p>
<p class="a">&nbsp;&nbsp; lcd.setCursor(1, 3);</p>
<p class="a">&nbsp;&nbsp; lcd.print("Credit:");</p>
<p class="a">&nbsp;&nbsp; lcd.print(c1);</p>
<p class="a">&nbsp;&nbsp; lcd.print(" / ") ;</p>
<p class="a">&nbsp;&nbsp; lcd.print(c2);</p>
<p class="a">&nbsp;&nbsp; lcd.print(" min");</p>
<p class="a">&nbsp; Serial.println(coinnum);</p>
<p class="a">}</p>
<p class="a">void CheckStatus()</p>
<p class="a">{</p>
<p class="a">&nbsp;&nbsp;&nbsp; if (!PowerStatus&nbsp; &amp;&amp; ( CoinTime &gt;0 ) )</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // UseSecond ++ ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PowerStatus = true ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digitalWrite(RelayPin,turnon);</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p class="a">&nbsp;&nbsp;&nbsp; if (PowerStatus&nbsp; &amp;&amp; ( CoinTime &lt;=0 ) )</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CoinTime = 0 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UseSecond = 0 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TotalCoin = 0 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PowerStatus = false ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digitalWrite(RelayPin,turnoff);</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p class="a">}</p>
<p class="a">void CheckUseTIme()</p>
<p class="a">{</p>
<p class="a">&nbsp;&nbsp;&nbsp; if (UseSecond &gt;= 60)</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CoinTime --;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UseSecond = 0 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p class="a">}</p>
<p class="a">//===============</p>
<p class="a">void updateThingSpeak(String tsData)</p>
<p class="a">{</p>
<p class="a">&nbsp; if (client.connect(server, 80))</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Connected to ThingSpeak...");</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.print("Data is :(");</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.print(tsData);</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.print(")\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println();</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("POST /update HTTP/1.1\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("Host: api.thingspeak.com\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("Connection: close\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("Content-Type: application/x-www-form-urlencoded\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("Content-Length: ");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print(tsData.length());</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("\n\n");</p>
<p class="a">&nbsp; &nbsp;&nbsp;client.print(tsData);</p>
<p class="a">&nbsp;&nbsp;&nbsp; lastConnectionTime = millis();</p>
<p class="a">&nbsp;&nbsp;&nbsp; resetCounter = 0;</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; else</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Connection Failed.");&nbsp;&nbsp;</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println();</p>
<p class="a">&nbsp;&nbsp;&nbsp; resetCounter++;</p>
<p class="a">&nbsp;&nbsp;&nbsp; if (resetCounter &gt;=5 ) {resetEthernetShield();}</p>
<p class="a">&nbsp;&nbsp;&nbsp; lastConnectionTime = millis();</p>
<p class="a">&nbsp; }</p>
<p class="a">}</p>
<p class="a">void resetEthernetShield()</p>
<p class="a">{</p>
<p class="a">&nbsp; Serial.println("Resetting Ethernet Shield.");&nbsp;&nbsp;</p>
<p class="a">&nbsp; Serial.println();</p>
<p class="a">&nbsp; client.stop();</p>
<p class="a">&nbsp; delay(1000);</p>
<p class="a">&nbsp; Ethernet.begin(mac, ip, gateway, subnet);</p>
<p class="a">&nbsp; delay(1000);</p>
<p class="a">}</p>
<p class="a">//===============</p>
</blockquote>
<p>如下圖所示,當上面程式寫好後,編譯完成後,請上傳到 Arduino 開發板,並開啟監控畫面就可以看到,如下圖所示之傳送資料到 ThingSpeak 雲端平台:</p>
<p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/366405/original/27dd58740866caeb85008573522705f6.jpeg?1475732870" alt="" /><br />▲圖5 IDE 監控資料一覽表</p>
<p style="text-align: center;">下一頁還有更多精彩教學喔 !</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<p style="text-align: left;">如下圖所示,我們用瀏覽器,到 ThingSpeak 雲端平台:<a href="https://thingspeak.com/">https://thingspeak.com/</a>,查看我們建立的『NetTimer』頻道,就可以看到如下圖所示的資料,讀者也可以做進一步分析,或從 ThingSpeak 雲端平台:<a href="https://thingspeak.com/">https://thingspeak.com/</a>,將『NetTimer』頻道的資料下載。</p>
<p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/366406/original/ea86d0764afa49ca7661a67d691eedcc.jpeg?1475732870" alt="" /><br />▲圖6 ThingSpeak 資料一覽表</p>
<h2 class="23421">查看 Channel 資料</h2>
<p><span>讀者在到 ThingSpeak 網站,網址是<a href="https://thingspeak.com/">https://thingspeak.com</a>,進入網站後,先點選下圖紅框區,切換到 Channel 的資料。</span></p>
<p style="text-align: center;"><span><img src="https://cdn1-techbang.pixcdn.tw/system/images/366407/original/af12f518d8984b22985fb19820ddd5ee.jpeg?1475732871" alt="" /><br />▲圖7 切換到 Channel 的資料</span></p>
<p style="text-align: left;"><span>讀者由下圖紅框區處,可以查閱Channel寫入資料。</span></p>
<p style="text-align: center;"><span><img src="https://cdn0-techbang.pixcdn.tw/system/images/366406/original/ea86d0764afa49ca7661a67d691eedcc.jpeg?1475732870" alt="" /><br /></span></p>
<p style="text-align: center;">▲圖8 查閱 Channel 寫入資料</p>
<p>讀者可以看到,我們已經成功的將簡單的亮度監控伺服器的資料,送到 ThinkSpeak 物聯網平台,並可以以查看資料。</p>
<p style="text-align: center;">下一頁還有更多教學哦 ~</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<h2 style="text-align: left;">顯示網路連接資訊</h2>
<p>如果網路出現問題,或網路未準備好,我們無法了解是否可以更新網路資訊到物聯網,所以我們打開 Arduino 開發板的開發工具,編寫一段程式,如下表所示之物聯網之 Arduino 投幣計時器二,我們將網路連接資訊顯示再 LCD 顯示模組上。</p>
<blockquote>
<p><span style="text-decoration: underline;"><strong>表2 物聯網之 Arduino 投幣計時器二</strong></span></p>
<p><span style="text-decoration: underline;"><strong>物聯網之 Arduino 投幣計時器二(Coin_Test52)</strong></span></p>
<p class="a">// Local Network Settings</p>
<p class="a">byte mac[] = {</p>
<p class="a">&nbsp; 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF</p>
<p class="a">};</p>
<p class="a">IPAddress ip(192, 168, 2, 200);&nbsp;&nbsp;&nbsp;&nbsp; //fix ip</p>
<p class="a">IPAddress dnServer(168, 95, 1, 1);&nbsp;&nbsp;&nbsp; //dns server ip</p>
<p class="a">// the router's gateway address:</p>
<p class="a">IPAddress gateway(192, 168, 2, 1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //inet gateway ip</p>
<p class="a">// the subnet:</p>
<p class="a">IPAddress subnet(255, 255, 255, 0);</p>
<p class="a">// ThingSpeak Settings</p>
<p class="a">byte server[]&nbsp; = { 184, 106, 153, 149 }; // IP Address for the ThingSpeak API</p>
<p class="a">const int updateInterval = 2000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Time interval in milliseconds to update ThingSpeak</p>
<p class="a">EthernetClient client ;</p>
<p class="a">// Variable Setup</p>
<p class="a">long lastConnectionTime = 0;</p>
<p class="a">boolean lastConnected = false;</p>
<p class="a">int resetCounter = 0;</p>
<p class="a">boolean InternetOK = false ;</p>
<p class="a">// Initialize Arduino Ethernet Client</p>
<p class="a">// ThingSpeak Settings</p>
<p class="a">String writeAPIKey = "F86O9SXIVV6N3VGW ";&nbsp;&nbsp;&nbsp; // Write API Key for a ThingSpeak Channel</p>
<p class="a">//=================</p>
<p class="a">//&nbsp; ===========&nbsp; use time variable</p>
<p class="a">int UseSecond = 0 ;</p>
<p class="a">int UseMinute = 0 ;</p>
<p class="a">LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display</p>
<p class="a">int coinnum = 0 ;</p>
<p class="a">tmElements_t tm;</p>
<p class="a">int TotalCoin = 0 ;</p>
<p class="a">int CoinTime = 0 ;</p>
<p class="a">void setup()</p>
<p class="a">{</p>
<p class="a">&nbsp; Serial.begin(9600);</p>
<p class="a">&nbsp; lcd.init();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // initialize the lcd</p>
<p class="a">&nbsp; // Print a message to the LCD.</p>
<p class="a">&nbsp; lcd.backlight();</p>
<p class="a">&nbsp; pinMode(RelayPin, OUTPUT);</p>
<p class="a">&nbsp; digitalWrite(RelayPin, turnoff) ;</p>
<p class="a">&nbsp; attachInterrupt(1, addcoin, RISING);</p>
<p class="a">&nbsp; //attachInterrupt(1, addcoin, CHANGE);</p>
<p class="a">&nbsp; // start the Ethernet connection:</p>
<p class="a">&nbsp; if (Ethernet.begin(mac) == 0) {</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Failed to configure Ethernet using DHCP");</p>
<p class="a">&nbsp;&nbsp;&nbsp; // no point in carrying on, so do nothing forevermore:</p>
<p class="a">&nbsp;&nbsp;&nbsp; // try to congifure using IP address instead of DHCP:</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ethernet.begin(mac, ip, dnServer, gateway, subnet);</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternetOK = false ;</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; else</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp; InternetOK = true ;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp; // give the Ethernet shield a second to initialize:</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("connecting...");</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp; ShowNetworkStatus(InternetOK) ;</p>
<p class="a">&nbsp; delay(1000);</p>
<p class="a">}</p>
<p class="a">void loop()</p>
<p class="a">{</p>
<p class="a">&nbsp; // 將游標設到 第一行, 第二列</p>
<p class="a">&nbsp; // (注意: 第二列第五行,因為是從 0 開始數起):</p>
<p class="a">&nbsp;// lcd.setCursor(5, 2);</p>
<p class="a">&nbsp; // 列印 Arduino 重開之後經過的秒數</p>
<p class="a">&nbsp;// lcd.print(millis() / 1000);</p>
<p class="a">&nbsp; getDateTime() ;</p>
<p class="a">&nbsp; LCDDateTime() ;</p>
<p class="a">&nbsp; LCDCoin(TotalCoin, CoinTime) ;</p>
<p class="a">&nbsp; CheckStatus() ;</p>
<p class="a">&nbsp; if (PowerStatus)</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UseSecond = UseSecond + 15 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; UseSecond ++ ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; CheckUseTIme() ;</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; delay(1000);</p>
<p class="a">}</p>
<p class="a">void addcoin()</p>
<p class="a">{</p>
<p class="a">&nbsp; TotalCoin ++ ;</p>
<p class="a">&nbsp; CoinTime = CoinTime + CoinMinute ;</p>
<p class="a">&nbsp;// LCDShowStatus("New Coins") ;</p>
<p class="a">&nbsp;// delay(1000);</p>
<p class="a">&nbsp; if (InternetOK)</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updateThingSpeak("field1=" + StrDate() + "&amp;field2=" + StrTime() + "&amp;field3=" + "1" + "&amp;field4=" + CoinMinute);</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("Update thingspeak is ok");</p>
<p class="a">&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; LCDShowStatus("Update Data to IOT") ;</p>
<p class="a">&nbsp; }</p>
<p class="a">}</p>
<p class="a">String&nbsp; print2digits(int number) {</p>
<p class="a">&nbsp; String ttt ;</p>
<p class="a">&nbsp; if (number &gt;= 0 &amp;&amp; number &lt; 10)</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; ttt = String("0") + String(number);</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; else</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; ttt = String(number);</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; return ttt ;</p>
<p class="a">}</p>
<p class="a">String&nbsp; print4digits(int number) {</p>
<p class="a">&nbsp; String ttt ;</p>
<p class="a">&nbsp; ttt = String(number);</p>
<p class="a">&nbsp; return ttt ;</p>
<p class="a">}</p>
<p class="a">String&nbsp; StrDate() {</p>
<p class="a">&nbsp; String ttt ;</p>
<p class="a">&nbsp; ttt = print4digits(tmYearToCalendar(tm.Year)) + "/" + print2digits(tm.Month) + "/" + print2digits(tm.Day) ;</p>
<p class="a">&nbsp; return ttt ;</p>
<p class="a">}</p>
<p class="a">String&nbsp; StrTime() {</p>
<p class="a">&nbsp; String ttt ;</p>
<p class="a">&nbsp; ttt = print2digits(tm.Hour) + ":" + print2digits(tm.Minute) + ":" + print2digits(tm.Second) ;</p>
<p class="a">&nbsp; return ttt ;</p>
<p class="a">}</p>
<p class="a">boolean&nbsp; getDateTime()</p>
<p class="a">{ if (RTC.read(tm))</p>
<p class="a">&nbsp;&nbsp;&nbsp; return true ;</p>
<p class="a">&nbsp; else</p>
<p class="a">&nbsp;&nbsp;&nbsp; return false ;</p>
<p class="a">}</p>
<p class="a">void LCDDateTime()</p>
<p class="a">{</p>
<p class="a">&nbsp; lcd.setCursor(0, 0);</p>
<p class="a">&nbsp; lcd.print(StrDate());</p>
<p class="a">&nbsp; lcd.setCursor(11, 0);</p>
<p class="a">&nbsp; lcd.print(StrTime());</p>
<p class="a">}</p>
<p class="a">void LCDCoin(int c1, int c2)</p>
<p class="a">{</p>
<p class="a">&nbsp; lcd.setCursor(1, 3);</p>
<p class="a">&nbsp; lcd.print("Credit:");</p>
<p class="a">&nbsp; lcd.print(c1);</p>
<p class="a">&nbsp; lcd.print(" / ") ;</p>
<p class="a">&nbsp; lcd.print(c2);</p>
<p class="a">&nbsp; lcd.print(" min");</p>
<p class="a">&nbsp; Serial.println(coinnum);</p>
<p class="a">}</p>
<p class="a">void CheckStatus()</p>
<p class="a">{</p>
<p class="a">&nbsp; if (!PowerStatus&nbsp; &amp;&amp; ( CoinTime &gt; 0 ) )</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; // UseSecond ++ ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; PowerStatus = true ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; digitalWrite(RelayPin, turnon);</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Now Turn On Power") ;</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; if (PowerStatus&nbsp; &amp;&amp; ( CoinTime &lt;= 0 ) )</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; CoinTime = 0 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; UseSecond = 0 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; TotalCoin = 0 ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; PowerStatus = false ;</p>
<p class="a">&nbsp;&nbsp;&nbsp; digitalWrite(RelayPin, turnoff);</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Now Turn off Power") ;</p>
<p class="a">&nbsp; }</p>
<p class="a">}</p>
<p class="a">void CheckUseTIme()</p>
<p class="a">{</p>
<p class="a">&nbsp; if (UseSecond &gt;= 60)</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; CoinTime --;</p>
<p class="a">&nbsp;&nbsp;&nbsp; UseSecond = 0 ;</p>
<p class="a">&nbsp; }</p>
<p class="a">}</p>
<p class="a">//===============</p>
<p class="a">void updateThingSpeak(String tsData)</p>
<p class="a">{</p>
<p class="a">&nbsp; if (client.connect(server, 80))</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Connected to ThingSpeak...");</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.print("Data is :(");</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.print(tsData);</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.print(")\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println();</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("POST /update HTTP/1.1\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("Host: api.thingspeak.com\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("Connection: close\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("X-THINGSPEAKAPIKEY: " + writeAPIKey + "\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("Content-Type: application/x-www-form-urlencoded\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("Content-Length: ");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print(tsData.length());</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print("\n\n");</p>
<p class="a">&nbsp;&nbsp;&nbsp; client.print(tsData);</p>
<p class="a">&nbsp;&nbsp;&nbsp; lastConnectionTime = millis();</p>
<p class="a">&nbsp;&nbsp;&nbsp; resetCounter = 0;</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; else</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println("Connection Failed.");</p>
<p class="a">&nbsp;&nbsp;&nbsp; Serial.println();</p>
<p class="a">&nbsp;&nbsp;&nbsp; resetCounter++;</p>
<p class="a">&nbsp;&nbsp;&nbsp; if (resetCounter &gt;= 5 ) {</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resetEthernetShield();</p>
<p class="a">&nbsp;&nbsp;&nbsp; }</p>
<p class="a">&nbsp;&nbsp;&nbsp; lastConnectionTime = millis();</p>
<p class="a">&nbsp; }</p>
<p class="a">}</p>
<p class="a">void resetEthernetShield()</p>
<p class="a">{</p>
<p class="a">&nbsp; Serial.println("Resetting Ethernet Shield.");</p>
<p class="a">&nbsp; Serial.println();</p>
<p class="a">&nbsp; client.stop();</p>
<p class="a">&nbsp; delay(1000);</p>
<p class="a">&nbsp; Ethernet.begin(mac, ip, gateway, subnet);</p>
<p class="a">&nbsp; delay(1000);</p>
<p class="a">}</p>
<p class="a">//===============</p>
<p class="a">void ShowNetworkStatus(boolean st)</p>
<p class="a">{</p>
<p class="a">&nbsp; lcd.setCursor(1, 1);</p>
<p class="a">&nbsp; lcd.print("Net:");</p>
<p class="a">&nbsp; if (st)</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; lcd.print("Connected");</p>
<p class="a">&nbsp; }</p>
<p class="a">&nbsp; else</p>
<p class="a">&nbsp; {</p>
<p class="a">&nbsp;&nbsp;&nbsp; lcd.print("Disconnected");</p>
<p class="a">&nbsp; }</p>
<p class="a">}</p>
<p class="a">void LCDShowStatus(String msg)</p>
<p class="a">{</p>
<p class="a">&nbsp; lcd.setCursor(1,2);</p>
<p class="a">&nbsp; lcd.print("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ");</p>
<p class="a">&nbsp; lcd.setCursor(1,2);</p>
<p class="a">&nbsp; lcd.print(msg);</p>
<blockquote>}</blockquote>
</blockquote>
<p>如下圖所示,當上面程式寫好後,編譯完成後,如下圖所示,可以看到顯示網路連接資訊。</p>
<p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/366408/original/5c71c4e6115d92f86dfe1472f002c9c2.jpeg?1475732871" alt="" /><br />▲圖9 顯示網路連接資訊</p>
<p style="text-align: center;">下一頁有作者的介紹唷 ~</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<p>本文為『智慧家庭:網路計時器』系列第終篇:物聯網開發篇,主要承接上篇『如何設計網路計時器:系統開發篇』,介紹讀者如何開發網路計時器的進入物聯網的核心的程式。</p>
<p>相信在『智慧家庭:網路計時器』有限的文字,透過一般 Arduino 開發板、RTC 時鐘模組、繼電器模組、W5100乙太網路擴充版&hellip;等等,可以達到市售的投幣計時器的計時供電功能,更能夠將資訊傳送到物聯網平台。</p>
<p>本文一步一步改造出完整功能的 Arduino 投幣計時器的裝置,讀者可以很深刻的了解到如何將所學到的電子暨資訊技術應用到日常所見的產品研發上,本系列叢書並不是教大家完全創新一個產品,而是透過常見的商業產品設計、產品開發、並使用 Arduino 開發板進而重製與延伸設計的寫作方式,了解目前學習到的技術,是如何應用到開發產品的過程,進而落實所學的技術。</p>
<p>敬請期待更多的文章。</p>
<blockquote>
<h3>筆者介紹</h3>
<p><strong>曹永忠 (Yung-Chung Tsao)</strong>:目前為自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計、Arduino 開發、嵌入式系統開發,商品攝影及人像攝影。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。</p>
<p><img src="https://cdn0-techbang.pixcdn.tw/system/images/366409/original/bcd78af8ed69781aeb3907a1fe47aa27.jpeg?1475732872" alt="" /></p>
<p>Email:<a href="mailto:[email protected]">[email protected]<br /></a>Line ID:dr.brucetsao <br />Arduino部落格:<a href="http://taiwanarduino.blogspot.tw/">http://taiwanarduino.blogspot.tw/<br /></a>臉書社群(Arduino.Taiwan):<a href="https://www.facebook.com/groups/Arduino.Taiwan/">https://www.facebook.com/groups/Arduino.Taiwan/<br /></a>活動官網:<a href="http://arduino.kktix.cc/">http://arduino.kktix.cc/<br /></a>Youtube:<a href="https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ">https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ</a></p>
</blockquote>
<p>&nbsp;</p>
<blockquote>
<h3>參考文獻</h3>
<p class="EndNoteBibliography">曹永忠. (2015). 用 LinkIt ONE 開發版打造綠能智慧插座-利用物聯網雲端平台資源開發.&nbsp;&nbsp; Retrieved from <a href="http://www.techbang.com/posts/40400-using-linkit-one-developer-to-create-green-energy-smart-plug-cloud-resources">http://www.techbang.com/posts/40400-using-linkit-one-developer-to-create-green-energy-smart-plug-cloud-resources</a></p>
<p class="EndNoteBibliography">曹永忠. (2016a). 如何設計網路計時器:元件設計篇. <em>智慧家庭.</em>&nbsp; Retrieved from <a href="http://www.techbang.com/posts/43326-how-to-design-a-network-timer-component-design-review">http://www.techbang.com/posts/43326-how-to-design-a-network-timer-component-design-review</a></p>
<p class="EndNoteBibliography">曹永忠. (2016b). 【如何設計網路計時器?】硬體組立篇. <em>智慧家庭.</em>&nbsp; Retrieved from <a href="http://www.techbang.com/posts/44123-how-to-design-a-network-timer-hardware-group-legislative-review">http://www.techbang.com/posts/44123-how-to-design-a-network-timer-hardware-group-legislative-review</a></p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015a). <em>Arduino</em><em>云 物联网系统开发(入门篇):Using Arduino Yun to Develop an Application for Internet of Things (Basic Introduction)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015b). <em>Arduino</em><em>投币定时器(网络篇):Using Arduino to Develop a Timing Controlling Device via Internet</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015c). <em>Arduino</em><em>投幣計時器(網路篇):Using Arduino to Develop a Timing Controlling Device via Internet</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015d). <em>Arduino</em><em>程式教學(入門篇):Arduino Programming (Basic Skills &amp; Tricks)</em> (初版 ed.). 台湾、彰化: 渥玛数位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015e). <em>Arduino</em><em>程式教學(常用模組篇):Arduino Programming (37 Sensor Modules)</em> (初版 ed.). 台湾、彰化: 渥玛数位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015f). <em>Arduino</em><em>程式教學(無線通訊篇):Arduino Programming (Wireless Communication)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015g). <em>Arduino</em><em>编程教学(无线通讯篇):Arduino Programming (Wireless Communication)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015h). <em>Arduino</em><em>编程教学(常用模块篇):Arduino Programming (37 Sensor Modules) </em>(初版 ed.). 台湾、彰化: 渥玛数位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015i). <em>Arduino</em><em>雲 物聯網系統開發(入門篇):Using Arduino Yun to Develop an Application for Internet of Things (Basic Introduction)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015j). <em>Arduino</em><em>編程教学(入门篇):Arduino Programming (Basic Skills &amp; Tricks)</em> (初版 ed.). 台湾、彰化: 渥玛数位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015k). 【Maker 實戰】實作 Arduino Ethernet Shield 應用,透過網路監控居家亮度.&nbsp;&nbsp; Retrieved from <a href="http://www.techbang.com/posts/25109-future-of-humanity-through-network-monitoring-internet-home-brightness">http://www.techbang.com/posts/25109-future-of-humanity-through-network-monitoring-internet-home-brightness</a></p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015l). 人類的未來-物聯網:透過THINGSPEAK網站監控居家亮度. <em>物聯網.</em>&nbsp; Retrieved from <a href="http://makerdiwo.com/archives/4690">http://makerdiwo.com/archives/4690</a></p>
曹永忠, 許智誠, &amp; 蔡英德. (2015m). 邁入『物聯網』的第一步:如何使用無線傳輸:基本篇. <em>物聯網.</em>&nbsp; Retrieved from <a href="http://www.techbang.com/posts/25459-technology-in-the-future-internet-of-things-business-model-how-to-use-wireless-transmission-the-basic-text">http://www.techbang.com/posts/25459-technology-in-the-future-internet-of-things-business-model-how-to-use-wireless-transmission-the-basic-text</a>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote>
<p>&nbsp;</p>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: center;"><span><br /></span></p><a href="http://www.facebook.com/TKbang">加入T客邦Facebook粉絲團</a><img src="http://feeds.feedburner.com/~r/techbang/~4/qITTdHGqHYw" height="1" width="1" alt=""/>