顯示具有 ♥ 標籤的文章。 顯示所有文章
顯示具有 ♥ 標籤的文章。 顯示所有文章

2022年12月6日 星期二

MicroPython 學習筆記索引

在停頓好幾年後重新複習 MicroPython, 可用的開發板變多了, 除了最早的 ESP-01, D1 Mini, ESP-WROOM-32, NodeMCU, micro:bit 到新近的 Raspberry Pico, 未來可能還會更多, MicroPython 生態圈越來越豐富, 所以決定不分開發板種類, 全部都納入 MicroPython 底下, 搭配新出現的函式庫 (xtools.py 等) 重新進行測試, 筆記索引整理如下 :

2022~2023 年 : 

 
2024 年 : 


2025 年 :


2026 年 :



之前的 ESP8266 與 ESP32 筆記索引參考 :
 

2019年12月9日 星期一

Praat 語音分析筆記索引

因 12/3 去彰師大講述 Praat 操作緣故, 為了讓文學院的學生更容易了解, 動手改寫了 2002 年寫的那本過於技術性之使用手冊, 重新整理為如下八篇筆記 :

# Praat 語音分析筆記 (一) : 簡介與軟體下載
# Praat 語音分析筆記 (二) : 錄音與存檔匯入
# Praat 語音分析筆記 (三) : SoundEditor 操作
# Praat 語音分析筆記 (四) : 音高分析
# Praat 語音分析筆記 (五) : 頻譜分析
# Praat 語音分析筆記 (六) : 共振峰分析
# Praat 語音分析筆記 (七) : 強度分析
# Praat 語音分析筆記 (八) : Praat Script

其實早在十年前便想重寫 Praat 使用手冊, 但一直都在忙專案而擱了下來, 這次終於一口氣把它寫完, 又重新複習了聲學語音學一遍. 本來想把 Picture 視窗的用法寫進去, 但製圖並非很重要, 且還要繼續趕專案, 所以在此別過吧!

2019年11月10日 星期日

網頁設計速學筆記索引

暑假時為了教二哥網頁設計寫了下列筆記, 照二哥申請入學時所寫的學習計畫是排在大一上學期, 但開學後發覺課業太多, 可能要推遲到明年暑假了. 除了當教案, 我自己寫程式也常要參考, 畢竟東西太多不可能全記得, 寫下筆記還是最可靠.

# Git 學習筆記 (六) : 利用 GitHub 架設靜態網站    
# 申請免費 PHP 虛擬主機 000a.biz 與 000webhost.com

2022-01-22 補充 :

如果只是架設靜態網站, 不需要用到後端程式的話, 我非常推薦使用 GitHub, 因為它非常穩定, 不需要安裝 Git, 只要打好 HTML 檔上傳即可. 若使用一般 PHP 免費空間經常遇到隨意刪帳號或暫停服務問題. 

2022-08-17 補充 : 

Javascript 筆記我另外在學 p5.js 時整理過 :


另外常用的 jQuery 技法則整理於下面這兩篇 :


2019年11月9日 星期六

GCP (GAE) 學習筆記索引

最近因為要為我的 Fintech 專案尋找運算主機, 而雲端運算環境目前已非常成熟, 除了 AWS 與 Azure 之外, 對十年前使用的 GAE (現在已發展為 GCP) 也重燃興趣, 打算開始來重新學習 Google 雲端服務, 因此找出之前的 GAE 舊文章做成索引方便查考 (有些可能過時了).

2009 ~ 2016 的 GAE 部分 :

# Google應用服務引擎
# 如何申請 GAE 服務引擎帳戶
# GAE 的 Cron Job
# 下載備份 Google App Engine 應用程式檔案的方法
# 利用 GAE 與 Gmail 傳送電子郵件
# GAE 的 urlfetch 超時問題
# 如何讓網頁不會被 cache
# GAE 的時區問題
# 停止 GAE 的 cron jobs 的方法
# 從 GAE 的 log 觀察伺服器回應是否正常
# 如何在 GAE 上佈署 jQuery 與 ExtJS 專案
# 如何在 GAE 中處理 HTTP 要求
# GAE SDK Launcher 因 UnicodeDecodeError 無法運行問題
# GAE 的資料儲存 (Datastore)
# GAE 後台管理指令集
# 無法登入 GAE 問題
# GAE 出現 Server Error 問題
# 如何在 GAE 佈署 jQuery EasyUI 專案 (一)
# 如何在 GAE 上佈署 jQuery EasyUI 專案 (二) : CDN 資源
# 如何在 GAE 上佈署 jQuery EasyUI 專案 (三) : 會員登入
# 如何在 GAE 上佈署 jQuery EasyUI 專案 (四) : Google 登入
# 如何在 GAE 上佈署 jQuery EasyUI 專案 (五) : 紀錄到訪者
# 如何在 GAE 上佈署 jQuery EasyUI 專案 (六) : EasyUI CMS on GAE 之 1
# 如何在 GAE 上佈署 jQuery EasyUI 專案 (七) : EasyUI CMS on GAE 之 2
# 如何在 GAE 上佈署 jQuery EasyUI 專案 (八) : EasyUI CMS on GAE 之 3

2019年9月6日 星期五

使用 Anvil 平台佈署 Web 應用程式

這幾天在研究 Python 前端解決方案時意外找到 Anvil 這個平台, 它是一個以 Python 為基礎的網頁應用平台 (Python only), 使用所視即所得 GUI 介面可以很快建立網頁 app 介面, 只要將 app 網址嵌入自己的專案網頁中即可.

Anvil 提供免費帳戶, 可建立無限制個數的輕流量雲端 App, 但 App 上會有 Anvil 的 Banner, 若要去除 Banner 或擁有完整 Python 功能可付費購買, 分級價目表如下 :




Individual 帳戶每個月要 49 美元有點貴, 若只是小專案或者測試用途, 免費帳戶應該就夠用了.


1. 註冊帳號 :

首先按 "Sign up for free" 進入註冊頁面 :


輸入 E-mail 與登入密碼, 勾選 "Agree to terms" 即可, 它會發出一封確認信到信箱, 按信中的確認連結後馬上就能使用了 :







2. 建立 App : 

以所申請之帳號登入 Anvil 後, 按 "Create App" 鈕, 選擇預設之主題樣式 "Material Design" 即可, 點選後會進入 App 設計頁面 : :






此即為所視即所得設計頁面, 左邊是 App 專案設定框, 中間是網頁內容面板, 也就是放置網頁元素的地方, 右邊則是工具箱, 可從工具箱裡直接拖曳網頁元件到中間的版面上.

