怎样使用ESP8266将数据发布到Google工作表

电子说

1.2w人已加入

描述

在过去的几年中,ESP8266平台蓬勃发展,并成为电子爱好者和物联网爱好者中最受欢迎的硬件工具之一。 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云端硬盘的普通用户,那么您会发现Google表格比所有这些IoT云平台更容易接近。在本教程中,我将描述一种将ESP8266设备直接连接到Google表格以存储传感器数据而无需使用任何第三方插件的方法。作为说明,我正在使用一个 NodeMCU 板,该板从插入我的花盆的土壤湿度传感器读取模拟输出,并直接连接到Google云端硬盘上的电子表格以存储数据。

ESP8266

ESP8266数据记录到Google电子表格

相关帖子

查看如何使用ESP8266发送电子邮件和短信。

查看我们的天气Web服务器项目,用于使用ESP8266本地存储传感器读数。

查看我们的 ThingSpeak温湿度记录器项目,用于使用ESP8266进行远程服务器数据记录示例

该项目基本上有两个部分。第一部分是设置ESP8266硬件以读取土壤湿度传感器的输出。第二部分涉及创建Google工作表,并将其配置为使用本教程随附的Google App脚本通过ESP8266模块通过Internet发送的传感器数据。

硬件设置

此该项目使用了一个非常简单且便宜的土壤湿度传感器(您可以在 eBay 或 Aliexpress 上以1美元的价格购买)套件,该套件包括两个裸露的金属焊盘和一个仪表电路板。裸露的垫子充当探测土壤中水分含量的探针。土壤中的水越多,意味着两个垫之间的电导率越高,反之亦然。随附的仪表板可提供随土壤湿度变化的模拟输出电压。仪器电路由3.3V电源供电,其输出馈送到NodeMCU的模拟输入通道(A0)。

ESP8266

土壤湿度传感器由裸露的金属焊盘和仪器电路

注意: ESP8266模拟输入可以处理最大1V的输入电压。但是,NodeMCU在板上实现了一个分压器电路,以将输入电压范围扩展到3.3V。

软件

让我们首先尝试了解在尝试发送时实际发生的情况数据到Google的尽头。很明显,我们将使用GET请求通过URL来发送数据,该URL的模式为 https://script.google.com/。..。。当您在网络浏览器中输入该URL时,Google服务器响应,要求浏览器通过新的GET请求重定向到域为 script.googleusercontent.com 的另一个URL。对于Web浏览器,URL重定向是很常见的事情,它可以正常工作。然而,对于ESP8266,这不是直截了当的。 ESP8266需要正确解码从第一台服务器收到的标头信息以提取重定向URL并向新服务器发出第二个GET请求。为了简化重定向,Sujay Phadke(aka electronicsguy )已共享在GitHub上,以Arduino库的形式编写了一段精美的代码,名为 HTTPSRedirect 。 Arduino的其他示例还使用第三方API服务(例如 pushingbox )将数据发布到Google电子表格,以处理Google的https要求和URL重定向。 HTTPSRedirect 库的使用通过避免需要任何第三方服务而使任务更加简单。因此,您需要做的第一件事是从GitHub复制HTTPSRedirect库文件并将其安装到Arduino库文件夹中。为了方便起见,我还在以下链接上发布了压缩的库文件。

下载HTTPS重定向库

更新:以上库已过时。

请转到GitHub Sujay Phadke并下载更新的库。感谢Sujay。

要将其安装到您的计算机上,只需下载上述压缩文件,解压缩并移动名为 HTTPSRedirect 的文件夹即可。到您的Arduino库位置。在Windows PC上,它通常转到 C:\ Users \\ Documents \ Arduino \ libraries \ 。

ESP8266

在Windows PC上的Arduino IDE库路径

确保已复制的库文件夹中同时存在HTTPSRedirect.cpp和HTTPSRedirect.h文件。

程序ESP8266将数据发送到Google Sheets

下面发布的是使用Arduino IDE编写的ESP8266代码,用于读取土壤湿度传感器的输出并将其发布到Google云端硬盘上的Google Sheet中。为了使其适合您的情况,您需要更新与您的匹配的 ssid 和 密码 WiFi网络。另外,您还需要获取 * GScriptId ,只能在发布所需的Google App脚本后获得。本教程底部将说明获取 * GScriptId 的过程。传感器数据每15分钟发布到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 。 状态 ( ) != 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 ( “连接失败。正在重试…” ) ;

}

//连接状态,1 =已连接,未连接为0。

序列 。 println ( “连接状态:” + 字符串 ( 客户端 已连接 ( ) ) ) ;

序列 。 刷新 ( ) ;

如果 ( ! 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 ) ;

}

//继续以给定的时间间隔推送数据

void loop ( ) {

//读取模拟值,在这种情况下为土壤湿度

int 数据 = 1023 – analogRead ( AnalogIn ) ;

//发布这些信息

postData ( “土壤水分” , 数据 ) ;

延迟 ( dataPostDelay ) ;

}

您还可以从以下链接下载NodeMCU代码。

下载NodeMCU代码

创建Google表格

在您的Google Dri中创建Google电子表格ve,并将其命名为 DataCollector 。将当前/活动工作表重命名为摘要,然后添加第二个工作表,将其命名为 DataLogger 。在工作表的URL地址栏中,将d/和/edit之间的字符串复制并保存到某处。这是电子表格的唯一共享密钥,以后在Google Apps脚本中将需要。

ESP8266

您的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的一些信息,如下图所示

ESP8266

Goolge表格–摘要标记

在 DataLogger 表中,在 A1,B1,C1和D1 中键入 ID,DateTime,标记和值

ESP8266

Google表格数据记录器选项卡

Google Apps脚本

创建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应用程序部署

下一步是发布脚本,以便可通过URL访问。为此,请发布》作为Web应用程序部署。

注意:每当您修改代码时,都必须创建一个“新建”项目版本并发布,否则您仍然会遇到相同的旧代码。

复制 当前网络应用的URL 并将其保存在需要的地方用于提取 GScriptID 。我通常将其保存在mycode中作为注释。 Web应用程序URL如下所示:

https://script.google.com/macros/s/–您的Google脚本ID–/exec?tag = test&value = -1

s/和/exec之间的字符串?是您的 GScriptID 。

ESP8266

作为Web应用程序部署

在发布过程中,Google会要求授予一些权限,您需要允许这些权限。

测试进度

如果操作正确,则以下测试应该成功。复制发布过程中收到的Web应用程序URL,如上所示进行格式化,然后将此字符串粘贴到Web浏览器URL字段中。您应该在 DataLogger 工作表中看到以下信息,如下所示。

ESP8266

测试数据发布到Google工作表

到目前为止还好吗?如果没有,请仔细检查步骤。如果您在浏览器中输入的URL填充了工作表中的值,请使用之前发布的ESP8266代码更新您的 GScriptID 。

输出

我添加了一行图表以可视化发布在 DataLogger 表上的传感器数据的时间序列。图表的来源范围足够大,可以覆盖ESP8266发送的任何新数据。您还可以添加一个量规以显示最新的土壤湿度数据。

ESP8266

图表基于NodeMCU在DataLogger工作表上发布的数据

下面是 DataLogger 工作表的快速视图。水分数据带有时间戳记。

ESP8266

ESP8266发布的传感器数据每隔一分钟

责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分