<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ESP32 &#8211; 醬是創客</title>
	<atom:link href="https://www.chosemaker.com/board/esp32/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.chosemaker.com</link>
	<description>醬是創客</description>
	<lastBuildDate>Tue, 30 Aug 2022 07:48:17 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.6.8</generator>

<image>
	<url>https://www.chosemaker.com/wp-content/uploads/2020/07/cropped-favicon-1-32x32.jpg</url>
	<title>ESP32 &#8211; 醬是創客</title>
	<link>https://www.chosemaker.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[ESP32教學#20] Arduino透過SPI介面傳送/接收CAN bus通訊協議</title>
		<link>https://www.chosemaker.com/board/esp32/lesson-20/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Fri, 29 Jul 2022 07:48:09 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=658</guid>

					<description><![CDATA[<p>醬是創客的ESP32教學主題第20篇，以NodeMCU-32S(使用Arduino IDE)來實作教 &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-20/">[ESP32教學#20] Arduino透過SPI介面傳送/接收CAN bus通訊協議</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的ESP32教學主題第20篇，以NodeMCU-32S(使用Arduino IDE)來實作教學，本篇教學Arduino透過SPI介面傳送/接收CAN bus通訊協議，來傳送接收Standard/Extended/Remote request Frame</p>



<p>以下是我們今天的目標</p>



<ul><li>傳送接收Standard/Extended/Remote request Frame</li><li>了解CAN bus ID/DLC/DATA的關聯</li></ul>



<p>設備:<br>安信可原廠/副廠NodeMCU-32S&nbsp;#<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a>&nbsp;#<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>醬是創客CAN bus模組&nbsp;#<a href="https://www.ruten.com.tw/item/show?22231977692381" target="_blank" aria-label="undefined (opens in a new tab)" rel="noreferrer noopener">露天拍賣</a>&nbsp;#<a aria-label="undefined (opens in a new tab)" href="https://shopee.tw/Arduino-ESP32-MCP2515-TJA1050-CAN-bus%E6%94%B6%E7%99%BC%E6%A8%A1%E7%B5%84-SPI%E4%BB%8B%E9%9D%A2-%E9%80%81%E6%95%99%E5%AD%B8-i.293276804.14390512916?sp_atk=4fe21112-65f1-4725-b29b-442d9ba8ed4e&amp;xptdk=4fe21112-65f1-4725-b29b-442d9ba8ed4e" target="_blank" rel="noreferrer noopener">蝦皮購物</a></p>



<p>CAN bus發送端接線方式:<br>NodeMCU-32S(GPIO5)–SPI訊號–醬是創客CAN bus模組(CS)<br>NodeMCU-32S(GPIO18)–SPI訊號–醬是創客CAN bus模組(SCK)<br>NodeMCU-32S(GPIO19)–SPI訊號–醬是創客CAN bus模組(SO)<br>NodeMCU-32S(GPIO23)–SPI訊號–醬是創客CAN bus模組(SI)<br>DC 5V(+)–醬是創客CAN bus模組(VCC)<br>DC 0V(-)–醬是創客CAN bus模組(GND)<br>發送端醬是創客CAN bus模組(H)-CAN訊號–接收端醬是創客CAN bus模組(H)<br>發送端醬是創客CAN bus模組(L)-CAN訊號–接收端醬是創客CAN bus模組(L)</p>



<p>CAN bus接收端接線方式:<br>NodeMCU-32S(GPIO5)–SPI訊號–醬是創客CAN bus模組(CS)<br>NodeMCU-32S(GPIO18)–SPI訊號–醬是創客CAN bus模組(SCK)<br>NodeMCU-32S(GPIO19)–SPI訊號–醬是創客CAN bus模組(SO)<br>NodeMCU-32S(GPIO21)–DI訊號–醬是創客CAN bus模組(INT)<br>NodeMCU-32S(GPIO23)–SPI訊號–醬是創客CAN bus模組(SI)<br>DC 5V(+)–醬是創客CAN bus模組(VCC)<br>DC 0V(-)–醬是創客CAN bus模組(GND)<br>發送端醬是創客CAN bus模組(H)-CAN訊號–接收端醬是創客CAN bus模組(H)<br>發送端醬是創客CAN bus模組(L)-CAN訊號–接收端醬是創客CAN bus模組(L)</p>



<p>Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)</p>



<figure class="wp-block-image"><img loading="lazy" width="868" height="923" src="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png" alt="" class="wp-image-261" srcset="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png 868w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-282x300.png 282w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-768x817.png 768w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-329x350.png 329w" sizes="(max-width: 868px) 100vw, 868px" /></figure>



<p>醬是創客CAN bus模組相關資料<br>CAN bus的速率是依靠晶片與振盪器而定，以MCP2515這顆晶片來說它理論可以達到1Mbps，這個前提是配合16MHz或20MHz振盪器，如果需要跑到1Mbps需求者，需自行將振盪器元件轉焊換成16MHz或20MHz，一般來說這個模組使用8MHz振盪器，速度會選用125Kbps，以我們做過的專案來說125Kbps其實就很夠用</p>



<p>Arduino IDE mcp2515.h 安裝說明:<br>1. 下載此ZIP檔案<a aria-label="undefined (opens in a new tab)" href="https://github.com/autowp/arduino-mcp2515/archive/master.zip" target="_blank" rel="noreferrer noopener">https://github.com/autowp/arduino-mcp2515/archive/master.zip</a><br>2. 打開Arduino IDE &gt;&gt; 草稿碼 &gt;&gt; 匯入程式庫 &gt;&gt; 加入.ZIP程式庫，並選擇剛剛下載的ZIP檔案<br>3. 安裝好後，關閉Arduino IDE，並再重新啟動Arduino IDE</p>



<p>Arduino CAN bus發送端範例程式碼如下，<span style="color:#ff2200" class="has-inline-color">請注意程式碼中的 &amp;amp; 需自行轉換成&amp;符號</span></p>


<pre class="brush: cpp; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#include &quot;WiFi.h&quot;
#include &lt;SPI.h&gt;
#include &lt;mcp2515.h&gt;

struct can_frame canMsg1;
struct can_frame canMsg2;
//定義使用GPIO5當SPI的CS
MCP2515 mcp2515(5);


void setup() {
  //standard frame
  canMsg1.can_id  = 0x0F6;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x8E;
  canMsg1.data[1] = 0x87;
  canMsg1.data[2] = 0x32;
  canMsg1.data[3] = 0xFA;
  canMsg1.data[4] = 0x26;
  canMsg1.data[5] = 0x8E;
  canMsg1.data[6] = 0xBE;
  canMsg1.data[7] = 0x86;

  //extended frame
  canMsg2.can_id  = 0x12345678 | CAN_EFF_FLAG;
  canMsg2.can_dlc = 8;
  canMsg2.data[0] = 0x0E;
  canMsg2.data[1] = 0x00;
  canMsg2.data[2] = 0x00;
  canMsg2.data[3] = 0x08;
  canMsg2.data[4] = 0x01;
  canMsg2.data[5] = 0x00;
  canMsg2.data[6] = 0x00;
  canMsg2.data[7] = 0xA0;
  
  
  Serial.begin(115200);
  
  mcp2515.reset();
  //使用8MHz振盪器並搭配125Kbps速度
  mcp2515.setBitrate(CAN_125KBPS, MCP_8MHZ);
  //使用CAN bus NormalMode
  mcp2515.setNormalMode();
  
  Serial.println(&quot;Chosemaker: Write to CAN&quot;);
}

void loop() {
  //送出standard frame
  mcp2515.sendMessage(&amp;amp;canMsg1);
  delay(1000);
  //送出extended frame
  mcp2515.sendMessage(MCP2515::TXB1,&amp;amp;canMsg2);  
  delay(1000);
}
</pre>


<p>Arduino CAN bus接收端範例程式碼如下，<span style="color:#ff2200" class="has-inline-color">請注意程式碼中的 &amp;amp; 需自行轉換成&amp;符號</span></p>


<pre class="brush: cpp; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#include &quot;WiFi.h&quot;
#include &lt;SPI.h&gt;
#include &lt;mcp2515.h&gt;

struct can_frame canMsg;
//定義CAN_INT使用GPIO21
#define CAN_INT 21
//定義使用GPIO5當SPI的CS
MCP2515 mcp2515(5);
char msgString[128]; 


void setup() {
  Serial.begin(115200);
  
  mcp2515.reset();
  //使用8MHz振盪器並搭配125Kbps速度
  mcp2515.setBitrate(CAN_125KBPS, MCP_8MHZ);
  //使用CAN bus NormalMode
  mcp2515.setNormalMode();
  //CAN_INT為INPUT模式
  pinMode(CAN_INT, INPUT);
  Serial.println(&quot;------- CAN Read ----------&quot;);
  Serial.println(&quot;ID  DLC   DATA&quot;);
}

void loop() {
  //CAN_INT低電位時開始收資料
  if(!digitalRead(CAN_INT))                         
  {
    //讀取CAN Frame資料
    mcp2515.readMessage(&amp;amp;canMsg);      
    //判斷ID是standard (11 bits) frame還是extended (29 bits)frame
    if((canMsg.can_id &amp;amp; 0x80000000) == 0x80000000)     
      sprintf(msgString, &quot;Extended ID: 0x%.8lX  DLC: %1d  Data:&quot;, (canMsg.can_id &amp;amp; 0x1FFFFFFF), canMsg.can_dlc);
    else
      sprintf(msgString, &quot;Standard ID: 0x%.3lX       DLC: %1d  Data:&quot;, canMsg.can_id, canMsg.can_dlc);
  
    Serial.print(msgString);
    //判斷ID是否為remote request frame
    if((canMsg.can_id &amp;amp; 0x40000000) == 0x40000000){    
      sprintf(msgString, &quot; REMOTE REQUEST FRAME&quot;);
      Serial.print(msgString);
    } else {
      //取出frame資料
      for(byte i = 0; i&lt;canMsg.can_dlc; i++){
        sprintf(msgString, &quot; 0x%.2X&quot;, canMsg.data[i]);
        Serial.print(msgString);
      }
    }
        
    Serial.println();
  }


}
</pre>


<p>我們在發送端每隔一秒鐘持續發出standard frame和extended frame，在CAN bus設計中standard frame ID有11 bits，extended frame ID有29 bits，DLC代表著資料的長度，DATA的部分常用都是8組0~255</p>


<pre class="brush: plain; title: ; notranslate">
entry 0x400806ac
------- CAN Read ----------
ID  DLC   DATA
Extended ID: 0x12345678  DLC: 8  Data: 0x0E 0x00 0x00 0x08 0x01 0x00 0x00 0xA0
Standard ID: 0x0F6       DLC: 8  Data: 0x8E 0x87 0x32 0xFA 0x26 0x8E 0xBE 0x86
</pre><p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-20%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2320%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E4%BB%8B%E9%9D%A2%E5%82%B3%E9%80%81%2F%E6%8E%A5%E6%94%B6CAN%20bus%E9%80%9A%E8%A8%8A%E5%8D%94%E8%AD%B0" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-20%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2320%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E4%BB%8B%E9%9D%A2%E5%82%B3%E9%80%81%2F%E6%8E%A5%E6%94%B6CAN%20bus%E9%80%9A%E8%A8%8A%E5%8D%94%E8%AD%B0" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-20%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2320%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E4%BB%8B%E9%9D%A2%E5%82%B3%E9%80%81%2F%E6%8E%A5%E6%94%B6CAN%20bus%E9%80%9A%E8%A8%8A%E5%8D%94%E8%AD%B0" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-20%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2320%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E4%BB%8B%E9%9D%A2%E5%82%B3%E9%80%81%2F%E6%8E%A5%E6%94%B6CAN%20bus%E9%80%9A%E8%A8%8A%E5%8D%94%E8%AD%B0" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-20%2F&#038;title=%5BESP32%E6%95%99%E5%AD%B8%2320%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E4%BB%8B%E9%9D%A2%E5%82%B3%E9%80%81%2F%E6%8E%A5%E6%94%B6CAN%20bus%E9%80%9A%E8%A8%8A%E5%8D%94%E8%AD%B0" data-a2a-url="https://www.chosemaker.com/board/esp32/lesson-20/" data-a2a-title="[ESP32教學#20] Arduino透過SPI介面傳送/接收CAN bus通訊協議"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-20/">[ESP32教學#20] Arduino透過SPI介面傳送/接收CAN bus通訊協議</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[ESP32教學#19] Arduino播放Micro SD MP3/WAV音樂語音檔案</title>
		<link>https://www.chosemaker.com/board/esp32/lesson-19/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Wed, 06 Jul 2022 02:39:01 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=639</guid>

					<description><![CDATA[<p>醬是創客的ESP32教學主題第19篇，以NodeMCU-32S(使用Arduino語言)來實作教學， &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-19/">[ESP32教學#19] Arduino播放Micro SD MP3/WAV音樂語音檔案</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的ESP32教學主題第19篇，以NodeMCU-32S(使用Arduino語言)來實作教學，本篇教學Arduino播放Micro SD MP3/WAV音樂語音檔案，還可以撥放指定MP3音樂</p>



<p>以下是我們今天的目標</p>



<ul><li>播放指定資料夾位置音樂</li><li>調高/調低聲音</li><li>暫停/播放/停止音樂</li></ul>



<p>設備:<br>安信可原廠/副廠NodeMCU-32S #<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>醬是創客MP3模組 #<a aria-label="undefined (opens in a new tab)" href="https://www.ruten.com.tw/item/show?22227650371186" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a aria-label="undefined (opens in a new tab)" href="https://shopee.tw/-%E9%86%AC%E6%98%AF%E5%89%B5%E5%AE%A2-Micro-SD-MP3-WAV%E9%9F%B3%E6%A8%82%E8%AA%9E%E9%9F%B3%E6%AA%94%E6%A1%88%E6%92%A5%E6%94%BE%E6%A8%A1%E7%B5%84-3.5mm%E9%9F%B3%E6%BA%90%E8%BC%B8%E5%87%BA-%E9%99%84%E6%95%99%E5%AD%B8-i.293276804.19720067196?sp_atk=c8aa4aa9-573b-48fe-ade2-46f25db8d291&amp;xptdk=c8aa4aa9-573b-48fe-ade2-46f25db8d291" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>Micro SD卡 32GB(FAT32檔案格式)</p>



<p>接線方式:<br>NodeMCU-32S(GPIO17)–TTL訊號–醬是創客MP3模組(RX)<br>NodeMCU-32S(GPIO16)–TTL訊號–醬是創客MP3模組(TX)<br>DC 5V(+)–醬是創客MP3模組(VCC)<br>DC 0V(-)–醬是創客MP3模組(GND)</p>



<p>Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)</p>



<figure class="wp-block-image"><img loading="lazy" width="868" height="923" src="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png" alt="" class="wp-image-261" srcset="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png 868w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-282x300.png 282w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-768x817.png 768w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-329x350.png 329w" sizes="(max-width: 868px) 100vw, 868px" /></figure>



<p>醬是創客MP3模組相關資料</p>



<p>檔案位置須依指定位置擺放，XXXX請使用英文，不要使用中文或數字，最大只能用到32G的大小，僅建議使用FAT32檔案格式<br>EX: 第1資料夾第2首 -&gt; /01/002XXXX.mp3<br>EX: 第1資料夾第3首 -&gt; /01/003XXXX.mp3<br>EX: 第2資料夾第5首 -&gt; /02/005XXXX.mp3<br>更多規格資訊請參考https://github.com/0xcafed00d/yx5300/blob/master/docs/Serial%20MP3%20Player%20v1.0%20Manual.pdf</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="770" height="1024" src="https://www.chosemaker.com/wp-content/uploads/2022/07/esp32-19-1-770x1024.png" alt="" class="wp-image-640" srcset="https://www.chosemaker.com/wp-content/uploads/2022/07/esp32-19-1-770x1024.png 770w, https://www.chosemaker.com/wp-content/uploads/2022/07/esp32-19-1-226x300.png 226w, https://www.chosemaker.com/wp-content/uploads/2022/07/esp32-19-1-768x1021.png 768w, https://www.chosemaker.com/wp-content/uploads/2022/07/esp32-19-1-1155x1536.png 1155w, https://www.chosemaker.com/wp-content/uploads/2022/07/esp32-19-1-1540x2048.png 1540w, https://www.chosemaker.com/wp-content/uploads/2022/07/esp32-19-1-263x350.png 263w, https://www.chosemaker.com/wp-content/uploads/2022/07/esp32-19-1.png 1796w" sizes="(max-width: 770px) 100vw, 770px" /></figure>



<p>Arduino 範例程式碼如下</p>


<pre class="brush: cpp; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#include &lt;WiFi.h&gt;
#define RXD2 16
#define TXD2 17
 
byte serial_8_byte_TX_payload[8];

 
void setup(void) {
  Serial.begin(115200);
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);

  //重設晶片
  serial2_8byte_tx(0x0c, 0x00, 0x00);

  //選擇系統讀取TF卡資料
  serial2_8byte_tx(0x09, 0x00, 0x02);

  //讀取資料夾位置/01/002XXXX.mp3檔案
  serial2_8byte_tx(0x0f, 1, 2);

  //讀取資料夾位置/01/001XXXX.mp3檔案
  serial2_8byte_tx(0x0f, 1, 1);

  //讀取資料夾位置/01/003XXXX.mp3檔案
  serial2_8byte_tx(0x0f, 1, 3);
  
  //讀取資料夾位置/02/005XXXX.mp3檔案
  serial2_8byte_tx(0x0f, 2, 5);
  
  //讀取資料夾位置/02/006XXXX.mp3檔案
  serial2_8byte_tx(0x0f, 2, 6);
  
  //調低聲音一階
  serial2_8byte_tx(0x05, 0x00, 0x00);
  
  //調高聲音一階
  serial2_8byte_tx(0x04, 0x00, 0x00);
  
  //設定音量為30階(預設)
  serial2_8byte_tx(0x06, 0x00, 30);
  
  //設定音量為5階
  serial2_8byte_tx(0x06, 0x00, 5);

  //設定音量為30階
  serial2_8byte_tx(0x06, 0x00, 30);

  //暫停撥放音樂
  serial2_8byte_tx(0x0E, 0x00, 0x00);
  
  //繼續撥放音樂 
  serial2_8byte_tx(0x0D, 0x00, 0x00);
 
  //停止撥放音樂
  serial2_8byte_tx(0x16, 0x00, 0x00);
  
  //繼續撥放音樂(重新)
  serial2_8byte_tx(0x0D, 0x00, 0x00);    
}
 
void loop(void) {
}
 
void serial2_8byte_tx(int8_t command, int8_t data_1, int8_t data_2){
  if (command == 0x0c or command == 0x09) {
    delay(1500);
  }
  else {
    delay(500);
  }
  serial_8_byte_TX_payload[0] = 0x7e; //starting byte
  serial_8_byte_TX_payload[1] = 0xff; //version 
  serial_8_byte_TX_payload[2] = 0x06; //the number of bytes of the command without starting byte and ending byte 
  serial_8_byte_TX_payload[3] = command;
  serial_8_byte_TX_payload[4] = 0x00;//0x00 = no feedback, 0x01 = feedback 
  serial_8_byte_TX_payload[5] = data_1;
  serial_8_byte_TX_payload[6] = data_2;
  serial_8_byte_TX_payload[7] = 0xef; //ending byte
  Serial2.write(serial_8_byte_TX_payload, 8);
  Serial.print(&quot;tx:&quot;);
  for( byte b : serial_8_byte_TX_payload )Serial.print( b, HEX );
  Serial.println(&quot; created by chosemaker.com&quot;); 
}
</pre>


<p>Arduino 序列埠監控視窗 輸出如下，我們播放/01/002XXXX.mp3檔案、/01/001XXXX.mp3檔案、/01/003XXXX.mp3檔案、/02/005XXXX.mp3檔案、/02/006XXXX.mp3檔案、調低聲音一階、調高聲音一階、設定音量為30階(預設)、設定音量為5階、設定音量為30階、暫停撥放音樂、繼續撥放音樂、停止撥放音樂、繼續撥放音樂(重新)</p>


<pre class="brush: plain; title: ; notranslate">
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
tx:7EFF6C000EF created by chosemaker.com
tx:7EFF69002EF created by chosemaker.com
tx:7EFF6F012EF created by chosemaker.com
tx:7EFF6F011EF created by chosemaker.com
tx:7EFF6F013EF created by chosemaker.com
tx:7EFF6F025EF created by chosemaker.com
tx:7EFF6F026EF created by chosemaker.com
tx:7EFF65000EF created by chosemaker.com
tx:7EFF64000EF created by chosemaker.com
tx:7EFF66001EEF created by chosemaker.com
tx:7EFF66005EF created by chosemaker.com
tx:7EFF66001EEF created by chosemaker.com
tx:7EFF6E000EF created by chosemaker.com
tx:7EFF6D000EF created by chosemaker.com
tx:7EFF616000EF created by chosemaker.com
tx:7EFF6D000EF created by chosemaker.com
</pre><p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-19%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2319%5D%20Arduino%E6%92%AD%E6%94%BEMicro%20SD%20MP3%2FWAV%E9%9F%B3%E6%A8%82%E8%AA%9E%E9%9F%B3%E6%AA%94%E6%A1%88" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-19%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2319%5D%20Arduino%E6%92%AD%E6%94%BEMicro%20SD%20MP3%2FWAV%E9%9F%B3%E6%A8%82%E8%AA%9E%E9%9F%B3%E6%AA%94%E6%A1%88" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-19%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2319%5D%20Arduino%E6%92%AD%E6%94%BEMicro%20SD%20MP3%2FWAV%E9%9F%B3%E6%A8%82%E8%AA%9E%E9%9F%B3%E6%AA%94%E6%A1%88" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-19%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2319%5D%20Arduino%E6%92%AD%E6%94%BEMicro%20SD%20MP3%2FWAV%E9%9F%B3%E6%A8%82%E8%AA%9E%E9%9F%B3%E6%AA%94%E6%A1%88" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-19%2F&#038;title=%5BESP32%E6%95%99%E5%AD%B8%2319%5D%20Arduino%E6%92%AD%E6%94%BEMicro%20SD%20MP3%2FWAV%E9%9F%B3%E6%A8%82%E8%AA%9E%E9%9F%B3%E6%AA%94%E6%A1%88" data-a2a-url="https://www.chosemaker.com/board/esp32/lesson-19/" data-a2a-title="[ESP32教學#19] Arduino播放Micro SD MP3/WAV音樂語音檔案"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-19/">[ESP32教學#19] Arduino播放Micro SD MP3/WAV音樂語音檔案</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[ESP32教學#18] Arduino透過SPI讀取/刪除/寫入/新增 Micro SD卡檔案</title>
		<link>https://www.chosemaker.com/board/esp32/lesson-18/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Wed, 06 Jul 2022 02:08:44 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=636</guid>

					<description><![CDATA[<p>醬是創客的ESP32教學主題第18篇，以NodeMCU-32S(使用Arduino語言)來實作教學， &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-18/">[ESP32教學#18] Arduino透過SPI讀取/刪除/寫入/新增 Micro SD卡檔案</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的ESP32教學主題第18篇，以NodeMCU-32S(使用Arduino語言)來實作教學，本篇教學Arduino透過SPI介面讀取/刪除/寫入/新增 Micro SD卡檔案，Arduino最多只能支援到32G大小、限定FAT32檔案格式</p>



<p>以下是我們今天的目標</p>



<ul><li>使用ESP32的SPI介面</li><li>計算SD卡大小</li><li>列出檔案列表</li><li>新增/移除資料夾</li><li>將 Hello World! 寫入檔案並讀取</li><li>讀取/刪除/重新命名檔案</li><li>測試檔案是否存在</li><li>計算該槽總空間/使用空間</li></ul>



<p>設備:<br>安信可原廠/副廠NodeMCU-32S #<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>醬是創客Micro SD卡模組 #<a aria-label="undefined (opens in a new tab)" href="https://www.ruten.com.tw/item/show?22227650354020" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a aria-label="undefined (opens in a new tab)" href="https://shopee.tw/-%E9%86%AC%E6%98%AF%E5%89%B5%E5%AE%A2-SPI%E4%BB%8B%E9%9D%A2-Micro-SD%E5%8D%A1%E6%AA%94%E6%A1%88%E8%AE%80%E5%8F%96%E5%AF%AB%E5%85%A5%E6%A8%A1%E7%B5%84-ESP32-Arduino-%E9%99%84%E6%95%99%E5%AD%B8-i.293276804.18220066380?sp_atk=d22c2f3a-91fa-4f0d-ad7f-62084af7a404&amp;xptdk=d22c2f3a-91fa-4f0d-ad7f-62084af7a404" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>Micro SD卡 32GB(FAT32檔案格式)</p>



<p>接線方式:<br>NodeMCU-32S(GPIO5)–SPI訊號–醬是創客Micro SD卡模組(CS)<br>NodeMCU-32S(GPIO18)–SPI訊號–醬是創客Micro SD卡模組(SCK)<br>NodeMCU-32S(GPIO19)–SPI訊號–醬是創客Micro SD卡模組(MISO)<br>NodeMCU-32S(GPIO23)–SPI訊號–醬是創客Micro SD卡模組(MOSI)<br>DC 5V(+)–醬是創客Micro SD卡模組(VCC)<br>DC 0V(-)–醬是創客Micro SD卡模組(GND)</p>



<p>Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)</p>



<figure class="wp-block-image"><img loading="lazy" width="868" height="923" src="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png" alt="" class="wp-image-261" srcset="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png 868w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-282x300.png 282w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-768x817.png 768w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-329x350.png 329w" sizes="(max-width: 868px) 100vw, 868px" /></figure>



<p>Micro SD卡模組專業知識與教學</p>



<p>Arduino現階段因記憶體設計方式，最大只能用到32G的大小，僅建議使用FAT32檔案格式，SPI的方式是讀取寫入Micro SD最好的方式</p>



<p>Arduino 範例程式碼如下</p>


<pre class="brush: cpp; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#include &quot;FS.h&quot;
#include &quot;SD.h&quot;
#include &quot;SPI.h&quot;
#include &quot;WiFi.h&quot;

void setup(){
    Serial.begin(115200);

    //初始化SD卡
    if(!SD.begin()){
        Serial.println(&quot;Card Mount Failed&quot;);
        return;
    }
    uint8_t cardType = SD.cardType();

    if(cardType == CARD_NONE){
        Serial.println(&quot;No SD card attached&quot;);
        return;
    }
    //找出SD卡類型
    Serial.print(&quot;SD Card Type: &quot;);
    if(cardType == CARD_MMC){
        Serial.println(&quot;MMC&quot;);
    } else if(cardType == CARD_SD){
        Serial.println(&quot;SDSC&quot;);
    } else if(cardType == CARD_SDHC){
        Serial.println(&quot;SDHC&quot;);
    } else {
        Serial.println(&quot;UNKNOWN&quot;);
    }
    //計算SD卡大小
    uint64_t cardSize = SD.cardSize() / (1024 * 1024);
    Serial.printf(&quot;SD Card Size: %lluMB\n&quot;, cardSize);

    //列出第1層內的檔案列表
    listDir(SD, &quot;/&quot;, 0);

    //建立一個資料夾mydir
    createDir(SD, &quot;/mydir&quot;);

    //列出第1層內的檔案列表
    listDir(SD, &quot;/&quot;, 0);

    //移除資料夾mydir
    removeDir(SD, &quot;/mydir&quot;);

    //列出第3層內的檔案列表
    listDir(SD, &quot;/&quot;, 2);

    //把 Hello 寫入hello.txt
    writeFile(SD, &quot;/hello.txt&quot;, &quot;Hello &quot;);

    //把 World! 寫入hello.txt
    appendFile(SD, &quot;/hello.txt&quot;, &quot;World!\n&quot;);

    //讀取hello.txt
    readFile(SD, &quot;/hello.txt&quot;);

    //刪除foo.txt
    deleteFile(SD, &quot;/foo.txt&quot;);

    //重新命名hello.txt為foo.txt
    renameFile(SD, &quot;/hello.txt&quot;, &quot;/foo.txt&quot;);

    //讀取foo.txt
    readFile(SD, &quot;/foo.txt&quot;);

    //測試test.txt是否存在
    testFileIO(SD, &quot;/test.txt&quot;);

    //印出該槽總空間大小
    Serial.printf(&quot;Total space: %lluMB\n&quot;, SD.totalBytes() / (1024 * 1024));

    //印出該槽已使用空間大小
    Serial.printf(&quot;Used space: %lluMB\n&quot;, SD.usedBytes() / (1024 * 1024));
}

void loop(){

}

void listDir(fs::FS &amp;amp;fs, const char * dirname, uint8_t levels){
    Serial.printf(&quot;Listing directory: %s\n&quot;, dirname);

    File root = fs.open(dirname);
    if(!root){
        Serial.println(&quot;Failed to open directory&quot;);
        return;
    }
    if(!root.isDirectory()){
        Serial.println(&quot;Not a directory&quot;);
        return;
    }

    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){
            Serial.print(&quot;  DIR : &quot;);
            Serial.println(file.name());
            if(levels){
                listDir(fs, file.name(), levels -1);
            }
        } else {
            Serial.print(&quot;  FILE: &quot;);
            Serial.print(file.name());
            Serial.print(&quot;  SIZE: &quot;);
            Serial.println(file.size());
        }
        file = root.openNextFile();
    }
}