以建立一個 Say Hello 的 App 為例, 我們需要一個 Label 顯示 "請輸入名字", 一個文字欄位讓使用者輸入名字, 然後一個確定按鈕, 按下去會顯示 "Hello, xxxx".

中間的網頁內容面板上預設已經有一個表單 (Form), 最上方有一個 title 與 link, 分別用來放置 App 的標題與相關超連結 (例如官網網址等). 從右邊工具箱中拖曳一個 Label 元件到上方標題後, 將工具箱往下拉到 "Property" 區, 在 Text 欄位中輸入 "Hello 測試" 作為 App 標題 :




接著依序加入一個內容為 "請輸入名字" 的標籤 (Label), 一個文字欄位 (TexBox), 一個內容設定為 "說哈囉" 的按鈕 (Button), 以及另一個用來顯示結果的標籤 (內容不用設, 要由程式來設定) 如下 :




最後點選 "說哈囉" 按鈕後, 將右側工具箱拉到最後的 "EVENT" 區, 按 "Click" 點選 "self.button_1" 會從 "Design" 模式切到 "Code" 模式, 裡面已定義了一個 button_1_click() 空函數 (內容為 pass) :




將函數內容改為如下 :

  def button_1_click(self, **event_args):
    """This method is called when the button is clicked"""
    self.label_3.text = "Hello," + self.text_box_1.text 

亦即標籤 3 (label_3) 的內容為 "Hello, " 串接文字欄位 (text_box_1) 中所輸入之名字. 這樣就完 App 設計了, 按最上面的 "Run" 鈕即可執行此 App :




按右上角的 "Publish this app" 會產生此 App 的網址以便讓用戶存取 :




按 "Copy" 複製此 App 連結 :

# https://PDEFCXQREVM7EQ65.anvil.app/MK74HFFBOVVWNFVNOSMUVDUM

由於產生的 App 網址不易記憶, 可用短網址服務來做對應 :

# https://lihi1.cc/FDfSI

lihi.io 服務有提供 QR Code 方便手機照相連線 :




關於短網址服務參考 :

# 免費的短網址服務


3. 將 Web app 嵌入網頁中 : 

上面建立的 App 可嵌入於網頁的 iframe 框架中, 在 "Publish this app" 發布視窗底下有現成的 Javascript 程式碼與網頁碼 :




<script src="https://anvil.works/embed.js" async></script>
<iframe style="width:100%;" data-anvil-embed src="https://PDEFCXQREVM7EQ65.anvil.app/MK74HFFBOVVWNFVNOSMUVDUM"></iframe>

範例 : 將 Web app 嵌入網頁

<!DOCTYPE html>
<html>
<head>
  <title>Javascript 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
</head>
<script src="https://anvil.works/embed.js" async></script>
<body>
  <iframe style="width:100%;" data-anvil-embed src="https://PDEFCXQREVM7EQ65.anvil.app/MK74HFFBOVVWNFVNOSMUVDUM"></iframe>
</body>
</html>




這是在手機測試的結果, 還不錯.

參考 :

# https://anvil.works/learn/tutorials/hello-world

2019年9月5日 星期四

免費的短網址服務

今天在測試 Anvil 的網頁 app 服務時發現其網址很長且都是無法記憶的怪碼組成, 就想到可用 Google 提供的 goo.gl 短網址服務來簡化, 我搜尋 "短網址" 找到下面這篇電獺少女的文章 :

# 精選 5 個取代 goo.gl 的短網址服務推薦,支援自訂中文網址、行銷應用

原來 Google 已在去年宣布要停止 goo.gl 服務了, 文中建議的五個替代方案我申請了 bit.ly 與 lihi.io 以及電獺自己推出的 supr.link 這三個, lihi.io 與 supr.link 都是台灣的新創團隊產品, 有繁中介面, 而且都支援分流網址與數據分析密碼功能, 都有提供短網址 QR Code, 不過在 supr.link 建立一個短網址後需經過審核確定不是非法內容後才可使用, lihi.io 則可以馬上使用.




我個人較喜歡 lihi.io (版面用 Bootstrap 搭建), 這是一家位於台北士林的網路公司 (利害系統有限公司), 幾個年輕工程師就弄出這樣的服務很不錯, 我現有網址年底到期若決定不續約, 未來若要申請網域可以考慮找他們.

2019年7月5日 星期五

MicroPython on ESP32 學習筆記索引

我初次使用 ESP32 是在 2018 年 9 月底獲得 Tim 大哥贈與的 bpi:bit 開發板, 當時做過簡單測試後因為忙別的事暫停. 到 2019 年 6 月底因為買 ESP32-CAM 的關係順便多買了兩塊 NodeMCU-32, 剛好要幫二哥規劃物聯網學習資料, 就開始了 ESP32 的測試旅程.

# https://docs.micropython.org/en/latest/ (官方文件)

ESP32 與 ESP8266 雖然在 MicroPython 方面使用方式大致一樣, 但仍有一些差異, 因此與 ESP8266 分開, 但可相互參考, ESP8266 的索引如下 :

# MicroPython on ESP8266 學習筆記索引

ESP32 相關紀錄文章集結如下 :

# ESP32 開發板 bpi:bit
# bpi:bit ESP32 開發板測試 (一) : 燒錄 MicroPython 韌體
# 最小的 AIoT 臉部辨識開發板 ESP-EYE
# 物聯網開發板 ESP32-CAM
# ESP8266/ESP32 物聯網開發板安裝軟體與套件清單
# MicroPython on ESP32 學習筆記 (一) : 燒錄韌體
# MicroPython on ESP32 尚未支援藍芽
# MicroPython on ESP32 學習筆記 (二) : 檔案系統
# MicroPython on ESP32 學習筆記 (三) : WiFi 連線
# MicroPython on ESP32 學習筆記 (四) : RTC 與日期時間
# MicroPython on ESP32 學習筆記 (五) : 記憶體管理
# MicroPython on ESP32 學習筆記 (六) : 看門狗計時器 WDT
# MicroPython on ESP32 學習筆記 (七) : socket 與網頁伺服器
# MicroPython on ESP32 學習筆記 (八) : WebREPL 介面
# MicroPython on ESP32 學習筆記 (九) : upip 安裝網頁框架 picoweb 失敗
# MicroPython on ESP32 學習筆記 (十) : upip 安裝網頁框架 picoweb 成功
# MicroPython on ESP32 學習筆記 (十一) : ESP8266 安裝 picoweb 失敗
# MicroPython on ESP32 學習筆記 (十二) : picoweb 使用 template 失敗
# MicroPython 1.12 釋出
# MicroPython on ESP32 學習筆記 (十三) : 看門狗計時器 WDT (on v1.12)


