在過去的幾年中,ESP8266平臺蓬勃發(fā)展,并成為電子愛好者和物聯網愛好者中最受歡迎的硬件工具之一。 ESP8266裝有運行在80 MHz的32位RISC CPU,帶TCP/IP協議棧的完全集成WiFi無線電,串行外設(I2C,SPI和UART),ADC通道和通用I/O引腳,ESP8266是當前物聯網市場空間中可用度最高的,集成度最高的WiFi解決方案。 ESP8266硬件(例如NodeMCU和ESP-01)可以使用其外圍設備直接與傳感器連接,并將傳感器的測量值通過Internet上傳到本地或遠程Web服務器。目前,已經有很多云物聯網平臺(ThingSpeak,thinger.io,TESPA.io,Xively…每天都在增加)提供了API和工具,以使ESP8266用戶可以直接上傳其傳感器讀數在線進行實時可視化和全局訪問。如果您像我一樣是Google云端硬盤的普通用戶,那么您會發(fā)現Google表格比所有這些IoT云平臺更容易接近。在本教程中,我將描述一種將ESP8266設備直接連接到Google表格以存儲傳感器數據而無需使用任何第三方插件的方法。作為說明,我正在使用一個 NodeMCU 板,該板從插入我的花盆的土壤濕度傳感器讀取模擬輸出,并直接連接到Google云端硬盤上的電子表格以存儲數據。
ESP8266數據記錄到Google電子表格
相關帖子
查看如何使用ESP8266發(fā)送電子郵件和短信。
查看我們的天氣Web服務器項目,用于使用ESP8266本地存儲傳感器讀數。
查看我們的 ThingSpeak溫濕度記錄器項目,用于使用ESP8266進行遠程服務器數據記錄示例
該項目基本上有兩個部分。第一部分是設置ESP8266硬件以讀取土壤濕度傳感器的輸出。第二部分涉及創(chuàng)建Google工作表,并將其配置為使用本教程隨附的Google App腳本通過ESP8266模塊通過Internet發(fā)送的傳感器數據。
硬件設置
此該項目使用了一個非常簡單且便宜的土壤濕度傳感器(您可以在 eBay 或 Aliexpress 上以1美元的價格購買)套件,該套件包括兩個裸露的金屬焊盤和一個儀表電路板。裸露的墊子充當探測土壤中水分含量的探針。土壤中的水越多,意味著兩個墊之間的電導率越高,反之亦然。隨附的儀表板可提供隨土壤濕度變化的模擬輸出電壓。儀器電路由3.3V電源供電,其輸出饋送到NodeMCU的模擬輸入通道(A0)。
土壤濕度傳感器由裸露的金屬焊盤和儀器電路
注意: ESP8266模擬輸入可以處理最大1V的輸入電壓。但是,NodeMCU在板上實現了一個分壓器電路,以將輸入電壓范圍擴展到3.3V。
軟件
讓我們首先嘗試了解在嘗試發(fā)送時實際發(fā)生的情況數據到Google的盡頭。很明顯,我們將使用GET請求通過URL來發(fā)送數據,該URL的模式為 https://script.google.com/。..。。當您在網絡瀏覽器中輸入該URL時,Google服務器響應,要求瀏覽器通過新的GET請求重定向到域為 script.googleusercontent.com 的另一個URL。對于Web瀏覽器,URL重定向是很常見的事情,它可以正常工作。然而,對于ESP8266,這不是直截了當的。 ESP8266需要正確解碼從第一臺服務器收到的標頭信息以提取重定向URL并向新服務器發(fā)出第二個GET請求。為了簡化重定向,Sujay Phadke(aka electronicsguy )已共享在GitHub上,以Arduino庫的形式編寫了一段精美的代碼,名為 HTTPSRedirect 。 Arduino的其他示例還使用第三方API服務(例如 pushingbox )將數據發(fā)布到Google電子表格,以處理Google的https要求和URL重定向。 HTTPSRedirect 庫的使用通過避免需要任何第三方服務而使任務更加簡單。因此,您需要做的第一件事是從GitHub復制HTTPSRedirect庫文件并將其安裝到Arduino庫文件夾中。為了方便起見,我還在以下鏈接上發(fā)布了壓縮的庫文件。
下載HTTPS重定向庫
更新:以上庫已過時。
請轉到GitHub Sujay Phadke并下載更新的庫。感謝Sujay。
要將其安裝到您的計算機上,只需下載上述壓縮文件,解壓縮并移動名為 HTTPSRedirect 的文件夾即可。到您的Arduino庫位置。在Windows PC上,它通常轉到 C:\ Users \\ Documents \ Arduino \ libraries \ 。
在Windows PC上的Arduino IDE庫路徑
確保已復制的庫文件夾中同時存在HTTPSRedirect.cpp和HTTPSRedirect.h文件。
程序ESP8266將數據發(fā)送到Google Sheets
下面發(fā)布的是使用Arduino IDE編寫的ESP8266代碼,用于讀取土壤濕度傳感器的輸出并將其發(fā)布到Google云端硬盤上的Google Sheet中。為了使其適合您的情況,您需要更新與您的匹配的 ssid 和 密碼 WiFi網絡。另外,您還需要獲取 * GScriptId ,只能在發(fā)布所需的Google App腳本后獲得。本教程底部將說明獲取 * GScriptId 的過程。傳感器數據每15分鐘發(fā)布到Google工作表一次。
//BY:Akshaya Niraula
//ON:2016年11月11日
//AT: http://www.embedded-lab.com/
#include 《 ESP8266WiFi 。 h 》
#include “ HTTPSRedirect.h”
const char * ssid = “ –您的SSID –” ;
const char * 密碼 = “ –您的密碼–” ;
//下面的ID來自Google表格。
//指向此頁面底部,它將解釋如何獲得此
const char * GScriptId = “ —您的Google-Script-ID – =” ;
//在此間隔內推送數據
const int dataPostDelay = 900000 ; //15分鐘= 15 * 60 * 1000
const char * host = “ script.google.com” ;
const char * googleRedirHost = “ script.googleusercontent.com” ;
const int httpsPort = 443 ;
HTTPSRedirect 客戶端 ( httpsPort ) ;
//準備url(沒有變化的數據)
字符串 url = 字符串 ( ”/macros/s/” ) + GScriptId + ”/ex ec?” ;
const char * 指紋 = “ F0 5C 74 77 3F 6B 25 D7 3B 66 4D 43 2F 7E BC 5B E9 28 86 AD” ;
//我們將從A0引腳獲取模擬輸入
const int AnalogIn = A0 ;
void 設置 ( ) {
Serial 。 開始 ( 115200 ) ;
序列 。 println ( “連接到wifi:“ ) ;
序列 。 println ( ssid ) ;
序列 。 沖洗 ( ) ;
WiFi 。 開始 ( ssid , 密碼 ) ;
而 ( WiFi 。 狀態(tài) ( ) != WL_CONNECTED ) {
延遲 ( 500 ) ;
序列 。 打印 ( “。” ) ;
}
串行 。 println ( ” IP地址:“ ) ;
序列 。 println ( WiFi 。 localIP ( ) ) ;
序列 。 print ( String ( “連接到” ) ) ;
序列 。 println ( host ) ;
布爾 標志 = false ;
用于 ( int i = 0 ; i 《 5 ; i ++ ) {
int retval = 客戶端 。 conn ( 主機 , httpsPort ) ;
如果 ( retval == 1 ) {
flag = true ;
break ;
}
else
序列 。 println ( “連接失敗。正在重試…” ) ;
}
//連接狀態(tài),1 =已連接,未連接為0。
序列 。 println ( “連接狀態(tài):” + 字符串 ( 客戶端 已連接 ( ) ) ) ;
序列 。 刷新 ( ) ;
如果 ( ! flag ) {
序列 。 打印 ( “無法連接到服務器:“ ) ;
串行 。 println ( host ) ;
序列 。 println ( 出口ing…” ) ;
序列 。 flush ( ) ;
返回 ;
}
//即使證書不匹配,數據仍將被推送。
如果 ( 客戶端 。 驗證 ( 指紋 , 主機 ) ) {
Serial 。 println ( “證書匹配。” ) ;
} else {
Serial 。 println ( “證書不匹配” ) ;
}
}
//這是將數據推送到的主要方法Google工作表
void postData ( String tag , float value ) {
如果 ( ! client 。 已連接 ( ) ) {
序列 。 println ( “再次連接到客戶端… ” ) ;
客戶端 。 connect ( 主機 , httpsPort ) ;
}
字符串 urlFinal = url + “ tag =” + 標簽 + “&value =” + 字符串 ( value ) ;
客戶 。 printRedir ( urlFinal , 主機 , googleRedirHost ) ;
}
//繼續(xù)以給定的時間間隔推送數據
void loop ( ) {
//讀取模擬值,在這種情況下為土壤濕度
int 數據 = 1023 – analogRead ( AnalogIn ) ;
//發(fā)布這些信息
postData ( “土壤水分” , 數據 ) ;
延遲 ( dataPostDelay ) ;
}
您還可以從以下鏈接下載NodeMCU代碼。
下載NodeMCU代碼
創(chuàng)建Google表格
在您的Google Dri中創(chuàng)建Google電子表格ve,并將其命名為 DataCollector 。將當前/活動工作表重命名為摘要,然后添加第二個工作表,將其命名為 DataLogger 。在工作表的URL地址欄中,將d/和/edit之間的字符串復制并保存到某處。這是電子表格的唯一共享密鑰,以后在Google Apps腳本中將需要。
您的Google電子表格的唯一共享密鑰可以在URL中找到
注意: Google電子表格的名稱無關緊要,因為我們將在表單中使用唯一的表單共享密鑰。 Google Apps腳本可以訪問它。但是,工作表名稱(摘要和 DataLogger )必須與您在Google Apps腳本中輸入的內容(稍后描述)相匹配。
在摘要中表格上,在單元格 A1 上鍵入 上次修改 ,在上鍵入 DataLogger計數 》 和 A3 上的 下次讀取時間 。在單元格 B2 中,鍵入一個公式,該公式將為我們在 B3 中提供數據計數‘ = counta(DataLogger!D:D)-1 ’ ,請輸入此等式 = B1 + TimeValue(“ 00:15”),這將為最后修改的日期時間增加15分鐘。為了支持Google表格中的壓力表,已添加了從A6到B7的一些信息,如下圖所示
Goolge表格–摘要標記
在 DataLogger 表中,在 A1,B1,C1和D1 中鍵入 ID,DateTime,標記和值
Google表格數據記錄器選項卡
Google Apps腳本
創(chuàng)建Google應用腳本,請從Google表格轉到工具》腳本編輯器。在代碼部分中,粘貼以下代碼。該代碼或腳本可以使用任何名稱保存。
// BY: Akshaya Niraula
// ON: 2016 November 12th.
// AT: http://www.embedded-lab.com/。..。.
// Steps are valid as of 2016 November 12th.
// 0) From Google spreadsheet, Tools 》 Scriipt Editor.。.
// 1) Write your code
// 2) Save and give a meaningful name
// 3) Run and make sure “doGet” is selected
// You can set a method from Run menu
// 4) When you run for the first time, it will ask
// for the permission. You must allow it.
// Make sure everything is working as it should.
// 5) From Publish menu 》 Deploy as Web App.。.
// Select a new version everytime it‘s published
// Type comments next to the version
// Execute as: “Me (your email address)”
// MUST: Select “Anyone, even anonymous” on “Who has access to this script”
// For the first time it will give you some prompt(s), accept it.
// You will need the given information (url) later. This doesn’t change, ever!
// Saving the published URL helps for later.
// https://script.google.com/macros/s/---Your-Script-ID--Goes-Here---/exec
// https://script.google.com/macros/s/---Your-Script-ID--Goes-Here---/exec?tag=test&value=-1
// This method will be called first or hits first
function doGet(e){
Logger.log(“--- doGet ---”);
var tag = “”,
value = “”;
try {
// this helps during debuggin
if (e == null){e={}; e.parameters = {tag:“test”,value:“-1”};}
tag = e.parameters.tag;
value = e.parameters.value;
// save the data to spreadsheet
save_data(tag, value);
return ContentService.createTextOutput(“Wrote: tag: ” + tag + “ value: ” + value);
} catch(error) {
Logger.log(error);
return ContentService.createTextOutput(“oops.。..” + error.message
+ “ ” + new Date()
+ “ tag: ” + tag +
+ “ value: ” + value);
}
}
// Method to save given data to a sheet
function save_data(tag, value){
Logger.log(“--- save_data ---”);
try {
var dateTime = new Date();
// Paste the URL of the Google Sheets starting from https thru /edit
// For e.g.: https://docs.google.com/。..。/edit
var ss = SpreadsheetApp.openByUrl(“https://docs.google.com/spreadsheets/d/---Your-Google-Sheet-ID--Goes-Here---/edit”);
var summarySheet = ss.getSheetByName(“Summary”);
var dataLoggerSheet = ss.getSheetByName(“DataLogger”);
// Get last edited row from DataLogger sheet
var row = dataLoggerSheet.getLastRow() + 1;
// Start Populating the data
dataLoggerSheet.getRange(“A” + row).setValue(row -1); // ID
dataLoggerSheet.getRange(“B” + row).setValue(dateTime); // dateTime
dataLoggerSheet.getRange(“C” + row).setValue(tag); // tag
dataLoggerSheet.getRange(“D” + row).setValue(value); // value
// Update summary sheet
summarySheet.getRange(“B1”).setValue(dateTime); // Last modified date
// summarySheet.getRange(“B2”).setValue(row - 1); // Count
}
catch(error) {
Logger.log(JSON.stringify(error));
}
Logger.log(“--- save_data end---”);
}
重要說明: 在上面的腳本中,工作表名稱應與我們要填充的名稱匹配。
var summarySheet = ss.getSheetByName(“Summary”);
var dataLoggerSheet = ss.getSheetByName(“DataLogger”);
類似地,您還需要在腳本中編輯電子表格共享密鑰,以便與您的匹配(您之前從電子表格URL復制的副本)。
table》
下載 Goolge應用程序腳本
將內容作為Web應用程序部署
下一步是發(fā)布腳本,以便可通過URL訪問。為此,請發(fā)布》作為Web應用程序部署。
注意:每當您修改代碼時,都必須創(chuàng)建一個“新建”項目版本并發(fā)布,否則您仍然會遇到相同的舊代碼。
復制 當前網絡應用的URL 并將其保存在需要的地方用于提取 GScriptID 。我通常將其保存在mycode中作為注釋。 Web應用程序URL如下所示:
https://script.google.com/macros/s/–您的Google腳本ID–/exec?tag = test&value = -1
s/和/exec之間的字符串?是您的 GScriptID 。
作為Web應用程序部署
在發(fā)布過程中,Google會要求授予一些權限,您需要允許這些權限。
測試進度
如果操作正確,則以下測試應該成功。復制發(fā)布過程中收到的Web應用程序URL,如上所示進行格式化,然后將此字符串粘貼到Web瀏覽器URL字段中。您應該在 DataLogger 工作表中看到以下信息,如下所示。
測試數據發(fā)布到Google工作表
到目前為止還好嗎?如果沒有,請仔細檢查步驟。如果您在瀏覽器中輸入的URL填充了工作表中的值,請使用之前發(fā)布的ESP8266代碼更新您的 GScriptID 。
輸出
我添加了一行圖表以可視化發(fā)布在 DataLogger 表上的傳感器數據的時間序列。圖表的來源范圍足夠大,可以覆蓋ESP8266發(fā)送的任何新數據。您還可以添加一個量規(guī)以顯示最新的土壤濕度數據。
圖表基于NodeMCU在DataLogger工作表上發(fā)布的數據
下面是 DataLogger 工作表的快速視圖。水分數據帶有時間戳記。
ESP8266發(fā)布的傳感器數據每隔一分鐘
責任編輯:wv
-
ESP8266
+關注
關注
50文章
962瀏覽量
45170
發(fā)布評論請先 登錄
相關推薦
評論