void createDir(fs::FS &amp;amp;fs, const char * path){
    Serial.printf(&quot;Creating Dir: %s\n&quot;, path);
    if(fs.mkdir(path)){
        Serial.println(&quot;Dir created&quot;);
    } else {
        Serial.println(&quot;mkdir failed&quot;);
    }
}

void removeDir(fs::FS &amp;amp;fs, const char * path){
    Serial.printf(&quot;Removing Dir: %s\n&quot;, path);
    if(fs.rmdir(path)){
        Serial.println(&quot;Dir removed&quot;);
    } else {
        Serial.println(&quot;rmdir failed&quot;);
    }
}

void readFile(fs::FS &amp;amp;fs, const char * path){
    Serial.printf(&quot;Reading file: %s\n&quot;, path);

    File file = fs.open(path);
    if(!file){
        Serial.println(&quot;Failed to open file for reading&quot;);
        return;
    }

    Serial.print(&quot;Read from file: &quot;);
    while(file.available()){
        Serial.write(file.read());
    }
    file.close();
}

void writeFile(fs::FS &amp;amp;fs, const char * path, const char * message){
    Serial.printf(&quot;Writing file: %s\n&quot;, path);

    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println(&quot;Failed to open file for writing&quot;);
        return;
    }
    if(file.print(message)){
        Serial.println(&quot;File written&quot;);
    } else {
        Serial.println(&quot;Write failed&quot;);
    }
    file.close();
}