~進行中~

2019年6月27日 星期四

ESP8266/ESP32 物聯網開發板安裝軟體與套件清單

在物聯網專案中使用 ESP8266/ESP32 開發板很方便, 特別是 ESP32 內建藍芽與 WiFi, 價格約 200~250 元, 如果用不到藍芽, 則可使用價格約 80 元的 D1 mini, 燒錄 MicroPython 韌體後即可以簡單易學的 Python 語言開發, 所需要的軟體與套件如下 :

1. USB 驅動程式 (Win10 以下) :

CP2102 (參考)
PL2303 (參考)

2. 韌體燒錄套件 :

pip3 install esptool
ESP8266Flasher.exe (for ESP8266 only)

3. 檔案管理套件 :

pip3 install adafruit-ampy (好用)
pip3 install mpfshell
pip3 install rshell

2019年6月19日 星期三

邏輯設計筆記索引

這些筆記來自今年 05-14 ~ 06-11 參與邏輯設計協同教學編寫的五份簡報資料. 為了這個外務我把邏輯設計的書重讀了一遍, 因為承諾學生要放到網路以便他們用 Google 翻譯閱讀, 況且二哥上大學也用得到, 所以就花了蠻多時間整理了序向電路部分共 4 篇.

# 邏輯設計筆記序向篇 : Latch (電栓) 與 Flip-Flop (正反器)
# 邏輯設計筆記序向篇 : Register (暫存器)
# 邏輯設計筆記序向篇 : Counter (計數器)
# 邏輯設計筆記序向篇 : Finite State Machine (有限狀態機)

由於數位電路設計在物聯網應用中也會用到, 所以打算有空把組合篇也補齊, 這樣比較完整. 邏輯設計是進階到 Verilog/VHDL 設計的基礎知識, 也是我在學校讀的書裡面唯一真正有用到工作上的.

組合篇的大綱如下 :
  1. 數碼系統
  2. 邏輯閘
  3. 布林代數
  4. 卡諾圖化簡
  5. 組合電路設計 (1) 加減法器
  6. 組合電路設計 (2) 同位元偵測器
  7. 組合電路設計 (3) 編碼器與解碼器
  8. 組合電路設計 (4)多工器與解多工器
  9. 組合電路設計 (5) 可程式化邏輯元件 PLD/PLA/PAL
序向篇補充 :
  1. 狀態化簡
  2. ASM (演算法狀態機) 設計
  3. GAL 電路設計

2019年5月18日 星期六

Arduino 學習筆記索引

我在 2013 年開始注意到 Arduino, 但直到 2014 年初才開始學習, 記得那時是因為老同學仲仔前一年暑假參加母校的學習營, 拿到一張 Arduino UNO 板, 聽我提到 Arduino 潛力很大, 就把那片 UNO 借我玩一玩, 從此開啟我的物聯網學習之路.

以下整理過去五年我做過的 Arduino 實驗筆記與重要參考文章, 方便搜尋參考與複習 :

2014~2015 年 :

# Arduino 初體驗
# Arduino 液晶顯示器測試
# Arduino Pro mini 動了
# Arduino 乙太網擴充卡測試
# 安裝 PL2303HX USB 轉 TTL 驅動程式
# Arduino 實驗常用 IC
# 串列埠測試軟體 AccessPort
# ESP8266 函式庫記憶體耗損比較

2016 年 :

# AllAboutEE 的 ESP8266 伺服器測試 (一)
# AllAboutEE 的 ESP8266 伺服器測試 (二)
# 製作 Arduino Nano + ESP8266 物聯網模組 (三)
# 從 HTTP 網頁伺服器獲取時間訊息的方法
# 使用 ITEAD WeeESP8266 函式庫改寫物聯網模組 wifi 設定程式
# 再探 NTP 協定
# Arduino 按鈕開關測試 (二) : 硬體中斷法 (Interrupt)
# 用 Blynk 同時控制多個設備

2017 年 : 

# 使用 Python 控制 Arduino
# Arduino 自走車測試 : (二) 電源驅動規劃
# 使用 Arduino IDE 開發 ESP8266 應用 (一) : 環境設定與韌體上傳

2018 年 : 

# Arduino + LoRa 模組測試
# 一本探討 Arduino 中斷的好書

~~ 未完 ~~

原來我是在 2015~2016 這兩年瘋 Arduino + ESP8266, 在 2018 年初做完 RoLa 模組初步測試之後便停止了 Arduino 實驗, 轉而去玩機器學習了. 希望很快就可以回來玩物聯網, Arduino, ESP8266, 以及 LoRa. 

2019年4月16日 星期二

好站 : AI 從頭學

今天最大的收穫是找到 Mr.hemingwang 的部落格, 作者閱讀量豐富, 文章涵蓋面廣泛, 特別是也研究過王唯工的書, 就讓我有遇到知音的感覺. 不過其中最吸睛的寶貝是作者不藏私精心整理的機器學習筆記 "AI 從頭學" :

# https://hemingwang.blogspot.com/2016/12/ai_20.html

從筆記目錄看, 作者的興趣非常廣泛, 與我重疊度極高 (佛學, 術數, 中醫等等), 且自 2005 年即不間斷發文, 我素以超強毅力自傲 (幻想即使空降到胡志明小徑的叢林中與越共鬥爭也要能存活, 呵呵), 但最佩服的是這種毅力與能力兼具的人. 有幸找到這寶貝, 趕快收起來好好施展吸星大法功夫吧.

2019年4月12日 星期五

樹莓派 Raspbian 升版與軟體安裝程序

這此趁更換 Raspberry Pi 3 SD 卡到最大 32GB 之便, 重新整理了樹莓派上常用軟體的安裝程序, 其中大部分是 Python 套件. 透過 VNC Cloud Connect 就可以進行遠端存取, 完全不需要在路由器上設定, 解決了無法遠端存取位於社區網路內的樹莓派的麻煩 (社區網路不可能會讓我們在路由器上打洞). 另外, 透過安裝 Nginx + uWSGI + Django, 可在樹莓派上建構後端網站系統, 透過 no-ip 就可以用 DNS 連線樹莓派上的網站了.

裝載了新版 Raspbian 的樹莓派開機後, 會先跳出視窗要求設定區域 (Taiwan/Taipei) 與語系 (中文), 更改樹莓派預設帳號 pi 的密碼, 以及無線基地台的 SSID 與密碼. 設定完後開啟 "偏好設定 (Preference)/Raspberry Pi 設定" 將 SSH 與 VNC 打開, 然後用 sudo nano 編輯 /etc/dhcpcd.conf 加入如下固定 IP 設定, 樹莓派 IP 一律設為 192.168.2.192, routers 與 domain_name_servers 一律設為無線基地台 IP) :

