在过去的几年中,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数据记录到Google电子表格
相关帖子
查看如何使用ESP8266发送电子邮件和短信。
查看我们的天气Web服务器项目,用于使用ESP8266本地存储传感器读数。
查看我们的 ThingSpeak温湿度记录器项目,用于使用ESP8266进行远程服务器数据记录示例
该项目基本上有两个部分。第一部分是设置ESP8266硬件以读取土壤湿度传感器的输出。第二部分涉及创建Google工作表,并将其配置为使用本教程随附的Google App脚本通过ESP8266模块通过Internet发送的传感器数据。
硬件设置
此该项目使用了一个非常简单且便宜的土壤湿度传感器(您可以在 eBay 或 Aliexpress 上以1美元的价格购买)套件,该套件包括两个裸露的金属焊盘和一个仪表电路板。裸露的垫子充当探测土壤中水分含量的探针。土壤中的水越多,意味着两个垫之间的电导率越高,反之亦然。随附的仪表板可提供随土壤湿度变化的模拟输出电压。仪器电路由3.3V电源供电,其输出馈送到NodeMCU的模拟输入通道(A0)。
土壤湿度传感器由裸露的金属焊盘和仪器电路
注意: 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 \ 。
在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脚本中将需要。
您的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脚本
创建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 。
作为Web应用程序部署
在发布过程中,Google会要求授予一些权限,您需要允许这些权限。
测试进度
如果操作正确,则以下测试应该成功。复制发布过程中收到的Web应用程序URL,如上所示进行格式化,然后将此字符串粘贴到Web浏览器URL字段中。您应该在 DataLogger 工作表中看到以下信息,如下所示。
测试数据发布到Google工作表
到目前为止还好吗?如果没有,请仔细检查步骤。如果您在浏览器中输入的URL填充了工作表中的值,请使用之前发布的ESP8266代码更新您的 GScriptID 。
输出
我添加了一行图表以可视化发布在 DataLogger 表上的传感器数据的时间序列。图表的来源范围足够大,可以覆盖ESP8266发送的任何新数据。您还可以添加一个量规以显示最新的土壤湿度数据。
图表基于NodeMCU在DataLogger工作表上发布的数据
下面是 DataLogger 工作表的快速视图。水分数据带有时间戳记。
ESP8266发布的传感器数据每隔一分钟
责任编辑:wv
-
ESP8266
+关注
关注
50文章
962浏览量
45086
发布评论请先 登录
相关推荐
评论