void appendFile(fs::FS &amp;amp;fs, const char * path, const char * message){
    Serial.printf(&quot;Appending to file: %s\n&quot;, path);

    File file = fs.open(path, FILE_APPEND);
    if(!file){
        Serial.println(&quot;Failed to open file for appending&quot;);
        return;
    }
    if(file.print(message)){
        Serial.println(&quot;Message appended&quot;);
    } else {
        Serial.println(&quot;Append failed&quot;);
    }
    file.close();
}

void renameFile(fs::FS &amp;amp;fs, const char * path1, const char * path2){
    Serial.printf(&quot;Renaming file %s to %s\n&quot;, path1, path2);
    if (fs.rename(path1, path2)) {
        Serial.println(&quot;File renamed&quot;);
    } else {
        Serial.println(&quot;Rename failed&quot;);
    }
}

void deleteFile(fs::FS &amp;amp;fs, const char * path){
    Serial.printf(&quot;Deleting file: %s\n&quot;, path);
    if(fs.remove(path)){
        Serial.println(&quot;File deleted&quot;);
    } else {
        Serial.println(&quot;Delete failed&quot;);
    }
}

void testFileIO(fs::FS &amp;amp;fs, const char * path){
    File file = fs.open(path);
    static uint8_t buf[512];
    size_t len = 0;
    uint32_t start = millis();
    uint32_t end = start;
    if(file){
        len = file.size();
        size_t flen = len;
        start = millis();
        while(len){
            size_t toRead = len;
            if(toRead &gt; 512){
                toRead = 512;
            }
            file.read(buf, toRead);
            len -= toRead;
        }
        end = millis() - start;
        Serial.printf(&quot;%u bytes read for %u ms\n&quot;, flen, end);
        file.close();
    } else {
        Serial.println(&quot;Failed to open file for reading&quot;);
    }


    file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println(&quot;Failed to open file for writing&quot;);
        return;
    }

    size_t i;
    start = millis();
    for(i=0; i&lt;2048; i++){
        file.write(buf, 512);
    }
    end = millis() - start;
    Serial.printf(&quot;%u bytes written for %u ms\n&quot;, 2048 * 512, end);
    file.close();
}
</pre>


<p>Arduino 序列埠監控視窗 輸出如下，我們拿已安裝Raspberry Pi(樹莓派)Micro SD卡接到Micro SD模組，且有一個磁碟槽用FAT32檔案格式，所以SD card大小有29007MB，該槽空間只有252MB</p>


<pre class="brush: plain; title: ; notranslate">
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
SD Card Type: SDHC
SD Card Size: 29007MB
Listing directory: /
  DIR : /overlays
  FILE: /bcm2708-rpi-b-plus.dtb  SIZE: 24246
  FILE: /COPYING.linux  SIZE: 18693
  FILE: /LICENCE.broadcom  SIZE: 1594
  FILE: /bcm2708-rpi-zero-w.dtb  SIZE: 24424
  FILE: /bcm2708-rpi-b.dtb  SIZE: 23983
  FILE: /bcm2708-rpi-cm.dtb  SIZE: 23764
  FILE: /issue.txt  SIZE: 145
  FILE: /bcm2708-rpi-zero.dtb  SIZE: 23688
  FILE: /bcm2709-rpi-2-b.dtb  SIZE: 25310
  FILE: /bcm2710-rpi-2-b.dtb  SIZE: 25439
  FILE: /bcm2710-rpi-3-b-plus.dtb  SIZE: 27099
  FILE: /bcm2710-rpi-3-b.dtb  SIZE: 26480
  FILE: /bcm2710-rpi-cm3.dtb  SIZE: 25294
  FILE: /bcm2711-rpi-4-b.dtb  SIZE: 40988
  FILE: /bootcode.bin  SIZE: 52304
  FILE: /cmdline.txt  SIZE: 121
  FILE: /config.txt  SIZE: 1846
  FILE: /fixup.dat  SIZE: 6745
  FILE: /fixup4.dat  SIZE: 6200
  FILE: /fixup4cd.dat  SIZE: 3112
  FILE: /fixup4db.dat  SIZE: 9192
  FILE: /fixup4x.dat  SIZE: 9192
  FILE: /fixup_cd.dat  SIZE: 2656
  FILE: /fixup_db.dat  SIZE: 9817
  FILE: /fixup_x.dat  SIZE: 9819
  FILE: /kernel.img  SIZE: 5142912
  FILE: /kernel7.img  SIZE: 5424376
  FILE: /kernel7l.img  SIZE: 5757200
  FILE: /kernel8.img  SIZE: 13521408
  FILE: /start.elf  SIZE: 2883204
  FILE: /start4.elf  SIZE: 2784800
  FILE: /start4cd.elf  SIZE: 784316
  FILE: /start4db.elf  SIZE: 4593508
  FILE: /start4x.elf  SIZE: 3546468
  FILE: /start_cd.elf  SIZE: 690884
  FILE: /start_db.elf  SIZE: 4859912
  FILE: /start_x.elf  SIZE: 3797384
  DIR : /System Volume Information
Creating Dir: /mydir
Dir created
Listing directory: /
  DIR : /overlays
  FILE: /bcm2708-rpi-b-plus.dtb  SIZE: 24246
  FILE: /COPYING.linux  SIZE: 18693
  FILE: /LICENCE.broadcom  SIZE: 1594
  FILE: /bcm2708-rpi-zero-w.dtb  SIZE: 24424
  FILE: /bcm2708-rpi-b.dtb  SIZE: 23983
  FILE: /bcm2708-rpi-cm.dtb  SIZE: 23764
  FILE: /issue.txt  SIZE: 145
  DIR : /mydir
  FILE: /bcm2708-rpi-zero.dtb  SIZE: 23688
  FILE: /bcm2709-rpi-2-b.dtb  SIZE: 25310
  FILE: /bcm2710-rpi-2-b.dtb  SIZE: 25439
  FILE: /bcm2710-rpi-3-b-plus.dtb  SIZE: 27099
  FILE: /bcm2710-rpi-3-b.dtb  SIZE: 26480
  FILE: /bcm2710-rpi-cm3.dtb  SIZE: 25294
  FILE: /bcm2711-rpi-4-b.dtb  SIZE: 40988
  FILE: /bootcode.bin  SIZE: 52304
  FILE: /cmdline.txt  SIZE: 121
  FILE: /config.txt  SIZE: 1846
  FILE: /fixup.dat  SIZE: 6745
  FILE: /fixup4.dat  SIZE: 6200
  FILE: /fixup4cd.dat  SIZE: 3112
  FILE: /fixup4db.dat  SIZE: 9192
  FILE: /fixup4x.dat  SIZE: 9192
  FILE: /fixup_cd.dat  SIZE: 2656
  FILE: /fixup_db.dat  SIZE: 9817
  FILE: /fixup_x.dat  SIZE: 9819
  FILE: /kernel.img  SIZE: 5142912
  FILE: /kernel7.img  SIZE: 5424376
  FILE: /kernel7l.img  SIZE: 5757200
  FILE: /kernel8.img  SIZE: 13521408
  FILE: /start.elf  SIZE: 2883204
  FILE: /start4.elf  SIZE: 2784800
  FILE: /start4cd.elf  SIZE: 784316
  FILE: /start4db.elf  SIZE: 4593508
  FILE: /start4x.elf  SIZE: 3546468
  FILE: /start_cd.elf  SIZE: 690884
  FILE: /start_db.elf  SIZE: 4859912
  FILE: /start_x.elf  SIZE: 3797384
  DIR : /System Volume Information
Removing Dir: /mydir
Dir removed
Listing directory: /
  DIR : /overlays