$ sudo nano /etc/dhcpcd.conf     
$ sudo cat /etc/dhcpcd.conf 
interface wlan0
static ip_address=192.168.2.192 
static routers=192.168.2.1 
static domain_name_servers=192.168.2.1 

但是對於尚未確定要安裝到哪裡的 SD 卡而言, 燒錄韌體後我會在有鍵盤滑鼠組與顯示器的環境將其 Gateway 與 Router IP 設定為我的手機 Note 8 路由器的 IP 192.168.43.1, 因為要換裝到現場樹莓派時, 可以先連上手機 WiFi, 再利用手機的 VNC Viewer 連線進去改為連上現場基地台.

參考 :

# 樹莓派 Pi 3 主機更換 SD 卡升版
# 樹莓派重新安裝 Raspbian 作業系統


一. 安裝常用套件 : 

$ sudo apt-get install zip unzip    (壓縮解壓縮)
$ pip3 install ipython                    (Python Shell)
$ pip3 install requests                   (網頁擷取)
$ pip3 install beautifulsoup4        (網頁解析)
$ pip3 install selenium                  (自動化工具)
$ pip3 install django                      (網頁開發框架)
$ sudo apt-get install sqlite3         (SQLite 資料庫)
$ sudo apt-get install r-base          (R 語言)
$ sudo apt-get install nginx           (Web 伺服器)
$ sudo pip3 install uWSGI            (WSGI 伺服器)
$ pip3 install numpy                      (科學計算)
$ pip3 install scipy                         (科學計算)
$ pip3 install matplotlib                (2D 繪圖)
$ pip3 install pandas                      (數據處理)
$ pip3 install scikit-learn              (機器學習)


二. 安裝台股技術分析套件 TA-Lib :

$ wget https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz 
$ tar -xvf ta-lib-0.4.0-src.tar.gz 
$ cd ta-lib 
$ ./configure --prefix=/usr 
$ sudo make 
$ sudo make install 
$ sudo pip3 install ta-lib 

三. 安裝台股行情擷取套件 twstock : 

$ pip3 install analytics      (相依套件)
$ sudo apt-get install python3-lxml python-lxml     (相依套件)
$ pip3 install twstock     


四. 安裝台銀外匯行情擷取套件 twder :

$ sudo apt-get install libxml2-dev libxslt-dev   (相依套件)
$ pip3 install twder    (比較久)

或安裝好 libxml2 與 libxslt 後編譯 twder 原始碼 :

$ wget  https://files.pythonhosted.org/packages/d9/f6/c8c8683aa1c3599d0168bb9476d94af43f0248c0be86b53e2c796614a120/twder-0.1.4.tar.gz     (下載原始碼)
$ tar -xvf twder-0.1.4.tar.gz           (解壓縮)
$ cd twder-0.1.4                              (切換目錄)
$ sudo python3 setup.py install     (安裝) 


安裝好上面所有套件, 高雄 Pi 3 的 32GB 的 SD 卡用掉了 5.6 GB (21%), 即大約是 1/5 的硬碟空間 :

pi@raspberrypi:~ $ df -h
檔案系統        容量  已用  可用 已用% 掛載點
/dev/root        30G  5.6G   23G   21% /
devtmpfs        460M     0  460M    0% /dev
tmpfs           464M  6.6M  458M    2% /dev/shm
tmpfs           464M   47M  417M   11% /run
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           464M     0  464M    0% /sys/fs/cgroup
/dev/mmcblk0p1   44M   23M   22M   51% /boot
tmpfs            93M     0   93M    0% /run/user/1000

鄉下的 Pi 3 則用掉 6.7 GB (24%) :

pi@raspberrypi:~ $ df -h
檔案系統        容量  已用  可用 已用% 掛載點
/dev/root        30G  6.7G   22G   24% /
devtmpfs        460M     0  460M    0% /dev
tmpfs           464M     0  464M    0% /dev/shm
tmpfs           464M   13M  452M    3% /run
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           464M     0  464M    0% /sys/fs/cgroup
/dev/mmcblk0p1   44M   22M   22M   50% /boot
tmpfs            93M     0   93M    0% /run/user/1000

忘記鄉下的多安裝了甚麼. 

參考 :

# Raspberry Pi 筆記(45):安裝R語言及互動介面的 Shiny Server

2017年2月14日 星期二

太陽能無人機

今天在 Youtube 上看到這個太陽能板驅動的無人機 :

# SOLAR powered Plane / Drone / FPV / Build / RC Aircraft


在影片的 6:59 處有介紹其架構, 採用 Ardupilot 飛控板以及 MinimOSD 視訊處理板, 利用 30 片 SunPower C60 太陽能板 (0.44~0.56V) 來產生所需之電力 (13.2~16.8V) 並向 3000 mAH 鋰聚合物電池充電.

另外一個是太陽能四軸無人機, 直接在四軸上面放一個方形的太陽能板 :

# Xsol-E1.1 (solar power quadcopter - more detail)


此太陽能板量得開路電壓 18.6 伏.

下面這個則是將能板架高的作法, 四個支柱直接鎖在四個馬達上方, 因此旋翼必須朝下 :

# solar cell powered drone


事實上, 太陽能驅動的載人飛機已經成功飛越太平洋, 參見 :

# Solar plane finishes flight across Pacific


事實上太陽能飛機早已商業運轉, 位於美國新墨西哥州的 Titan AeroSpace 公司所製造的太陽能無人機, 翼展 50 公尺載重達 32 公斤, 飛行時速最高 104 公里, 機翼上裝置的太陽能板所發出的 7000 瓦電力可以讓無人機在 20000 公尺的高空持續飛行五年不需落地, 優異的特性受到 Facebook 與 Google 的競購.

# Google收購無人機公司Titan Aerospace,與Facebook競逐空中連網
# Titan Aerospace unveils the world's first solar-powered UAVs


Google 在 2014 年擊退臉書, 宣布收購 Titan 作為其高空聯網計畫的一部份, 不過可惜的是這個 "Titan 計畫" 在 2015 年 Google 組織重組時被終止了. 參考 :

# Titan Aerospace
# Google 解散 Titan 團隊,高空無人機研發終止
# Google buys solar-powered drone-maker Titan Aerospace


這種太陽能無人機可望取代同步衛星的商業通訊與軍事功能, 參考 :

# See the Drone That Is Years Ahead of Google and Facebook


航太巨人波音公司的雄心更遠大, 他們想打造一個可以永遠不落地的 UAV, 它兩側的垂直翼造型非常前衛 :

# Boeing patents first solar powered plane that can fly forever. It can replace costly satellites



另一個航太巨人空巴 Airbus 也沒缺席, 還名列 8 個頂尖太陽能無人機公司的 No.1, 參考 :

# Top 8 Solar Powered Drone (UAV) Developing Companies

下面這家 AtlantikSoloar 的 81 小時不間斷飛行測試蠻值得參考的, 主要是紀錄電池存量的變化, 從正午開始升空飛行到日落前電量還有 95%, 經過跨夜飛行至早上 5 點時電量剩下 54%, 到迎來第二天早上的曙光時降到 39% 後開始充電, 到第二天中午就充飽電了. 這個實驗顯示太陽能無人機不落地飛行是可實現的.

# AtlantikSolar - 81 hour endurance world record flight


2020-06-20 補充 :

今天又找到一個太陽能飛機測試影片 :

# SOLAR Plane V4 Flying Wing


這台真的有點大, 使用了約 40 片太陽電池.

可撓性太陽電池參考 :

# 太陽能無人機使用的電池片 Sunpower C60

2015年10月4日 星期日

★ ESP8266 WiFi 模組與 Arduino 連線測試

經過兩個月來的摸索, 對於 Arduino 經由 ESP8266 連上網路的實驗終於來到實作階段. 這當中也分心去研究如何製做 ESP8266 的轉接板, 雖已經有腹案, 但覺得還是先把連網實驗做完再來搞定轉接板好了. 這兩塊板子互連主要有兩個障礙, 一是開發階段串列埠不夠的問題, 二是 Arduino 的 5V 位準與 ESP8266 的 3.3V 位準轉換的問題.

不管是 UNO 還是 Nano, 它們都只有一組 UART 串列埠 TX0 與 RX0, 而且與 USB 是共接的, 亦即如果將 Arduino 的 USB 接到電腦用來上傳程式與透過 Serial.print() 來除錯與追蹤執行結果, 那麼串列埠 TX0/RX0 就不能同時接到 ESP8266 來傳送 AT 指令與接收回應.

解決之道是使用 SoftwareSerial 函式庫來將一般 DIO 針腳模擬成軟體串列埠, 我習慣是使用 Pin 11 當 TX, Pin 10 當 RX, 參考之前寫的 UART 串列埠測試 :

# Arduino 串列埠測試 (UART)

第二個問題是 Arduino 與 ESP8266 互連時電壓位準的調適. ESP8266 工作於 3.3V 電源下, 不可以直接將 Ardino 的 TX 接到 ESP8266 的 URXD 腳 (即 RX), 這麼做會讓 ESP8266 陣亡, 參考 ESP8266 規格 :

# https://nurdspace.nl/images/e/e0/ESP8266_Specifications_English.pdf

在這本規格書的第 15 頁, 談到其 DIO 針腳的電氣規格, 最大輸入電壓是 3.6V (Input high voltage, maximum), 與 Arduino 的 5V 有 1.4V 壓差, 這可能將 URXD 針腳與內部電路燒毀. 而其 DIO 腳高邏輯的最低輸出電壓為 0.8*VIO (Output high voltage)=0.8*3.3=2.64V, 這在 TTL 會被視為 High (>2V), 所以直接推動 Arduino 的 RX 腳基本上沒問題 (只是邊限小了些, 只有約 0.64V). 若要可靠些, 可用 MOSFET 2N7000 與兩顆電阻做成 Level shifter 來轉成 5V 系統, 參考 :

# 用 MOFFET 2N7000 做 5V 與 3.3V 位準轉換

解決了以上這兩個問題, 就可以進行互連實驗了. 這實驗主要是參考 Proteus 君這篇大作 :

# 初遇 IoT ( Internet of Thing, 物聯網 ) - 使用 Arduino 控制 ESP8266 無線模組上傳資料到 IoT Server ( ThingSpeak )

在這篇文章中, Proteus 使用 UNO 做為主控板, 而我是用小巧方便的 Nano. 他使用了一塊位準轉換模組進行 TX/RX 的 5V/3.3V 轉換, 我則參考底下這篇文章, 採用簡單的 10K+20K 電阻分壓法 (註 : 應該使用 1K+2K) 將 Arduino 的 TX 介接到 ESP8266 的 URXD 腳, RX 則直接與 ESP8266 的 UXTD 腳相連 :

# A Simple IoT Project with the ESP8266 WiFi module

此作者使用 3 個 1K 電阻來分壓, 其實用 10K+20K 也無妨 (註 : 會不穩), 因為 Arduino 的 DIO 腳當輸入時, 輸入阻抗約為 100M Ohms, 還蠻大的, 參考 :

# Properties of Pins Configured as INPUT

電路圖如下 (用 Upverter 繪製) :


註 : 實驗發現分壓電阻不能用 10k+20k 組合, RC 效應太大, 應改用 1K+2K 或 220+470 組合.

麵包板接線圖如下 (用 Fritzing 繪製) :


這裡我使用麵包板專用電源供電給 ESP8266 模組 (上方 3.3V) 與 DHT11 (下方 5V), 而 Arduino Nano 則由 PC 的 USB 供電, 這兩組電源的 GND 必須共接地 (Nano 左上方第三隻腳的黑線). 當然 DHT11 吃 Nano 的 5V 也是可以的, 此處接麵包板專用電源是為了接線方便. DHT11 的第二腳 Data 要接一個 10K 上拉電阻到 5V, 其 VCC 則接一個 0.1uF 電容接地.


硬體弄好後, 得去物聯網伺服器網站 Thingspeak 註冊一個帳號, 在 Proteus 的 "初遇 IoT" 有詳細說明, 不再贅述. Thingspeak 有提供 Arduino 的應用範例, 參考 :

# Using an Arduino + Ethernet Shield to Update a ThingSpeak Channel

在上面這個教學文中, 有一個重要資料必須記下來, 就是 Thingspeak 伺服器的 IP 位址 : 184.106.153.149, 這在 ESP8266 與 Thingspeak 伺服器建立 TCP 連線時會用到, 若網路中有 DNS 伺服器, 也可以用 api.thingspeak.com 取代. 

我將申請的通道 (Channel) 命名為 DHT11 :