Listing directory: /overlays
  FILE: /overlays/adau7002-simple.dtbo  SIZE: 1587
  FILE: /overlays/README  SIZE: 113431
  FILE: /overlays/act-led.dtbo  SIZE: 569
  FILE: /overlays/adau1977-adc.dtbo  SIZE: 1027
  FILE: /overlays/akkordion-iqdacplus.dtbo  SIZE: 1387
  FILE: /overlays/ads1015.dtbo  SIZE: 2425
  FILE: /overlays/ads1115.dtbo  SIZE: 2425
  FILE: /overlays/ads7846.dtbo  SIZE: 2402
  FILE: /overlays/adv7282m.dtbo  SIZE: 1952
  FILE: /overlays/adv728x-m.dtbo  SIZE: 2436
  FILE: /overlays/audioinjector-addons.dtbo  SIZE: 1866
  FILE: /overlays/anyspi.dtbo  SIZE: 3895
  FILE: /overlays/allo-boss-dac-pcm512x-audio.dtbo  SIZE: 1473
  FILE: /overlays/allo-digione.dtbo  SIZE: 1208
  FILE: /overlays/allo-katana-dac-audio.dtbo  SIZE: 1659
  FILE: /overlays/allo-piano-dac-pcm512x-audio.dtbo  SIZE: 1011
  FILE: /overlays/allo-piano-dac-plus-pcm512x-audio.dtbo  SIZE: 1585
  FILE: /overlays/apds9960.dtbo  SIZE: 1338
  FILE: /overlays/applepi-dac.dtbo  SIZE: 1454
  FILE: /overlays/at86rf233.dtbo  SIZE: 1632
  FILE: /overlays/audioinjector-ultra.dtbo  SIZE: 1890
  FILE: /overlays/audioinjector-wm8731-audio.dtbo  SIZE: 787
  FILE: /overlays/audiosense-pi.dtbo  SIZE: 2187
  FILE: /overlays/audremap.dtbo  SIZE: 833
  FILE: /overlays/balena-fin.dtbo  SIZE: 2927
  FILE: /overlays/bmp085_i2c-sensor.dtbo  SIZE: 449
  FILE: /overlays/dht11.dtbo  SIZE: 1019
  FILE: /overlays/dionaudio-loco-v2.dtbo  SIZE: 1027
  FILE: /overlays/dionaudio-loco.dtbo  SIZE: 663
  FILE: /overlays/disable-bt.dtbo  SIZE: 954
  FILE: /overlays/disable-wifi.dtbo  SIZE: 387
  FILE: /overlays/dpi18.dtbo  SIZE: 951
  FILE: /overlays/dpi24.dtbo  SIZE: 975
  FILE: /overlays/draws.dtbo  SIZE: 5869
  FILE: /overlays/dwc-otg.dtbo  SIZE: 293
  FILE: /overlays/dwc2.dtbo  SIZE: 801
  FILE: /overlays/enc28j60-spi2.dtbo  SIZE: 1279
  FILE: /overlays/enc28j60.dtbo  SIZE: 1403
  FILE: /overlays/exc3000.dtbo  SIZE: 1562
  FILE: /overlays/fe-pi-audio.dtbo  SIZE: 1932
  FILE: /overlays/goodix.dtbo  SIZE: 1437
  FILE: /overlays/googlevoicehat-soundcard.dtbo  SIZE: 1259
  FILE: /overlays/gpio-fan.dtbo  SIZE: 1259
  FILE: /overlays/gpio-ir-tx.dtbo  SIZE: 1096
  FILE: /overlays/gpio-ir.dtbo  SIZE: 1212
  FILE: /overlays/gpio-key.dtbo  SIZE: 1373
  FILE: /overlays/gpio-no-bank0-irq.dtbo  SIZE: 274
  FILE: /overlays/gpio-no-irq.dtbo  SIZE: 258
  FILE: /overlays/gpio-poweroff.dtbo  SIZE: 994
  FILE: /overlays/gpio-shutdown.dtbo  SIZE: 1345
  FILE: /overlays/hd44780-lcd.dtbo  SIZE: 1662
  FILE: /overlays/hifiberry-amp.dtbo  SIZE: 779
  FILE: /overlays/hifiberry-dac.dtbo  SIZE: 655
  FILE: /overlays/hifiberry-dacplus.dtbo  SIZE: 1762
  FILE: /overlays/hifiberry-dacplusadc.dtbo  SIZE: 2008
  FILE: /overlays/hifiberry-dacplusadcpro.dtbo  SIZE: 1925
  FILE: /overlays/hifiberry-dacplusdsp.dtbo  SIZE: 699
  FILE: /overlays/hifiberry-dacplushd.dtbo  SIZE: 2011
  FILE: /overlays/hifiberry-digi-pro.dtbo  SIZE: 1125
  FILE: /overlays/hifiberry-digi.dtbo  SIZE: 959
  FILE: /overlays/hy28a.dtbo  SIZE: 2444
  FILE: /overlays/hy28b-2017.dtbo  SIZE: 2893
  FILE: /overlays/hy28b.dtbo  SIZE: 2915
  FILE: /overlays/i-sabre-q2m.dtbo  SIZE: 893
  FILE: /overlays/i2c-bcm2708.dtbo  SIZE: 270
  FILE: /overlays/i2c-gpio.dtbo  SIZE: 1055
  FILE: /overlays/i2c-mux.dtbo  SIZE: 2185
  FILE: /overlays/i2c-pwm-pca9685a.dtbo  SIZE: 648
  FILE: /overlays/i2c-rtc-gpio.dtbo  SIZE: 5249
  FILE: /overlays/i2c-rtc.dtbo  SIZE: 4761
  FILE: /overlays/i2c-sensor.dtbo  SIZE: 5030
  FILE: /overlays/i2c0-bcm2708.dtbo  SIZE: 1674
  FILE: /overlays/i2c0.dtbo  SIZE: 1396
  FILE: /overlays/i2c1-bcm2708.dtbo  SIZE: 1283
  FILE: /overlays/i2c1.dtbo  SIZE: 1004
  FILE: /overlays/i2c3.dtbo  SIZE: 907
  FILE: /overlays/i2c4.dtbo  SIZE: 907
  FILE: /overlays/i2c5.dtbo  SIZE: 911
  FILE: /overlays/i2c6.dtbo  SIZE: 909
  FILE: /overlays/i2s-gpio28-31.dtbo  SIZE: 307
  FILE: /overlays/ilitek251x.dtbo  SIZE: 1373
  FILE: /overlays/imx219.dtbo  SIZE: 3293
  FILE: /overlays/iqaudio-codec.dtbo  SIZE: 895
  FILE: /overlays/iqaudio-dac.dtbo  SIZE: 1272
  FILE: /overlays/iqaudio-dacplus.dtbo  SIZE: 1511
  FILE: /overlays/iqaudio-digi-wm8804-audio.dtbo  SIZE: 1326
  FILE: /overlays/irs1125.dtbo  SIZE: 2433
  FILE: /overlays/jedec-spi-nor.dtbo  SIZE: 5188
  FILE: /overlays/justboom-both.dtbo  SIZE: 1640
  FILE: /overlays/justboom-dac.dtbo  SIZE: 1276
  FILE: /overlays/justboom-digi.dtbo  SIZE: 955
  FILE: /overlays/ltc294x.dtbo  SIZE: 1916
  FILE: /overlays/max98357a.dtbo  SIZE: 1933
  FILE: /overlays/mbed-dac.dtbo  SIZE: 1605
  FILE: /overlays/mcp23017.dtbo  SIZE: 1674
  FILE: /overlays/mcp23s17.dtbo  SIZE: 15205
  FILE: /overlays/mcp2515-can0.dtbo  SIZE: 1797
  FILE: /overlays/mcp2515-can1.dtbo  SIZE: 1797
  FILE: /overlays/mcp3008.dtbo  SIZE: 4213
  FILE: /overlays/mcp3202.dtbo  SIZE: 4213
  FILE: /overlays/mcp342x.dtbo  SIZE: 2854
  FILE: /overlays/media-center.dtbo  SIZE: 3414
  FILE: /overlays/midi-uart0.dtbo  SIZE: 720
  FILE: /overlays/midi-uart1.dtbo  SIZE: 857
  FILE: /overlays/miniuart-bt.dtbo  SIZE: 1446
  FILE: /overlays/mmc.dtbo  SIZE: 1221
  FILE: /overlays/mpu6050.dtbo  SIZE: 796
  FILE: /overlays/mz61581.dtbo  SIZE: 2826
  FILE: /overlays/ov5647.dtbo  SIZE: 2597
  FILE: /overlays/papirus.dtbo  SIZE: 2356
  FILE: /overlays/pi3-act-led.dtbo  SIZE: 569
  FILE: /overlays/pi3-disable-bt.dtbo  SIZE: 954
  FILE: /overlays/pi3-disable-wifi.dtbo  SIZE: 387
  FILE: /overlays/pi3-miniuart-bt.dtbo  SIZE: 1446
  FILE: /overlays/pibell.dtbo  SIZE: 2334
  FILE: /overlays/piglow.dtbo  SIZE: 1594
  FILE: /overlays/piscreen.dtbo  SIZE: 2689
  FILE: /overlays/piscreen2r.dtbo  SIZE: 2593
  FILE: /overlays/pisound.dtbo  SIZE: 2454
  FILE: /overlays/pitft22.dtbo  SIZE: 1520
  FILE: /overlays/pitft28-capacitive.dtbo  SIZE: 2361
  FILE: /overlays/pitft28-resistive.dtbo  SIZE: 2746
  FILE: /overlays/pitft35-resistive.dtbo  SIZE: 2766
  FILE: /overlays/pps-gpio.dtbo  SIZE: 1145
  FILE: /overlays/pwm-2chan.dtbo  SIZE: 1096
  FILE: /overlays/pwm-ir-tx.dtbo  SIZE: 1031
  FILE: /overlays/pwm.dtbo  SIZE: 985
  FILE: /overlays/qca7000.dtbo  SIZE: 1395
  FILE: /overlays/rotary-encoder.dtbo  SIZE: 1922
  FILE: /overlays/rpi-backlight.dtbo  SIZE: 489
  FILE: /overlays/rpi-cirrus-wm5102.dtbo  SIZE: 3542
  FILE: /overlays/rpi-dac.dtbo  SIZE: 643
  FILE: /overlays/rpi-display.dtbo  SIZE: 2574
  FILE: /overlays/rpi-ft5406.dtbo  SIZE: 1018
  FILE: /overlays/rpi-poe.dtbo  SIZE: 1995
  FILE: /overlays/rpi-proto.dtbo  SIZE: 771
  FILE: /overlays/rpi-sense.dtbo  SIZE: 893
  FILE: /overlays/rpi-tv.dtbo  SIZE: 567
  FILE: /overlays/rra-digidac1-wm8741-audio.dtbo  SIZE: 1298
  FILE: /overlays/sc16is750-i2c.dtbo  SIZE: 1219
  FILE: /overlays/sc16is752-i2c.dtbo  SIZE: 1356
  FILE: /overlays/sc16is752-spi1.dtbo  SIZE: 1851
  FILE: /overlays/sdhost.dtbo  SIZE: 968
  FILE: /overlays/sdio.dtbo  SIZE: 1889
  FILE: /overlays/sdtweak.dtbo  SIZE: 804
  FILE: /overlays/smi-dev.dtbo  SIZE: 404
  FILE: /overlays/smi-nand.dtbo  SIZE: 1476
  FILE: /overlays/smi.dtbo  SIZE: 981
  FILE: /overlays/spi-gpio35-39.dtbo  SIZE: 630
  FILE: /overlays/spi-gpio40-45.dtbo  SIZE: 795
  FILE: /overlays/spi-rtc.dtbo  SIZE: 635
  FILE: /overlays/spi0-cs.dtbo  SIZE: 895
  FILE: /overlays/spi0-hw-cs.dtbo  SIZE: 456
  FILE: /overlays/spi1-1cs.dtbo  SIZE: 1523
  FILE: /overlays/spi1-2cs.dtbo  SIZE: 1896
  FILE: /overlays/spi1-3cs.dtbo  SIZE: 2269
  FILE: /overlays/spi2-1cs.dtbo  SIZE: 1523
  FILE: /overlays/spi2-2cs.dtbo  SIZE: 1896
  FILE: /overlays/spi2-3cs.dtbo  SIZE: 2269
  FILE: /overlays/spi3-1cs.dtbo  SIZE: 1289
  FILE: /overlays/spi3-2cs.dtbo  SIZE: 1662
  FILE: /overlays/spi4-1cs.dtbo  SIZE: 1289
  FILE: /overlays/spi4-2cs.dtbo  SIZE: 1662
  FILE: /overlays/spi5-1cs.dtbo  SIZE: 1289
  FILE: /overlays/spi5-2cs.dtbo  SIZE: 1662
  FILE: /overlays/spi6-1cs.dtbo  SIZE: 1289
  FILE: /overlays/spi6-2cs.dtbo  SIZE: 1662
  FILE: /overlays/ssd1306.dtbo  SIZE: 1122
  FILE: /overlays/superaudioboard.dtbo  SIZE: 1968
  FILE: /overlays/sx150x.dtbo  SIZE: 35570
  FILE: /overlays/tc358743-audio.dtbo  SIZE: 1529
  FILE: /overlays/tc358743.dtbo  SIZE: 2465
  FILE: /overlays/tinylcd35.dtbo  SIZE: 4822
  FILE: /overlays/tpm-slb9670.dtbo  SIZE: 779
  FILE: /overlays/uart0.dtbo  SIZE: 928
  FILE: /overlays/uart1.dtbo  SIZE: 980
  FILE: /overlays/uart2.dtbo  SIZE: 589
  FILE: /overlays/uart3.dtbo  SIZE: 589
  FILE: /overlays/uart4.dtbo  SIZE: 589
  FILE: /overlays/uart5.dtbo  SIZE: 589
  FILE: /overlays/udrc.dtbo  SIZE: 3532
  FILE: /overlays/upstream.dtbo  SIZE: 2460
  FILE: /overlays/vc4-fkms-v3d.dtbo  SIZE: 1255
  FILE: /overlays/vc4-kms-kippah-7inch.dtbo  SIZE: 1112
  FILE: /overlays/vc4-kms-v3d.dtbo  SIZE: 2337
  FILE: /overlays/vga666.dtbo  SIZE: 758
  FILE: /overlays/w1-gpio-pullup.dtbo  SIZE: 1171
  FILE: /overlays/w1-gpio.dtbo  SIZE: 1036
  FILE: /overlays/w5500.dtbo  SIZE: 1558
  FILE: /overlays/wittypi.dtbo  SIZE: 1056
  FILE: /bcm2708-rpi-b-plus.dtb  SIZE: 24246
  FILE: /COPYING.linux  SIZE: 18693
  FILE: /LICENCE.broadcom  SIZE: 1594
  FILE: /bcm2708-rpi-zero-w.dtb  SIZE: 24424
  FILE: /bcm2708-rpi-b.dtb  SIZE: 23983
  FILE: /bcm2708-rpi-cm.dtb  SIZE: 23764
  FILE: /issue.txt  SIZE: 145
  FILE: /bcm2708-rpi-zero.dtb  SIZE: 23688
  FILE: /bcm2709-rpi-2-b.dtb  SIZE: 25310
  FILE: /bcm2710-rpi-2-b.dtb  SIZE: 25439
  FILE: /bcm2710-rpi-3-b-plus.dtb  SIZE: 27099
  FILE: /bcm2710-rpi-3-b.dtb  SIZE: 26480
  FILE: /bcm2710-rpi-cm3.dtb  SIZE: 25294
  FILE: /bcm2711-rpi-4-b.dtb  SIZE: 40988
  FILE: /bootcode.bin  SIZE: 52304
  FILE: /cmdline.txt  SIZE: 121
  FILE: /config.txt  SIZE: 1846
  FILE: /fixup.dat  SIZE: 6745
  FILE: /fixup4.dat  SIZE: 6200
  FILE: /fixup4cd.dat  SIZE: 3112
  FILE: /fixup4db.dat  SIZE: 9192
  FILE: /fixup4x.dat  SIZE: 9192
  FILE: /fixup_cd.dat  SIZE: 2656
  FILE: /fixup_db.dat  SIZE: 9817
  FILE: /fixup_x.dat  SIZE: 9819
  FILE: /kernel.img  SIZE: 5142912
  FILE: /kernel7.img  SIZE: 5424376
  FILE: /kernel7l.img  SIZE: 5757200
  FILE: /kernel8.img  SIZE: 13521408
  FILE: /start.elf  SIZE: 2883204
  FILE: /start4.elf  SIZE: 2784800
  FILE: /start4cd.elf  SIZE: 784316
  FILE: /start4db.elf  SIZE: 4593508
  FILE: /start4x.elf  SIZE: 3546468
  FILE: /start_cd.elf  SIZE: 690884
  FILE: /start_db.elf  SIZE: 4859912
  FILE: /start_x.elf  SIZE: 3797384
  DIR : /System Volume Information
Listing directory: /System Volume Information
  FILE: /System Volume Information/WPSettings.dat  SIZE: 12
  FILE: /System Volume Information/IndexerVolumeGuid  SIZE: 76