按 "Channel Settings" 頁籤可以看到, 每一個 Channel 可以記錄最多 8 個欄位資料, 但在這個實驗中我只用到三個欄位 : 攝氏溫度 Temperature(degC), 華式溫度 Temperature(degF), 與濕度 humidity(%) :


設定好欄位後要按底下的 "Save Chanel" 鈕才會真的存進去 :

 
再切到 API Keys, 裡面有 Read 與 Write 兩種金鑰, Read Key 用來從網路程式讀取 Thingspeak 通道資料, 而 Write Key 用來寫入資料, Arduino 要將取得的溫溼度寫到 Thingspeak 伺服器需要的是 Write Key, 這要記下來程式中要用到 :


這樣我們就可以在 Arduino 程式完成之前, 先用 HTTP 的 GET 方式傳送資料給 Thingspeak 伺服器, 測試看看這個寫入金鑰管不管用, 其格式為 :

http://api.thingspeak.com/update?api_key=[寫入金鑰]&field1=[攝氏溫度]&field2=[華氏溫度]&field3=[濕度]

有些網站 (例如 Proteus) 使用的金鑰名稱是 key 而非 api_key, 其實我測試的結果是兩個都可以, Thingspeak 都接受 :

http://api.thingspeak.com/update?key=[寫入金鑰]&field1=[攝氏溫度]&field2=[華氏溫度]&field3=[濕度]

例如 :

http://api.thingspeak.com/update?api_key=NO5N8C7T2KINFCQE&field1=25.4&field2=87.4&field3=55

把此網址貼到瀏覽器, 會回應一個數字, 表示這是第幾筆資料了. 例如 4 表示剛剛寫進去的是第四筆資料, 這時候在 Thingspeak 網站上切換至 Public View 或 Private View 就可以看到填入的數據隨時間變化的圖形了 :


如果要清除這些測試的資料, 按 "Channel Settings" 頁籤底下的 "Clear Channel" 按鈕即刪除.

最後是 Arduino 程式部分, 為了簡化流程, 我不打算在 Arduino 程式中處理 ESP8266 連線無線基地台的 AT 指令, 而是預先將 ESP8266 以 PL2303HX 之類的 TTL 轉 USB 轉換線連接電腦 USB 埠, 用 Realterm 等軟體將 ESP8266 的工作模式設定成 STA 模式與單一連接, AT 指令如下 :

AT+CWMODE=1  (STA 模式) 

其次, ESP8266 不是當 Server, 因此只需要單一 TCP 連線 :

AT+CIPMUX=0  (單一連線)

建立 TCP設定要連接的無線基地台 (SSID, PASSWORD), 其 AT 指令如下 : 

AT+CWJAP="EDIMAX-tony","123456789111" 

設定完後 ESP8266 會記錄這些設定在 Flash 中, 即使關掉電源也會記住, 只要一通電就會尋找原先設定的基地台自動連線. 參考 :


設定好之後, 我們先用 Realterm 直接對 ESP8266 下 AT 指令來模擬傳送溫溼度紀錄到 Thingspeak 伺服器的動作.

首先須與 Thingspeak 伺服器的 80 埠建立 TCP 連線, AT 指令如下 :

AT+CIPSTART="TCP","184.106.153.149",80 

其中 184.106.153.149 乃是 Thingspeak 伺服器的 IP 位址. 連線成功的話, ESP8266 會回應 :

OK                                                                             
Linked

表示已經建立 TCP 連線了.

其次是要告訴 ESP8266 我們打算要傳送多少字元的資料, 以便其準備所需之緩衝區. 所使用的 AT 指令是 CIPSEND, 參考 ESP8266 快速指南中的第八頁 "Acting as a TCP Client" :

# ESP8266 WiFi Module Quick Start Guide (PDF)

不過我們要做些調整, 此文首先是將 CIPMUX 設為 1 (允許多重連線, 預設為 0, 單一連線), 但這是不需要的, 因為我們只是要用到 ESP8266 的 STA 模式而已, 不需要作為伺服器時之多重連線. 也因此, CIPSTART 指令也不需要指定 id, 參考 :

# ESP8266 AT Command Set (PDF)


當然, 要告知資料長度, 得先知道要傳送的是啥資料. 我們在上面測試 Thingspeak 伺服器時, 是在瀏覽器貼上 Thingspeak API 的網址, 但在作為客戶端 (STA 模式) 的 ESP8266 而言, 則是要向目的主機發出如下格式之 GET 請求 :

GET /目的網頁網址

參考 :

# https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

而此處目的網頁就是 Thingspeak 的更新通道資料的網頁程式 update :

update?api_key=寫入金鑰&欄位1=數值1&欄位2=數值2&欄位3=數值3....

我們要向 ESP8266 傳送的資料格式如下 :

GET /update?api_key=NO5N8C7T2KINFCQE&field1=29.00&field2=84.20&field3=73.00

將此 GET 指令貼到 WORD 中進行字數統計, 可知含空格 (GET 後面那個) 共 75 字元 :




但我們用 Realterm 傳送 AT 指令給 ESP8266 時都必須在後面加上 \r\n 這兩個跳行字元, 因此全部字元長度須再加上 2, 總共是 75+2=77, 因此 AT 指令如下 :

AT+CIPSEND=77

參考 :

# Tutorial: IoT Datalogger with ESP8266 WiFi Module and FRDM-KL25Z
 
注意, 這個總字元長度必須恰恰好, 多跟少都不行, ESP8266 會因為兜不攏而當在那邊, 無法完成傳送任務. 此 AT 指令下完後, ESP8266 會回應一個大於提示號, 表示可以開始傳送資料 :

>

最後是就是把要溫溼度資料的 GET 指令字串貼到 > 後面傳送 :

>
GET /update?api_key=NO5N8C7T2KINFCQE&field1=24.00&field2=83.20&field3=77.00

成功的話, ESP8266 立刻回應 +IPD 如下 :

SEND OK

+IPD,1:7
OK

OK
Unlink

傳送完資料 ESP8266 就自動拆除 TCP 連線, 顯示 Unlink. 如果是沒有, 必須手動拆線, 其 AT 指令是 AT+CIPCLOSE. 注意, 上面傳送完成後, ESP8266 會向 Arduino 回送 +IPD, 後面的 1 表示伺服器回應資料的長度, 此處 1 表示 1 個 byte, 冒號後面 7 即 Thingspeak 伺服器回應的資料為 7, 表示此為第七筆寫入之資料, 參考 :

# https://github.com/espressif/esp8266_at/wiki/IPD

這樣便確認 ESP8266 可以正確透過 WiFi 基地台向 Thingspeak 伺服器傳送更新數據了.


完成以上測試後, 便可將 PL2303HX 轉換線移除, 將 ESP8266 與 Arduino 照上面電路圖連接. 然後撰寫 Arduino 程式, 模擬上面的人工操作, 自動向 ESP8266 傳送 AT 指令, 使其透過 WiFi 連線向 Thingspeak 伺服器更新溫溼度資料.

摘要以上四個步驟與 Arduino 程式作法 :
  1. 與目的主機建立 TCP 連線 :
    AT+CIPSTART="TCP","184.106.153.149",80   //連線 Thingspeak 主機
    在 Arduino 中以字串表示時, 須將雙引號以倒斜線跳開 :
    String cmd="AT+CIPSTART=\"TCP\",\"184.106.153.149\",80";
  2. 傳送 GET 字串長度給 ESP8266 :
    AT+CIPSEND=GET 字串長度 
  3. 傳送 GET 字串給 ESP8266 :
    sSerial.println(GET 字串)  
  4. 關閉 TCP 連線 :
    AT+CIPCLOSE
下面的測試程式是我參考阿喵就像家的 "ESP8266 Workshop" 投影片中的程式修改來模擬上面 Realterm 傳送 AT 指令, 用來驗證串列埠與軟體串列埠接線是否正常運作 :

#include <SoftwareSerial.h>
SoftwareSerial sSerial(10,11); //(RX,TX) 與 ESP8266 介接的軟體串列埠

void setup() {
  sSerial.begin(9600);
  Serial.begin(9600);
  Serial.println("SoftSerial to ESP8266 AT commands test ...");
  }

void loop() {
  if (sSerial.available()) {  //若軟體串列埠 RX 有收到來自 ESP8266 的回應字元
    Serial.write(sSerial.read());  //在串列埠監控視窗顯示 ESP8266 的回應字元
    }
  if (Serial.available()) {  //若串列埠 RX 有收到來自 PC 的 AT 指令字元 (USB TX)
    char c=Serial.read();  //先暫存在字元變數 c 緩衝一下
    sSerial.write(c);  //將 PC 的傳來的字元傳給 ESP8266
    }
  delay(50);  //緩衝 50ms 以免傳送太快 (不用, 後述)
  }

程式上傳後, 打開序列埠監視視窗, 先把右下方的行尾加送模式選為 "NL & CR", 表示每次傳送時都要在傳送字串後面加上跳行, 然後在上方輸入框敲入 AT 指令, 按傳送, 若接線沒問題, 應可在下方框看到 ESP8266 的回應訊息 :


回應訊息如下 :

SoftSerial to ESP8266 test...
AT

OK


AT+RST