Writing file: /hello.txt
File written
Appending to file: /hello.txt
Message appended
Reading file: /hello.txt
Read from file: Hello World!
Deleting file: /foo.txt
Delete failed
Renaming file /hello.txt to /foo.txt
File renamed
Reading file: /foo.txt
Read from file: Hello World!
Failed to open file for reading
1048576 bytes written for 4301 ms
Total space: 252MB
Used space: 52MB
</pre><p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-18%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2318%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E8%AE%80%E5%8F%96%2F%E5%88%AA%E9%99%A4%2F%E5%AF%AB%E5%85%A5%2F%E6%96%B0%E5%A2%9E%20Micro%20SD%E5%8D%A1%E6%AA%94%E6%A1%88" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-18%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2318%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E8%AE%80%E5%8F%96%2F%E5%88%AA%E9%99%A4%2F%E5%AF%AB%E5%85%A5%2F%E6%96%B0%E5%A2%9E%20Micro%20SD%E5%8D%A1%E6%AA%94%E6%A1%88" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-18%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2318%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E8%AE%80%E5%8F%96%2F%E5%88%AA%E9%99%A4%2F%E5%AF%AB%E5%85%A5%2F%E6%96%B0%E5%A2%9E%20Micro%20SD%E5%8D%A1%E6%AA%94%E6%A1%88" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-18%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2318%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E8%AE%80%E5%8F%96%2F%E5%88%AA%E9%99%A4%2F%E5%AF%AB%E5%85%A5%2F%E6%96%B0%E5%A2%9E%20Micro%20SD%E5%8D%A1%E6%AA%94%E6%A1%88" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-18%2F&#038;title=%5BESP32%E6%95%99%E5%AD%B8%2318%5D%20Arduino%E9%80%8F%E9%81%8ESPI%E8%AE%80%E5%8F%96%2F%E5%88%AA%E9%99%A4%2F%E5%AF%AB%E5%85%A5%2F%E6%96%B0%E5%A2%9E%20Micro%20SD%E5%8D%A1%E6%AA%94%E6%A1%88" data-a2a-url="https://www.chosemaker.com/board/esp32/lesson-18/" data-a2a-title="[ESP32教學#18] Arduino透過SPI讀取/刪除/寫入/新增 Micro SD卡檔案"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-18/">[ESP32教學#18] Arduino透過SPI讀取/刪除/寫入/新增 Micro SD卡檔案</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[ESP32教學#17] Arduino多工處理使用超聲波模組量測物品距離</title>
		<link>https://www.chosemaker.com/board/esp32/lesson-17/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Wed, 06 Jul 2022 01:39:53 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=634</guid>

					<description><![CDATA[<p>醬是創客的ESP32教學主題第17篇，以NodeMCU-32S(使用Arduino語言)來實作教學， &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-17/">[ESP32教學#17] Arduino多工處理使用超聲波模組量測物品距離</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的ESP32教學主題第17篇，以NodeMCU-32S(使用Arduino語言)來實作教學，本篇教學Arduino多工處理使用超聲波模組量測物品距離，並透過DI接收，一般來說超聲波模組都會和紅外避障模組搭配一起使用這樣精準度會更高</p>



<p>以下是我們今天的目標</p>



<ul><li>使用pulseIn()讀取脈衝訊號，並計算</li><li>多工處理模組訊號</li></ul>



<p>設備:<br>安信可原廠/副廠NodeMCU-32S #<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>醬是創客超聲波模組 #<a aria-label="undefined (opens in a new tab)" href="https://www.ruten.com.tw/item/show?22227650336918" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a aria-label="undefined (opens in a new tab)" href="https://shopee.tw/-%E9%86%AC%E6%98%AF%E5%89%B5%E5%AE%A2-%E8%B6%85%E8%81%B2%E6%B3%A2%E6%A8%A1%E7%B5%84-400CM%E9%87%8F%E6%B8%AC%E7%89%A9%E5%93%81%E8%B7%9D%E9%9B%A2-ESP32-Arduino-%E9%99%84%E6%95%99%E5%AD%B8-i.293276804.19520064557?sp_atk=e45413b6-9fe3-4feb-8cd4-d604c8910505&amp;xptdk=e45413b6-9fe3-4feb-8cd4-d604c8910505" target="_blank" rel="noreferrer noopener">蝦皮購物</a></p>



<p>接線方式:<br>NodeMCU-32S(GPIO16)–脈衝訊號–醬是創客超聲波模組(Trig訊號)<br>NodeMCU-32S(GPIO17)–脈衝訊號–醬是創客超聲波模組(Echo訊號)<br>DC 5V(+)–醬是創客超聲波模組(VCC)<br>DC 0V(-)–醬是創客超聲波模組(GND)</p>



<p>Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)</p>



<figure class="wp-block-image"><img loading="lazy" width="868" height="923" src="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png" alt="" class="wp-image-261" srcset="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png 868w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-282x300.png 282w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-768x817.png 768w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-329x350.png 329w" sizes="(max-width: 868px) 100vw, 868px" /></figure>



<p>超聲波專業知識與教學</p>



<p>當超聲波發送器送出時，如遇到物體，聲波經過物體的反射並使自身的接收器收到聲波<br>收到的聲波會以脈衝訊號的方式傳給ESP32，聲波的優點就是可以量測距離比較遠一些</p>



<p>Arduino 範例程式碼如下</p>


<pre class="brush: cpp; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#include &quot;WiFi.h&quot;
 
//task
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
int interval = 1000;
 
//超音波感應器PIN
int trigPIN=16;
int echoPIN=17;
//超音波感應器
int distance;
long duration;
  
void setup() {
  Serial.begin(115200);
  //定義ESP32輸入輸出
  pinMode(echoPIN, INPUT);
  pinMode(trigPIN, OUTPUT);
}
  
void loop() {
   currentMillis = millis();
      
   if ((unsigned long)(currentMillis - previousMillis) &gt;= interval) {
      digitalWrite(trigPIN, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPIN, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPIN, LOW);
      //醬是創客開始讓ESP32開始讀取脈衝訊號
      duration= pulseIn(echoPIN, HIGH);
      distance= duration/29/2;
      if (duration==0) {
        Serial.println(&quot;No pulse is from sensor&quot;);
      }
      else {
        Serial.print(&quot;Chosemaker's ultrasonic sensor is shown distance:&quot;);
        Serial.print(distance);
        Serial.println(&quot;cm&quot;);
      }

      // previousMillis存入最後執行的時間
      previousMillis = currentMillis;
      Serial.print(&quot;In Current time:&quot;);
      Serial.println(previousMillis);
   }
}
</pre>


<p>Arduino 序列埠監控視窗 輸出如下，我們在大約第4秒時手離超聲波模組距離約172cm，慢慢地靠近超聲波模組</p>


<pre class="brush: plain; title: ; notranslate">
Chosemaker's ultrasonic sensor is shown distance:172cm
In Current time:4000
Chosemaker's ultrasonic sensor is shown distance:29cm
In Current time:5000
Chosemaker's ultrasonic sensor is shown distance:9cm
In Current time:6000
Chosemaker's ultrasonic sensor is shown distance:3cm
In Current time:7000
Chosemaker's ultrasonic sensor is shown distance:2cm
In Current time:8000
Chosemaker's ultrasonic sensor is shown distance:1cm
In Current time:9000
</pre><p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-17%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2317%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E8%B6%85%E8%81%B2%E6%B3%A2%E6%A8%A1%E7%B5%84%E9%87%8F%E6%B8%AC%E7%89%A9%E5%93%81%E8%B7%9D%E9%9B%A2" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-17%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2317%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E8%B6%85%E8%81%B2%E6%B3%A2%E6%A8%A1%E7%B5%84%E9%87%8F%E6%B8%AC%E7%89%A9%E5%93%81%E8%B7%9D%E9%9B%A2" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-17%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2317%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E8%B6%85%E8%81%B2%E6%B3%A2%E6%A8%A1%E7%B5%84%E9%87%8F%E6%B8%AC%E7%89%A9%E5%93%81%E8%B7%9D%E9%9B%A2" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-17%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2317%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E8%B6%85%E8%81%B2%E6%B3%A2%E6%A8%A1%E7%B5%84%E9%87%8F%E6%B8%AC%E7%89%A9%E5%93%81%E8%B7%9D%E9%9B%A2" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-17%2F&#038;title=%5BESP32%E6%95%99%E5%AD%B8%2317%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E8%B6%85%E8%81%B2%E6%B3%A2%E6%A8%A1%E7%B5%84%E9%87%8F%E6%B8%AC%E7%89%A9%E5%93%81%E8%B7%9D%E9%9B%A2" data-a2a-url="https://www.chosemaker.com/board/esp32/lesson-17/" data-a2a-title="[ESP32教學#17] Arduino多工處理使用超聲波模組量測物品距離"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-17/">[ESP32教學#17] Arduino多工處理使用超聲波模組量測物品距離</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[ESP32教學#16] Arduino多工處理使用避障模組透過紅外線偵測物品是否存在</title>
		<link>https://www.chosemaker.com/board/esp32/lesson-16/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Wed, 06 Jul 2022 01:17:59 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=632</guid>

					<description><![CDATA[<p>醬是創客的ESP32教學主題第16篇，以NodeMCU-32S(使用Arduino語言)來實作教學， &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-16/">[ESP32教學#16] Arduino多工處理使用避障模組透過紅外線偵測物品是否存在</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的ESP32教學主題第16篇，以NodeMCU-32S(使用Arduino語言)來實作教學，本篇教學Arduino多工處理使用避障模組透過紅外線偵測物品是否存在，並透過DI接收</p>



<p>以下是我們今天的目標</p>



<ul><li>pinMode須設定為INPUT來啟動DI功能</li><li>多工處理DI訊號</li></ul>



<p>設備:<br>安信可原廠/副廠NodeMCU-32S #<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>醬是創客紅外線避障模組 #<a href="https://www.ruten.com.tw/item/show?22227650302247" target="_blank" aria-label="undefined (opens in a new tab)" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/-%E9%86%AC%E6%98%AF%E5%89%B5%E5%AE%A2-%E7%B4%85%E5%A4%96%E7%B7%9A%E9%81%BF%E9%9A%9C%E6%A8%A1%E7%B5%84-20CM%E5%81%B5%E6%B8%AC%E7%89%A9%E5%93%81-ESP32-Arduino-%E9%99%84%E6%95%99%E5%AD%B8-i.293276804.19220063703?sp_atk=b1e93193-3652-4c04-bf00-03f27f49b3fa&amp;xptdk=b1e93193-3652-4c04-bf00-03f27f49b3fa" target="_blank" aria-label="undefined (opens in a new tab)" rel="noreferrer noopener">蝦皮購物</a></p>



<p>接線方式:<br>NodeMCU-32S(GPIO15)–DO訊號–醬是創客紅外線避障模組(OUT訊號)<br>DC 5V(+)–醬是創客紅外線避障模組(VCC)<br>DC 0V(-)–醬是創客紅外線避障模組(GND)</p>



<p>Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)</p>



<figure class="wp-block-image"><img loading="lazy" width="868" height="923" src="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png" alt="" class="wp-image-261" srcset="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png 868w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-282x300.png 282w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-768x817.png 768w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-329x350.png 329w" sizes="(max-width: 868px) 100vw, 868px" /></figure>



<p>紅外線專業知識與教學</p>



<p>當紅外線發送器送出時，如遇到物體，光經過物體的反射並使自身的接收器收到光<br>收到光時，低電位<br>無收到光時，高電位</p>



<p>Arduino 範例程式碼如下</p>


<pre class="brush: cpp; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#include &quot;WiFi.h&quot;
 
//task
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
int interval = 1000;
boolean GPIO15state = false; 
 
//IR Pin
int inPin = 15;
  
void setup() {
  Serial.begin(115200);
  //IR
  pinMode(inPin, INPUT);
}
  
void loop() {
   currentMillis = millis();
      
   if ((unsigned long)(currentMillis - previousMillis) &gt;= interval) {
      GPIO15state = digitalRead(inPin); 
      if (GPIO15state == HIGH) {
        //高電位時
        Serial.println(&quot;Chosemaker's IR is OFF&quot;);
      }
      else {
        //低電位時
        Serial.println(&quot;Chosemaker's IR is ON&quot;);
      }
      // previousMillis存入最後執行的時間
      previousMillis = currentMillis;
      Serial.print(&quot;In Current time:&quot;);
      Serial.println(previousMillis);
   }
}
</pre>


<p>Arduino 序列埠監控視窗 輸出如下，我們在大約第6秒時放一個物品至醬是創客紅外線避障模組前面，此時紅外線就偵測到有東西並產生變化</p>


<pre class="brush: plain; title: ; notranslate">
Chosemaker's IR is OFF
In Current time:5000
Chosemaker's IR is ON
In Current time:6000
Chosemaker's IR is OFF
In Current time:7000
</pre><p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-16%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2316%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E9%81%BF%E9%9A%9C%E6%A8%A1%E7%B5%84%E9%80%8F%E9%81%8E%E7%B4%85%E5%A4%96%E7%B7%9A%E5%81%B5%E6%B8%AC%E7%89%A9%E5%93%81%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-16%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2316%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E9%81%BF%E9%9A%9C%E6%A8%A1%E7%B5%84%E9%80%8F%E9%81%8E%E7%B4%85%E5%A4%96%E7%B7%9A%E5%81%B5%E6%B8%AC%E7%89%A9%E5%93%81%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-16%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2316%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E9%81%BF%E9%9A%9C%E6%A8%A1%E7%B5%84%E9%80%8F%E9%81%8E%E7%B4%85%E5%A4%96%E7%B7%9A%E5%81%B5%E6%B8%AC%E7%89%A9%E5%93%81%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-16%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2316%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E9%81%BF%E9%9A%9C%E6%A8%A1%E7%B5%84%E9%80%8F%E9%81%8E%E7%B4%85%E5%A4%96%E7%B7%9A%E5%81%B5%E6%B8%AC%E7%89%A9%E5%93%81%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-16%2F&#038;title=%5BESP32%E6%95%99%E5%AD%B8%2316%5D%20Arduino%E5%A4%9A%E5%B7%A5%E8%99%95%E7%90%86%E4%BD%BF%E7%94%A8%E9%81%BF%E9%9A%9C%E6%A8%A1%E7%B5%84%E9%80%8F%E9%81%8E%E7%B4%85%E5%A4%96%E7%B7%9A%E5%81%B5%E6%B8%AC%E7%89%A9%E5%93%81%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8" data-a2a-url="https://www.chosemaker.com/board/esp32/lesson-16/" data-a2a-title="[ESP32教學#16] Arduino多工處理使用避障模組透過紅外線偵測物品是否存在"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-16/">[ESP32教學#16] Arduino多工處理使用避障模組透過紅外線偵測物品是否存在</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[ESP32教學#15] Arduino使用DO連動控制繼電器開啟、關閉110V LED電燈</title>
		<link>https://www.chosemaker.com/board/esp32/lesson-15/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Thu, 22 Oct 2020 06:38:15 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=491</guid>

					<description><![CDATA[<p>醬是創客的ESP32教學主題第15篇，以Ai-Thinker安信可NodeMCU-32S(使用Ard &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-15/">[ESP32教學#15] Arduino使用DO連動控制繼電器開啟、關閉110V LED電燈</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的ESP32教學主題第15篇，以Ai-Thinker安信可NodeMCU-32S(使用Arduino語言)來實作教學，本篇教學Arduino使用DO連動控制訊號線，並透過繼電器開啟、關閉110V LED電燈實作</p>



<p>以下是我們今天的目標</p>



<ul><li>pinMode須設定為OUTPUT來啟動DO功能</li><li>digitalWrite(lampPin, LOW); 代表將lampPin設為低電位</li><li>digitalWrite(lampPin, HIGH); 代表將lampPin設為高電位</li></ul>



<p>設備:<br>安信可NodeMCU-32S #<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>DC5V控制AC110V繼電器 #<a href="https://www.ruten.com.tw/item/show?22042646619226" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/DC-5V%E7%B9%BC%E9%9B%BB%E5%99%A8%E6%8E%A7%E5%88%B6AC110V-220V-%E5%8F%AF%E8%87%AA%E9%81%B8%E9%AB%98%E4%BD%8E%E9%9B%BB%E4%BD%8D%E8%A7%B8%E7%99%BC-%E6%9C%89%E9%9B%BB%E6%BA%90-%E8%A8%8A%E8%99%9F%E7%87%88%E8%99%9F-ESP32-Arduino%E7%94%A8-i.293276804.5356886103" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>110V LED燈</p>



<p>接線方式:<br>NodeMCU-32S(GPIO22)–DO訊號–DC5V控制AC110V繼電器(IN訊號)<br>DC 5V(+)–DC5V控制AC110V繼電器(DC+)<br>DC 0V(-)–DC5V控制AC110V繼電器(DC-)<br>DC5V控制AC110V繼電器(COM)-2.0白扁線-110V市電火線<br>DC5V控制AC110V繼電器(NO)-2.0白扁線-110V LED電燈-110V市電水線<br>DC5V控制AC110V繼電器(H)使用高電位觸發</p>



<p>Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" width="868" height="923" src="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png" alt="" class="wp-image-261" srcset="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png 868w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-282x300.png 282w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-768x817.png 768w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-329x350.png 329w" sizes="(max-width: 868px) 100vw, 868px" /></figure></div>



<p>繼電器專業知識與教學</p>



<p>繼電器線圈無電壓時，NC與COM導通<br>繼電器線圈有電壓時，NO與COM導通<br>COM部分都會接火線或DC的正極<br>NO與NC部分都會接水線或DC的負極</p>



<p>EX: 使用高電位觸發，當訊號線0V時不觸發: NC與COM導通，NO與COM不導通<br>EX: 使用高電位觸發，當訊號線高電位時觸發: NC與COM不導通，NO與COM導通</p>



<p>Arduino 範例程式碼如下</p>


<pre class="brush: arduino; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#include &lt;WiFi.h&gt;

//Output Pin
const int lampPin = 22;

void setup()
{
  Serial.begin(115200);
  //Pin22設定為DO
  pinMode(lampPin, OUTPUT);
  //預設關燈
  digitalWrite(lampPin, LOW); 
}
   
void loop()
{
  //開燈
  delay(10000);
  digitalWrite(lampPin, HIGH);  
  //關燈
  delay(10000);
  digitalWrite(lampPin, LOW);  
}
</pre>


<p>實際行為: 每10秒鐘打開/關閉LED電燈</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-15%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2315%5D%20Arduino%E4%BD%BF%E7%94%A8DO%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89110V%20LED%E9%9B%BB%E7%87%88" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-15%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2315%5D%20Arduino%E4%BD%BF%E7%94%A8DO%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89110V%20LED%E9%9B%BB%E7%87%88" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-15%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2315%5D%20Arduino%E4%BD%BF%E7%94%A8DO%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89110V%20LED%E9%9B%BB%E7%87%88" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-15%2F&amp;linkname=%5BESP32%E6%95%99%E5%AD%B8%2315%5D%20Arduino%E4%BD%BF%E7%94%A8DO%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89110V%20LED%E9%9B%BB%E7%87%88" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Fboard%2Fesp32%2Flesson-15%2F&#038;title=%5BESP32%E6%95%99%E5%AD%B8%2315%5D%20Arduino%E4%BD%BF%E7%94%A8DO%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89110V%20LED%E9%9B%BB%E7%87%88" data-a2a-url="https://www.chosemaker.com/board/esp32/lesson-15/" data-a2a-title="[ESP32教學#15] Arduino使用DO連動控制繼電器開啟、關閉110V LED電燈"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/board/esp32/lesson-15/">[ESP32教學#15] Arduino使用DO連動控制繼電器開啟、關閉110V LED電燈</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[WebThings教學#6] WebThings做出IoT物聯網平台簡易溫溼度與繼電器自動化控制系統實作</title>
		<link>https://www.chosemaker.com/topic/webthings/webthings-6/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Fri, 16 Oct 2020 03:05:40 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[WebThings]]></category>
		<category><![CDATA[實作主題分類]]></category>
		<category><![CDATA[樹莓派]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=477</guid>

					<description><![CDATA[<p>醬是創客的WebThings教學主題第6篇，以NodeMCU-32S(Arduino語言)與Rasp &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/topic/webthings/webthings-6/">[WebThings教學#6] WebThings做出IoT物聯網平台簡易溫溼度與繼電器自動化控制系統實作</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的WebThings教學主題第6篇，以NodeMCU-32S(Arduino語言)與Raspberry Pi樹莓派來實作教學，本篇教學將著重使用ESP32與WebThings做出免費開源IoT物聯網平台連動，並透過平台判斷溫度高低，來控制繼電器開啟、關閉電燈，即可輕鬆達到智慧家庭、智慧農業、智慧工廠等解決方案，更重要的事情是可以透過IoT平台做到控制</p>



<p>本篇文章基於WebThings教學#1~5，請先閱讀完並設定好你的ESP32與樹莓派後再開始進入此篇，首先請先確認儀表板的圖示如下</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="779" height="479" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-1.jpg" alt="" class="wp-image-478" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-1.jpg 779w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-1-300x184.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-1-768x472.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-1-508x312.jpg 508w" sizes="(max-width: 779px) 100vw, 779px" /></figure></div>



<p>在左邊的選單點選規則後，並點右下的+</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="789" height="481" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-2.jpg" alt="" class="wp-image-479" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-2.jpg 789w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-2-300x183.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-2-768x468.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-2-508x310.jpg 508w" sizes="(max-width: 789px) 100vw, 789px" /></figure></div>



<p>我們先建立一個profile叫more33，設定當chosemaker Tempe and Hum的溫度大於33度時，chosemaker Lamp的繼電器會開啟電燈，藍底部分可以拖拉設備至中間，中間的左方為輸入區拉入chosemaker Tempe and Hum並設定Temp>33，中間的右方為輸出區拉入chosemaker Lamp並設定開</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="468" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-3-1024x468.jpg" alt="" class="wp-image-480" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-3-1024x468.jpg 1024w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-3-300x137.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-3-768x351.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-3-508x232.jpg 508w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-3.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="483" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-4-1024x483.jpg" alt="" class="wp-image-481" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-4-1024x483.jpg 1024w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-4-300x142.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-4-768x362.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-4-508x240.jpg 508w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-4.jpg 1278w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure></div>



<p>我們再建立一個profile叫less33，設定當chosemaker Tempe and Hum的溫度小於33度時，chosemaker Lamp的繼電器會關閉電燈，藍底部分可以拖拉設備至中間，中間的左方為輸入區拉入chosemaker Tempe and Hum並設定Temp&lt;33，中間的右方為輸出區拉入chosemaker Lamp並設定關</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="470" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-5-1024x470.jpg" alt="" class="wp-image-482" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-5-1024x470.jpg 1024w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-5-300x138.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-5-768x353.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-5-508x233.jpg 508w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-6-5.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure></div>



<p>這時候系統就可以做到自動化控制，以33度C為分隔，過高則開燈，過低則關燈，可以看到下方還有一個Clock的功能，它也可以拖入來設定某段時間才允許觸發條件</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-6%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%236%5D%20WebThings%E5%81%9A%E5%87%BAIoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E7%B0%A1%E6%98%93%E6%BA%AB%E6%BA%BC%E5%BA%A6%E8%88%87%E7%B9%BC%E9%9B%BB%E5%99%A8%E8%87%AA%E5%8B%95%E5%8C%96%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%B5%B1%E5%AF%A6%E4%BD%9C" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-6%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%236%5D%20WebThings%E5%81%9A%E5%87%BAIoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E7%B0%A1%E6%98%93%E6%BA%AB%E6%BA%BC%E5%BA%A6%E8%88%87%E7%B9%BC%E9%9B%BB%E5%99%A8%E8%87%AA%E5%8B%95%E5%8C%96%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%B5%B1%E5%AF%A6%E4%BD%9C" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-6%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%236%5D%20WebThings%E5%81%9A%E5%87%BAIoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E7%B0%A1%E6%98%93%E6%BA%AB%E6%BA%BC%E5%BA%A6%E8%88%87%E7%B9%BC%E9%9B%BB%E5%99%A8%E8%87%AA%E5%8B%95%E5%8C%96%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%B5%B1%E5%AF%A6%E4%BD%9C" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-6%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%236%5D%20WebThings%E5%81%9A%E5%87%BAIoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E7%B0%A1%E6%98%93%E6%BA%AB%E6%BA%BC%E5%BA%A6%E8%88%87%E7%B9%BC%E9%9B%BB%E5%99%A8%E8%87%AA%E5%8B%95%E5%8C%96%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%B5%B1%E5%AF%A6%E4%BD%9C" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-6%2F&#038;title=%5BWebThings%E6%95%99%E5%AD%B8%236%5D%20WebThings%E5%81%9A%E5%87%BAIoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E7%B0%A1%E6%98%93%E6%BA%AB%E6%BA%BC%E5%BA%A6%E8%88%87%E7%B9%BC%E9%9B%BB%E5%99%A8%E8%87%AA%E5%8B%95%E5%8C%96%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%B5%B1%E5%AF%A6%E4%BD%9C" data-a2a-url="https://www.chosemaker.com/topic/webthings/webthings-6/" data-a2a-title="[WebThings教學#6] WebThings做出IoT物聯網平台簡易溫溼度與繼電器自動化控制系統實作"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/topic/webthings/webthings-6/">[WebThings教學#6] WebThings做出IoT物聯網平台簡易溫溼度與繼電器自動化控制系統實作</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[WebThings教學#5] WebThings IoT物聯網平台連結ESP32 Arduino開發板抓取溫度、濕度</title>
		<link>https://www.chosemaker.com/topic/webthings/webthings-5/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Fri, 16 Oct 2020 02:03:28 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[WebThings]]></category>
		<category><![CDATA[實作主題分類]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=472</guid>

					<description><![CDATA[<p>醬是創客的WebThings教學主題第5篇，以WebThings搭配Ai-Thinker安信可Nod &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/topic/webthings/webthings-5/">[WebThings教學#5] WebThings IoT物聯網平台連結ESP32 Arduino開發板抓取溫度、濕度</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的WebThings教學主題第5篇，以WebThings搭配Ai-Thinker安信可NodeMCU-32S(Arduino語言)來實作教學，本篇教學將著重使用ESP32與Arduino WebThings Framework整合，並透過ESP32抓取TH485 modbus溫濕度感應器拋往WebThings Gateway，達到Client拋送溫度與濕度資訊到Server功能</p>



<p>以下是我們今天的目標</p>



<ul><li>定義溫度與濕度感應器的Types(TemperatureSensor, HumiditySensor)</li><li>了解WebThingAdapter的更新方法</li><li>ThingDevice定義該設備定義(開關、溫度、濕度……等)、描述、名稱、網址ID</li><li>ThingProperty定義多個Sensor屬性(TemperatureProperty,HumidityProperty)</li><li>ThingPropertyValue定義為Sensor數值</li></ul>



<p>設備:<br>樹莓派4B #<a href="https://www.ruten.com.tw/item/show?22051318422459" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/%E6%A8%B9%E8%8E%93%E6%B4%BE4B-%E8%8B%B1%E5%9C%8B%E8%A3%BD%E5%8E%9F%E5%BB%A0%E9%96%8B%E7%99%BC%E6%9D%BF-4G-8G-Raspberry-Pi-4B-AI%E5%BD%B1%E5%83%8F%E8%BE%A8%E8%AD%98-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%B0%88%E7%94%A8-Linux-i.293276804.5269190409" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>安信可NodeMCU-32S #<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>TTL485轉換板 #<a href="https://www.ruten.com.tw/item/show?22031984537655" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/TTL-UART%E8%BD%89RS485-%E5%BA%8F%E5%88%97%E5%9F%A0Serial-ESD-TVS%E9%98%B2%E8%AD%B7-%E5%90%AB%E9%9B%BB%E6%BA%90%E7%87%88-TX-RX%E7%87%88-ESP32-Arduino-i.293276804.3446122089" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>TH485溫溼度板 #<a href="https://www.ruten.com.tw/item/show?22001180296090" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/%E6%BA%AB%E6%BA%BC%E5%BA%A6-%E6%84%9F%E6%B8%AC%E5%99%A8-Modbus-RTU-%E6%BA%AB%E5%BA%A6-%E6%BF%95%E5%BA%A6-Sensor-%E7%8D%A8%E5%AE%B6%E9%80%81C-.NET-WPF%E5%8E%9F%E5%A7%8B%E7%A2%BC-%E4%BA%8C%E6%AC%A1%E9%96%8B%E7%99%BC-TH485-i.293276804.7746385632" target="_blank" rel="noreferrer noopener">蝦皮購物</a></p>



<p>接線方式:<br>NodeMCU-32S(3.3V或5V)—-TTL485轉換板(VCC)<br>NodeMCU-32S(GND)—-TTL485轉換板(GND)<br>NodeMCU-32S(GPIO17設為TX2)–TTL訊號–TTL485轉換板(RXD)<br>NodeMCU-32S(GPIO16設為RX2)–TTL訊號–TTL485轉換板(TXD)<br>TTL485轉換板(A/D+)–線–TH485(A)<br>TTL485轉換板(B/D-)–線–TH485(B)<br>DC 12V(+)–TH485(+)<br>DC 0V(-)–TH485(-)</p>



<p>TH485溫溼度設備Modbus RTU規格:<br>溫度: InputRegisters,0x0001,0.1C<br>濕度: InputRegisters,0x0002,0.1H<br>Buad Rate: 9600,N,8,1<br>Slave ID: 1</p>



<p>Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)</p>



<figure class="wp-block-image"><img loading="lazy" width="868" height="923" src="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png" alt="" class="wp-image-261" srcset="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png 868w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-282x300.png 282w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-768x817.png 768w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-329x350.png 329w" sizes="(max-width: 868px) 100vw, 868px" /></figure>



<p>Arduino 範例程式碼如下</p>


<pre class="brush: arduino; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#define LARGE_JSON_BUFFERS 1
#define RXD2 16
#define TXD2 17
#include &lt;WiFi.h&gt;
#include &lt;Thing.h&gt;
#include &lt;WebThingAdapter.h&gt;
#include &lt;ModbusMaster.h&gt;

//SSID/PW
const char *ssid = &quot;iot&quot;;
const char *password = &quot;chosemaker&quot;;
// ModbusMaster object
ModbusMaster node;
uint8_t result;
uint16_t data[2];
//WebThings
WebThingAdapter *adapter;
const char *temphumTypes[] = {&quot;TemperatureSensor&quot;, &quot;HumiditySensor&quot;, nullptr};
ThingDevice temphum(&quot;chosemaker-temp-hum-1&quot;, &quot;&quot;, temphumTypes);
//溫度
ThingProperty sensorTemp(&quot;temp&quot;, &quot;&quot;, NUMBER, &quot;TemperatureProperty&quot;);
ThingPropertyValue tempVal;
//濕度
ThingProperty sensorHumd(&quot;hum&quot;, &quot;&quot;, NUMBER, &quot;HumidityProperty&quot;);
ThingPropertyValue humVal;

void setup()
{
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
  // Modbus slave ID 1 使用 Serial2
  node.begin(1, Serial2);
  Serial.begin(115200);
  
  WiFi.begin(ssid, password);    
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(&quot;.&quot;);
  }

  Serial.println(&quot;&quot;);
  Serial.print(&quot;Connected to &quot;);
  Serial.println(ssid);
  Serial.print(&quot;IP address: &quot;);
  Serial.println(WiFi.localIP());
  //WebThings  
  adapter = new WebThingAdapter(&quot;temp-hum&quot;, WiFi.localIP());
  temphum.title = &quot;chosemaker Tempe and Hum&quot;;
  temphum.description = &quot;chosemaker's Temperature and Humidity&quot;;
  //溫度
  sensorTemp.title = &quot;Temp&quot;;
  sensorTemp.unit = &quot;degree celsius&quot;;
  sensorTemp.readOnly = &quot;true&quot;;
  temphum.addProperty(&amp;amp;sensorTemp);
  //濕度 
  sensorHumd.title = &quot;Hum&quot;;
  sensorHumd.unit = &quot;percent&quot;;
  sensorHumd.readOnly = &quot;true&quot;;
  temphum.addProperty(&amp;amp;sensorHumd);
  //WebThingAdapter
  adapter-&gt;addDevice(&amp;amp;temphum);
  adapter-&gt;begin();

  Serial.println(&quot;HTTP server started&quot;);
  Serial.print(&quot;http://&quot;);
  Serial.print(WiFi.localIP());
  Serial.print(&quot;/things/&quot;);
  Serial.println(temphum.id);
}
  
void loop()
{
  //WebThingAdapter
  adapter-&gt;update();

  //InputRegister 0x0001~0x0002
  result = node.readInputRegisters(0x0001, 2);   
  if (result == node.ku8MBSuccess)
  {
    //溫度InputRegister 0x0001
    data[0] = node.getResponseBuffer(0);
    tempVal.number = data[0] * 0.1;
    //濕度InputRegister 0x0002
    data[1] = node.getResponseBuffer(1);
    humVal.number = data[1] * 0.1;
  }
  //Set Value
  sensorTemp.setValue(tempVal);
  sensorHumd.setValue(humVal);

  delay(2000);
}
</pre>


<p>Arduino 序列埠監控視窗 輸出如下</p>


<pre class="brush: plain; title: ; notranslate">
..
Connected to iot
IP address: 192.168.2.179
MDNS responder started
HTTP server started
http://192.168.2.179/things/chosemaker-temp-hum-1
</pre>


<p>我們打開登入樹莓派的WebThings Gateway，在儀錶板的右下角點擊”+”並於”輸入web thing網址”輸入http://192.168.2.179/things/chosemaker-temp-hum-1，並儲存</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" width="689" height="336" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings2-1.jpg" alt="" class="wp-image-450" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings2-1.jpg 689w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings2-1-300x146.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings2-1-508x248.jpg 508w" sizes="(max-width: 689px) 100vw, 689px" /></figure></div>



<p>此時我們也可以連入http://192.168.2.179/things/chosemaker-temp-hum-1 ，可以看到這是一個JSON文件，Server於第一次取得設定檔時會連到Client抓取JSON回去對應欄位</p>


<pre class="brush: plain; title: ; notranslate">
{&quot;id&quot;:&quot;chosemaker-temp-hum-1&quot;,&quot;title&quot;:&quot;chosemaker Tempe and Hum&quot;,&quot;@context&quot;:&quot;https://iot.mozilla.org/schemas&quot;,&quot;description&quot;:&quot;A web chosemaker Temperature and Humidity&quot;,&quot;base&quot;:&quot;http://192.168.2.179/&quot;,&quot;securityDefinitions&quot;:{&quot;nosec_sc&quot;:{&quot;scheme&quot;:&quot;nosec&quot;}},&quot;security&quot;:&quot;nosec_sc&quot;,&quot;@type&quot;:[&quot;TemperatureSensor&quot;,&quot;HumiditySensor&quot;],&quot;links&quot;:[{&quot;rel&quot;:&quot;properties&quot;,&quot;href&quot;:&quot;/things/chosemaker-temp-hum-1/properties&quot;},{&quot;rel&quot;:&quot;actions&quot;,&quot;href&quot;:&quot;/things/chosemaker-temp-hum-1/actions&quot;},{&quot;rel&quot;:&quot;events&quot;,&quot;href&quot;:&quot;/things/chosemaker-temp-hum-1/events&quot;},{&quot;rel&quot;:&quot;alternate&quot;,&quot;href&quot;:&quot;ws://192.168.2.179/things/chosemaker-temp-hum-1&quot;}],&quot;properties&quot;:{&quot;hum&quot;:{&quot;type&quot;:&quot;number&quot;,&quot;readOnly&quot;:true,&quot;unit&quot;:&quot;percent&quot;,&quot;title&quot;:&quot;Hum&quot;,&quot;@type&quot;:&quot;HumidityProperty&quot;,&quot;links&quot;:[{&quot;href&quot;:&quot;/things/chosemaker-temp-hum-1/properties/hum&quot;}]},&quot;temp&quot;:{&quot;type&quot;:&quot;number&quot;,&quot;readOnly&quot;:true,&quot;unit&quot;:&quot;degree celsius&quot;,&quot;title&quot;:&quot;Temp&quot;,&quot;@type&quot;:&quot;TemperatureProperty&quot;,&quot;links&quot;:[{&quot;href&quot;:&quot;/things/chosemaker-temp-hum-1/properties/temp&quot;}]}}}
</pre>


<p>在儀錶板的位置即可以看到加入的chosemaker Tempe and Hum設備，可以點擊該右上角小圖式打開可以看到溫度與濕度，我們預設讓溫度顯示排在最前面</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="788" height="479" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-1.jpg" alt="" class="wp-image-473" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-1.jpg 788w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-1-300x182.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-1-768x467.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-1-508x309.jpg 508w" sizes="(max-width: 788px) 100vw, 788px" /></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="789" height="479" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-2.jpg" alt="" class="wp-image-474" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-2.jpg 789w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-2-300x182.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-2-768x466.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-5-2-508x308.jpg 508w" sizes="(max-width: 789px) 100vw, 789px" /></figure></div>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-5%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%235%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E9%80%A3%E7%B5%90ESP32%20Arduino%E9%96%8B%E7%99%BC%E6%9D%BF%E6%8A%93%E5%8F%96%E6%BA%AB%E5%BA%A6%E3%80%81%E6%BF%95%E5%BA%A6" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-5%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%235%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E9%80%A3%E7%B5%90ESP32%20Arduino%E9%96%8B%E7%99%BC%E6%9D%BF%E6%8A%93%E5%8F%96%E6%BA%AB%E5%BA%A6%E3%80%81%E6%BF%95%E5%BA%A6" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-5%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%235%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E9%80%A3%E7%B5%90ESP32%20Arduino%E9%96%8B%E7%99%BC%E6%9D%BF%E6%8A%93%E5%8F%96%E6%BA%AB%E5%BA%A6%E3%80%81%E6%BF%95%E5%BA%A6" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-5%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%235%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E9%80%A3%E7%B5%90ESP32%20Arduino%E9%96%8B%E7%99%BC%E6%9D%BF%E6%8A%93%E5%8F%96%E6%BA%AB%E5%BA%A6%E3%80%81%E6%BF%95%E5%BA%A6" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-5%2F&#038;title=%5BWebThings%E6%95%99%E5%AD%B8%235%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E9%80%A3%E7%B5%90ESP32%20Arduino%E9%96%8B%E7%99%BC%E6%9D%BF%E6%8A%93%E5%8F%96%E6%BA%AB%E5%BA%A6%E3%80%81%E6%BF%95%E5%BA%A6" data-a2a-url="https://www.chosemaker.com/topic/webthings/webthings-5/" data-a2a-title="[WebThings教學#5] WebThings IoT物聯網平台連結ESP32 Arduino開發板抓取溫度、濕度"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/topic/webthings/webthings-5/">[WebThings教學#5] WebThings IoT物聯網平台連結ESP32 Arduino開發板抓取溫度、濕度</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[WebThings教學#4] WebThings IoT物聯網平台與ESP32 Arduino連動控制繼電器開啟、關閉電燈</title>
		<link>https://www.chosemaker.com/topic/webthings/webthings-4/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Thu, 15 Oct 2020 02:13:24 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[WebThings]]></category>
		<category><![CDATA[實作主題分類]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=463</guid>

					<description><![CDATA[<p>醬是創客的WebThings教學主題第4篇，以WebThings搭配Ai-Thinker安信可Nod &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/topic/webthings/webthings-4/">[WebThings教學#4] WebThings IoT物聯網平台與ESP32 Arduino連動控制繼電器開啟、關閉電燈</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的WebThings教學主題第4篇，以WebThings搭配Ai-Thinker安信可NodeMCU-32S(Arduino語言)來實作教學，本篇教學將著重使用ESP32與WebThings做出免費開源IoT物聯網平台連動，並透過平台控制繼電器開啟、關閉電燈，達到Server控制Client功能</p>



<p>以下是我們今天的目標</p>



<ul><li>使用WebThingAdapter.h與Thing.h</li><li>了解WebThingAdapter的更新方法</li><li>ThingDevice定義該設備定義(開關、溫度、濕度&#8230;&#8230;等)、描述、名稱、網址ID</li><li>ThingProperty定義多個Sensor屬性</li></ul>



<p>設備:<br>樹莓派4B #<a href="https://www.ruten.com.tw/item/show?22051318422459" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/%E6%A8%B9%E8%8E%93%E6%B4%BE4B-%E8%8B%B1%E5%9C%8B%E8%A3%BD%E5%8E%9F%E5%BB%A0%E9%96%8B%E7%99%BC%E6%9D%BF-4G-8G-Raspberry-Pi-4B-AI%E5%BD%B1%E5%83%8F%E8%BE%A8%E8%AD%98-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%B0%88%E7%94%A8-Linux-i.293276804.5269190409" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>安信可NodeMCU-32S&nbsp;#<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a>&nbsp;#<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>DC5V控制AC110V繼電器&nbsp;#<a href="https://www.ruten.com.tw/item/show?22042646619226" target="_blank" rel="noreferrer noopener">露天拍賣</a>&nbsp;#<a href="https://shopee.tw/DC-5V%E7%B9%BC%E9%9B%BB%E5%99%A8%E6%8E%A7%E5%88%B6AC110V-220V-%E5%8F%AF%E8%87%AA%E9%81%B8%E9%AB%98%E4%BD%8E%E9%9B%BB%E4%BD%8D%E8%A7%B8%E7%99%BC-%E6%9C%89%E9%9B%BB%E6%BA%90-%E8%A8%8A%E8%99%9F%E7%87%88%E8%99%9F-ESP32-Arduino%E7%94%A8-i.293276804.5356886103" target="_blank" rel="noreferrer noopener">蝦皮購物</a><br>110V LED燈</p>



<p>接線方式:<br>NodeMCU-32S(GPIO22)–DO訊號–DC5V控制AC110V繼電器(IN訊號)<br>DC 5V(+)–DC5V控制AC110V繼電器(DC+)<br>DC 0V(-)–DC5V控制AC110V繼電器(DC-)<br>DC5V控制AC110V繼電器(COM)-2.0白扁線-110V市電火線<br>DC5V控制AC110V繼電器(NO)-2.0白扁線-110V LED電燈-110V市電水線<br>DC5V控制AC110V繼電器(H)使用高電位觸發</p>



<p>Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" width="868" height="923" src="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png" alt="" class="wp-image-261" srcset="https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin.png 868w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-282x300.png 282w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-768x817.png 768w, https://www.chosemaker.com/wp-content/uploads/2020/07/nodemcu_32s_pin-329x350.png 329w" sizes="(max-width: 868px) 100vw, 868px" /></figure></div>



<p>Arduino 範例程式碼如下<br><strong>請注意: WordPress的bug，它把&amp;轉換成HTML的&amp;amp; <br>因此內文中有出現&amp;amp;請自行轉成&amp;</strong></p>


<pre class="brush: arduino; title: ; notranslate">
//醬是創客 開發實作的好夥伴
#define LARGE_JSON_BUFFERS 1
#include &lt;WiFi.h&gt;
#include &lt;Arduino.h&gt;
#include &lt;Thing.h&gt;
#include &lt;WebThingAdapter.h&gt;
//SSID/PW/Pin
const char *ssid = &quot;iot&quot;;
const char *password = &quot;chosemaker&quot;;
const int lampPin = 22;
//WebThings
WebThingAdapter *adapter;
const char *lampTypes[] = {&quot;OnOffSwitch&quot;, nullptr};
ThingDevice lamp(&quot;chosemaker-lamp-1&quot;, &quot;chosemaker Lamp&quot;, lampTypes);
ThingProperty lampOn(&quot;on&quot;, &quot;Whether the lamp is turned on&quot;, BOOLEAN,&quot;OnOffProperty&quot;);
bool lastOn = true;

void setup()
{
  Serial.begin(115200);
  
  pinMode(lampPin, OUTPUT);
  digitalWrite(lampPin, HIGH);
  WiFi.begin(ssid, password);    
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(&quot;.&quot;);
  }

  Serial.println(&quot;&quot;);
  Serial.print(&quot;Connected to &quot;);
  Serial.println(ssid);
  Serial.print(&quot;IP address: &quot;);
  Serial.println(WiFi.localIP());
  
  adapter = new WebThingAdapter(&quot;led-lamp&quot;, WiFi.localIP());
  lamp.description = &quot;IoT chosemaker lamp&quot;;
  lampOn.title = &quot;On/Off&quot;;
  lamp.addProperty(&amp;amp;lampOn);
  adapter-&gt;addDevice(&amp;amp;lamp);
  adapter-&gt;begin();

  Serial.println(&quot;HTTP server started&quot;);
  Serial.print(&quot;http://&quot;);
  Serial.print(WiFi.localIP());
  Serial.print(&quot;/things/&quot;);
  Serial.println(lamp.id);

  // set initial values
  ThingPropertyValue initialOn = {.boolean = true};
  lampOn.setValue(initialOn);
  (void)lampOn.changedValueOrNull();

}
  
void loop()
{
  adapter-&gt;update();
  bool on = lampOn.getValue().boolean;
  if (on) {
    digitalWrite(lampPin, HIGH);    
  } else {
    digitalWrite(lampPin, LOW);
  }

  if (lastOn != on) {
    lastOn = on;
  }
  delay(1000);
}
</pre>


<p>Arduino 序列埠監控視窗 輸出如下</p>


<pre class="brush: plain; title: ; notranslate">
Connected to iot
IP address: 192.168.2.188
MDNS responder started
HTTP server started
http://192.168.2.188/things/chosemaker-lamp-1

</pre>


<p>我們打開登入樹莓派的WebThings Gateway，在儀錶板的右下角點擊&#8221;+&#8221;並於&#8221;輸入web thing網址&#8221;輸入http://192.168.2.188/things/chosemaker-lamp-1，並儲存</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="689" height="336" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings2-1.jpg" alt="" class="wp-image-450" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings2-1.jpg 689w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings2-1-300x146.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings2-1-508x248.jpg 508w" sizes="(max-width: 689px) 100vw, 689px" /></figure></div>



<p>此時我們也可以連入http://192.168.2.188/things/chosemaker-lamp-1 ，可以看到這是一個JSON文件，Server於第一次取得設定檔時會連到Client抓取JSON回去對應欄位</p>


<pre class="brush: plain; title: ; notranslate">
{&quot;id&quot;:&quot;chosemaker-lamp-1&quot;,&quot;title&quot;:&quot;chosemaker Lamp&quot;,&quot;@context&quot;:&quot;https://iot.mozilla.org/schemas&quot;,&quot;description&quot;:&quot;IoT chosemaker lamp&quot;,&quot;base&quot;:&quot;http://192.168.2.188/&quot;,&quot;securityDefinitions&quot;:{&quot;nosec_sc&quot;:{&quot;scheme&quot;:&quot;nosec&quot;}},&quot;security&quot;:&quot;nosec_sc&quot;,&quot;@type&quot;:[&quot;OnOffSwitch&quot;],&quot;links&quot;:[{&quot;rel&quot;:&quot;properties&quot;,&quot;href&quot;:&quot;/things/chosemaker-lamp-1/properties&quot;},{&quot;rel&quot;:&quot;actions&quot;,&quot;href&quot;:&quot;/things/chosemaker-lamp-1/actions&quot;},{&quot;rel&quot;:&quot;events&quot;,&quot;href&quot;:&quot;/things/chosemaker-lamp-1/events&quot;},{&quot;rel&quot;:&quot;alternate&quot;,&quot;href&quot;:&quot;ws://192.168.2.188/things/chosemaker-lamp-1&quot;}],&quot;properties&quot;:{&quot;on&quot;:{&quot;type&quot;:&quot;boolean&quot;,&quot;title&quot;:&quot;On/Off&quot;,&quot;description&quot;:&quot;Whether the lamp is turned on&quot;,&quot;@type&quot;:&quot;OnOffProperty&quot;,&quot;links&quot;:[{&quot;href&quot;:&quot;/things/chosemaker-lamp-1/properties/on&quot;}]}}}
</pre>


<p>在儀錶板的位置即可以看到加入的chosemaker Lamp設備，可以點擊該圖式打開和關閉電燈開關</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="472" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-1-1024x472.jpg" alt="" class="wp-image-466" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-1-1024x472.jpg 1024w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-1-300x138.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-1-768x354.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-1-508x234.jpg 508w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-1.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="473" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-2-1024x473.jpg" alt="" class="wp-image-467" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-2-1024x473.jpg 1024w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-2-300x138.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-2-768x354.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-2-508x234.jpg 508w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-4-2.jpg 1272w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure></div>



<p></p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-4%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%234%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E8%88%87ESP32%20Arduino%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89%E9%9B%BB%E7%87%88" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-4%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%234%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E8%88%87ESP32%20Arduino%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89%E9%9B%BB%E7%87%88" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-4%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%234%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E8%88%87ESP32%20Arduino%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89%E9%9B%BB%E7%87%88" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-4%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%234%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E8%88%87ESP32%20Arduino%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89%E9%9B%BB%E7%87%88" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-4%2F&#038;title=%5BWebThings%E6%95%99%E5%AD%B8%234%5D%20WebThings%20IoT%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%E8%88%87ESP32%20Arduino%E9%80%A3%E5%8B%95%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8%E9%96%8B%E5%95%9F%E3%80%81%E9%97%9C%E9%96%89%E9%9B%BB%E7%87%88" data-a2a-url="https://www.chosemaker.com/topic/webthings/webthings-4/" data-a2a-title="[WebThings教學#4] WebThings IoT物聯網平台與ESP32 Arduino連動控制繼電器開啟、關閉電燈"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/topic/webthings/webthings-4/">[WebThings教學#4] WebThings IoT物聯網平台與ESP32 Arduino連動控制繼電器開啟、關閉電燈</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[WebThings教學#3] WebThings Framework的Arduino Libraries套件安裝與環境設置</title>
		<link>https://www.chosemaker.com/topic/webthings/webthings-3/</link>
		
		<dc:creator><![CDATA[pyclifecom]]></dc:creator>
		<pubDate>Tue, 13 Oct 2020 06:58:25 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[WebThings]]></category>
		<category><![CDATA[實作主題分類]]></category>
		<category><![CDATA[程式語言分類]]></category>
		<category><![CDATA[開發板分類]]></category>
		<guid isPermaLink="false">https://www.chosemaker.com/?p=457</guid>

					<description><![CDATA[<p>醬是創客的WebThings教學主題第3篇，以WebThings搭配Ai-Thinker安信可Nod &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/topic/webthings/webthings-3/">[WebThings教學#3] WebThings Framework的Arduino Libraries套件安裝與環境設置</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>醬是創客的WebThings教學主題第3篇，以WebThings搭配Ai-Thinker安信可NodeMCU-32S(使用Arduino語言)來實作教學，本篇教學將著重WebThings Framework的Arduino Libraries套件安裝與環境設置，並需要安裝webthing-arduino、ESPAsyncWebServer、AsyncTCP套件</p>



<p>以下是我們今天的目標</p>



<ul><li>安裝套件webthing-arduino</li><li>安裝套件ESPAsyncWebServer</li><li>安裝套件AsyncTCP</li><li>找出電腦的Arduino對應Libraries路徑</li><li>Github下載套件</li></ul>



<p>設備:<br>安信可NodeMCU-32S #<a href="https://www.ruten.com.tw/item/show?22030930136256" target="_blank" rel="noreferrer noopener">露天拍賣</a> #<a href="https://shopee.tw/ESP32-S-NodeMCU-32S-WiFi-%E8%97%8D%E8%8A%BDBLE-%E9%99%84Arduino%E6%95%99%E5%AD%B8-%E5%AE%89%E4%BF%A1%E5%8F%AF%E7%89%A9%E8%81%AF%E7%B6%B2IoT-Wi-Fi%E9%96%8B%E7%99%BC%E6%9D%BF-i.293276804.6546028316" target="_blank" rel="noreferrer noopener">蝦皮購物</a></p>



<p>我們先找出電腦的Arduino對應Libraries路徑，打開 Arduino&gt;&gt;檔案&gt;&gt;偏好設定，在草稿碼簿的位置代表著Libraries與程式碼都在那</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="800" height="485" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-1.jpg" alt="" class="wp-image-459" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-1.jpg 800w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-1-300x182.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-1-768x466.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-1-508x308.jpg 508w" sizes="(max-width: 800px) 100vw, 800px" /></figure></div>



<p>舉例來說草稿碼簿的位置是C:\Users\chosemaker\Documents\Arduino\，Libraries的路徑就會在C:\Users\chosemaker\Documents\Arduino\libraries</p>



<p>webthing-arduino套件請到 https://github.com/WebThingsIO/webthing-arduino/archive/master.zip 下載後並解壓縮至C:\Users\chosemaker\Documents\Arduino\libraries</p>



<p>ESPAsyncWebServer套件請到 https://github.com/me-no-dev/ESPAsyncWebServer/archive/master.zip 下載後並解壓縮至C:\Users\chosemaker\Documents\Arduino\libraries</p>



<p>AsyncTCP套件請到 https://github.com/me-no-dev/AsyncTCP/archive/master.zip 下載後並解壓縮至C:\Users\chosemaker\Documents\Arduino\libraries</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="807" height="373" src="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-2.jpg" alt="" class="wp-image-460" srcset="https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-2.jpg 807w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-2-300x139.jpg 300w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-2-768x355.jpg 768w, https://www.chosemaker.com/wp-content/uploads/2020/10/webthings-3-2-508x235.jpg 508w" sizes="(max-width: 807px) 100vw, 807px" /></figure></div>



<p>將以上套件上入資料夾後，請關閉你的Arduino，並重新打開Arduino即可開始include套件</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-3%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%233%5D%20WebThings%20Framework%E7%9A%84Arduino%20Libraries%E5%A5%97%E4%BB%B6%E5%AE%89%E8%A3%9D%E8%88%87%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook_messenger" href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-3%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%233%5D%20WebThings%20Framework%E7%9A%84Arduino%20Libraries%E5%A5%97%E4%BB%B6%E5%AE%89%E8%A3%9D%E8%88%87%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE" title="Facebook Messenger" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-3%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%233%5D%20WebThings%20Framework%E7%9A%84Arduino%20Libraries%E5%A5%97%E4%BB%B6%E5%AE%89%E8%A3%9D%E8%88%87%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-3%2F&amp;linkname=%5BWebThings%E6%95%99%E5%AD%B8%233%5D%20WebThings%20Framework%E7%9A%84Arduino%20Libraries%E5%A5%97%E4%BB%B6%E5%AE%89%E8%A3%9D%E8%88%87%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.chosemaker.com%2Ftopic%2Fwebthings%2Fwebthings-3%2F&#038;title=%5BWebThings%E6%95%99%E5%AD%B8%233%5D%20WebThings%20Framework%E7%9A%84Arduino%20Libraries%E5%A5%97%E4%BB%B6%E5%AE%89%E8%A3%9D%E8%88%87%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE" data-a2a-url="https://www.chosemaker.com/topic/webthings/webthings-3/" data-a2a-title="[WebThings教學#3] WebThings Framework的Arduino Libraries套件安裝與環境設置"></a></p><p>這篇文章 <a rel="nofollow" href="https://www.chosemaker.com/topic/webthings/webthings-3/">[WebThings教學#3] WebThings Framework的Arduino Libraries套件安裝與環境設置</a> 最早出現於 <a rel="nofollow" href="https://www.chosemaker.com">醬是創客</a>。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