OK
bB��@�Sc��S��"�JL��������H�
[System Ready, Vendor:www.ai-thinker.com

AT+CIPSTART="TCP","184.106.153.149",80


OK
Linked

AT+CIPSEND=77

> GET /update?api_key=NO5N8C7T2KINFCQE&field1=25.00&field2=84.20&field3=78.00

SEND OK

+IPD,1:8
OK

OK
Unlink

可見接線沒問題, 電壓位準也 OK, 整個架構是正確的. 嘿! 我突然發現, 利用上面這個程式我不需要 USB-TTL 轉接線, 用 Arduino 就可以對 ESP8266 下 AT 指令了耶! 這真是太棒了! 不過要注意的是, 上面程式最後一行的 delay(50) 是需要的, 如果取消就似乎太快, 序列部監視視窗根本毫無反應. 我試過大約 40~50 ms 最適當, 但偶而還是會有幾個字元傳送錯誤, 要多試幾次. 如果毫無反應, 可能是接線不良, 特別是 ESP8266 的 TX 到 Arduino 的 RX 這條. 若 AT 指令下下去後, ESP8266 的藍燈沒閃, 表示沒收到信號, 要檢查 Arduino TX 到 ESP8266 RX 這條線. (此 delay 完全不需要, 原因後述)

以上述程式驗證連線無誤, 軟體序列埠與硬體序列埠可正常通訊後, 最後以 "A Simple IoT Project with the ESP8266 WiFi module" 這篇文章的程式為主軸, 綜合之前做 DHT11 溫溼度測試 (參考 Arduino 溫濕度感測器 DHT11 測試), 改寫為如下程式, 由 Arduino 讀取 DHT11 量測之溫濕度數據, 透過軟體序列埠傳送給 ESP8266 經 WiFi 網路給 Thingspeak 伺服器.

這裡用到的 DHT11 函式庫可至 Adafruit 網站下載, 按網頁右下角的 "Download ZIP" 即可. 注意, Arduino IDE 必須關閉重開才會去抓函式庫, 否則仍編譯失敗.

程式如下 :

#include <SoftwareSerial.h>           //載入軟體串列埠函式庫
#include <DHT.h>                   //載入 DHT11 函式庫
#define DHTPIN 2                    //定義 DIO 腳 2 為 DHT11 輸入
#define DHTTYPE DHT11               //定義 DHT 型態為 DHT11

DHT dht(DHTPIN, DHTTYPE);          //初始化 DHT11 感測器
int LED=13;                         //宣告 DIO 腳 13 為 LED 輸出
String api_key="NO5N8C7T2KINFCQE";  //Thingspeak API Write Key
SoftwareSerial sSerial(10,11);        //設定軟體串列埠腳位 RX, TX為 DIO 腳 10, 11

void setup() {              
  pinMode(LED, OUTPUT);             //設定 DIO Pin 13 為 LED 輸出
  Serial.begin(9600);                //啟始硬體串列埠 (除錯用)
  sSerial.begin(9600);              //啟始軟體串列埠 (與 ESP8266 介接用)
  dht.begin();                      //啟始 DHT11 溫濕度感測器
  sSerial.println("AT+RST");        //軟體串列埠傳送 AT 指令重啟 ESP8266
  }

void loop() {
  float h=dht.readHumidity();         //讀取濕度
  float c=dht.readTemperature();      //讀取攝氏溫度
  float f=dht.readTemperature(true);  //讀取華氏溫度
  //有任何一個是 NAN 就不往下執行資料傳送
  if (isnan(h) || isnan(c) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
    }
  blink_led(1000,500); //進入資料傳送程序 : LED 閃爍一次  
  String param="&field1=" + (String)c + "&field2=" + (String)f +
               "&field3=" + (String)h; //製作參數字串
  //Serial.println(param); //輸出字串參數於監控視窗

  //與 Thingspeak 主機建立 TCP 連線
  String cmd="AT+CIPSTART=\"TCP\",\"184.106.153.149\",80";
  sSerial.println(cmd); //向 ESP8266 傳送 TCP 連線之 AT 指令

  //偵測 TCP 連線是否成功
  if (sSerial.find("Error")) {          
    Serial.println("AT+CIPSTART error!");
    return;  //連線失敗跳出目前迴圈 (不做後續傳送作業)
    }
  Serial.println(cmd);  //輸出 AT 指令於監控視窗

  //製作 GET 字串
  String GET="GET /update?api_key=" + api_key + param + "\r\n\r\n";
  Serial.println(GET);  //顯示 GET 字串內容於監控視窗
  cmd="AT+CIPSEND=" + String(GET.length()); //傳送 GET 字串長度之 AT 指令
  sSerial.println(cmd);  //告知 ESP8266 即將傳送之 GET 字串長度
  Serial.println(cmd); //輸出 AT 指令於監控視窗

  //檢查 ESP8266 是否回應
  if (sSerial.find(">")) {  //若收到 ESP8266 的回應標頭結束字元
    sSerial.print(GET);  //向 ESP8266 傳送 GET 字串內容
    }
  else {  //沒有收到 ESP8266 回應
    sSerial.println("AT+CIPCLOSE");  //關閉 TCP 連線
    Serial.println("AT+CIPCLOSE");    //顯示連線關閉訊息於監控視窗
    }
  delay(16000);  //延遲 16 秒 (因 Thingspeak 每次更新須隔 15 秒)
  }

void blink_led(int on, int off) {  //LED 閃爍函式
  digitalWrite(LED, HIGH);
  delay(on);
  digitalWrite(LED, LOW);
  delay(off);
  }

結果不會動, 我把 Thingspeak 的通道清除後, 資料仍然沒進來, 空空如也. Why?  程式來回檢查好幾遍了, 沒錯呀, 跟原作者的做法相同啊? 而且每 16 秒鐘的 loop 都有看到 ESP8266 的藍燈在閃, 表示有傳送資料, 為何 Thingspeak 沒收到呢?

序列埠監視視窗的輸出如下 :

AT+CIPSTART="TCP","184.106.153.149",80
GET /update?api_key=NO5N8C7T2KINFCQE&field1=28.00&field2=82.40&field3=81.00


AT+CIPSEND=79
AT+CIPCLOSE

可見 GET 指令沒有送出去. .再研究 ....

**********************************************

晚上回高雄後仍不死心, 又重新測試一遍, 結果更糟, 連前面利用序列埠監視視窗對 ESP8266 下 AT 指令的程式也沒反應, 接線稍微喬一喬有改善, 但仍然會遺失字元, 導致 Error. 難道麵包板接線這麼脆弱嗎? 移動一下就不行? 我突然想到這是電訊號問題, 該不會是 10K+20K 分壓電阻太大了吧? 這是唯一跟原作者不一樣的地方.

之前就有懷疑這點, 上周五下班後特地跑去禾樺買了一包 1K+2K 的電阻. 於是拿出來替換掉 10+20k 分壓組合, 而且去掉我自己加的很奇怪的 delay(50), 果然! 序列埠監視視窗傳送 AT 指令不再掉字元, 非常順啊! 原來搞了我兩三天的就是分壓電阻! 我想原因可能是, 雖然 10K/20K 對 100M 的輸入阻抗不算甚麼, 但是, 電阻越高, RC 反應時間變長, 可能使訊號變形, 導致字元錯誤或遺失 (有示波器的話應該就能看得明白了). 電路學中, RC 電路的時間常數 R*C 表示電壓上升至終值得 65% 的時間, 電阻越大時間常數也越大, 當然 High 可能被認為是 Low 而產生訊息錯誤了. 參考 :

# RC電路的時間常數

原作者使用 1K 電阻是對的, 我自作聰明換成 10K 根本是自找苦吃.

找到原因後, 再重新上傳 DHT11 溫溼度測量程式, 哇, 終於成功啦 :


圖中溫度突然上升, 濕度突然下降是用吹風機熱風吹的緣故. 這個 Thingspeak 曲線圖會自動更新, 不需要手動重新整理網頁, 蠻不錯的.


參考 :

# ESP8266 Community Forum
# ESP8266 WiFi module and 5V Arduino connection
# ESP8266 wiring with Arduino
# ESP8266 wiring schemas
# 深入淺出 Wifi 晶片 ESP8266 with Arduino
# SoftwareSerial Library
# A Simple IoT Project with the ESP8266 WiFi module
# Programming an Arduino via WiFi with the ESP8266
# http://www.arduinesp.com/thingspeak (使用 ESP8266WiFi.h)
# ESP8266 + Arduino Uno: Can't send AT Commands
# How to use ESP8266 ESP-01 as a SENSOR web client
# ESP8266 Wi-Fi Module with Teensy and Arduino
# Freaky response from the ESP8266 with Arduino Nano
# Programming an Arduino via WiFi with the ESP8266
# ThingSpeak-Arduino-Examples (Ethernet)
# Using an Arduino + Ethernet Shield to Update a ThingSpeak Channel
# http://electronut.in/posts/ (孟加拉)
# Arduino 結合ESP8266將空氣資料送到Synology NAS(取代Thingspeak)


# UPLOAD SENSORS DATA TO THINGSPEAK BY USING ARDUINO AND ESP8266

關於 AT 指令的進一步探討, 參考 :

# Wifi success, for a change!


另外, 在 "A Simple IoT Project with the ESP8266 WiFi module" 這篇文章裡, 作者使用了一個 C 函數 dtstrf() 來將計算所得之溫度浮點數轉成字串, 剛開始時對這怪異的函數名稱很感冒 (意思是 double to string function), 後來在下面這篇看到其用法解釋, 發現還真好用呢 !

# Displaying FLOAT variables in Arduino

其參數與用法簡單說明如下 :

dtstrf(浮點數, 總字元數, 小數點後位數, 字元陣列)

其中, 總字元數轉換為字串後含小數點總共有多少字元, 故 (總字元數-小數點後位數-1) 就是整數部分的位數. 故要先宣告一個字元陣列來儲存轉換後的字串, 其長度須比總字元數長. 例如 d=123.4567 經 dtstrf(d, 5, 1, s) 轉換後, 得到字串 s=123.4.

此作者有一個進階版的溫度資料收集器, 特殊之處在利用 CH_PD 來省電, 在需要傳送資料時將 CH_PD 設為 High, 傳送完畢設為 Low :

# An IoT Temperature Monitor for my Balcony Garden

參考 :

# Tutorial: IoT Datalogger with ESP8266 WiFi Module and FRDM-KL25Z
# teos0009/ESP8266 Arduino Mega