植物通讯器
组件和用品
| × | 1 |
应用和在线服务
| ||||
|
关于这个项目
注意:本教程可能已过时,请转到 这里 获取最新版本。
简介
正如英国诗人华兹华斯曾经说过的:
“你的思想是花园,你的思想是种子,收获可以是鲜花或杂草。”
让你的植物保持活力可能是一个很大的挑战,因为它们不善于交流。
让他们开心的一种方法是带上你的植物,但也许你不想带着从冬季夹克口袋里伸出来的那种大仙人掌或蕨类植物。此外,大多数植物不喜欢寒冷。
在花了几个月的时间试图与我们的蜘蛛植物进行通信之后,我们放弃了,并使用 MKR IoT Bundle 组件来创建一个设备,该设备可以远程调查任何植物的健康状况。
简而言之:
在这个实验中,您将学习如何使用 Arduino 魔法保护植物并确保它们存活下来。
通过监测湿度、温度和光照,您可以确保植物生长良好。它可以每天发送电子邮件和图表,并通知您它的需求。
组件
- TMP36 温度传感器
- 光电晶体管
- DIY 湿度传感器
学习目标
- 介绍 Zapier 互联网服务
- 发送 HTTP 请求
- 管理实时时钟和闹钟
- 制作 DIY 湿度传感器
- 使用 thingSpeak 绘制值 #ProTips
- 使用 HTML 和 CSS 设计您的电子邮件#ProTips
- 使用 PostMan 测试 API #ProTips
想了解更多?
本教程是让您熟悉 MKR1000 和 IoT 的一系列实验的一部分。所有实验都可以使用 MKR IoT Bundle 中包含的组件构建。
- 爱你的枕头
- 拼图盒
- 巴甫洛夫的猫
- 书呆子
- 工厂通讯员
设置 Zapier
Zapier 是一个在线自动化工具,可以为我们轻松管理其他应用程序的 API。如果我们要使用的应用程序具有无法由 Arduino 管理的复杂 API,它是组合多个任务的绝佳工具。
在我们的例子中,我们将使用它发送一封电子邮件,其中包含从 Arduino 检索到的数据。
按照这几个简单的步骤来创建您自己的 zap!
图> 图> 图>为了继续,我们需要首先复制给定的 URL 来测试我们的钩子,然后选择当您按继续时出现的测试和审查按钮。将这些参数添加到 URL:
custom_webhook_URL?temperature=0&moisture=0&light=0&warning=0
现在只需将此 URL 复制并粘贴到新的浏览器页面上即可。
您应该会看到如下响应:
图>恭喜!您刚刚发送了一个 http 请求!
这正是我们将用我们的 Arduino 板做的事情。 但是,我们不会将该 URL 粘贴到浏览器页面中,而是将其直接发送到 Zapier 服务器。此外,我们将使用我们的传感器值修改现在设置为零的参数值。
有关测试和使用 API 的更高级方法,请查看 #ProTip 在页面底部。
在测试您的请求后,您可以继续创建 Zap。
使用 Do This... 继续编辑
图> 图> 图> 图> 图> 图> 图>检查您的邮箱以查看从 Zapier 生成的电子邮件。它将来自您在 gmail 配置的第一步中使用的帐户。
设立董事会
为了实现所有功能,我们将使用以下库:
- WiFi101 // 连接到互联网并扫描网络
- RTCZero // 管理时间触发事件
您可以按照本指南中的说明从库管理器下载它们。
为了使用 Zapier 的 API,我们首先需要上传证书 在 MKR1000 上。 这适用于大多数在线服务和 API!
从 WiFi101 库上传固件更新程序示例并添加 hooks.zapier.com 到域。
> examples> WiFi101> FirmwareUpdater
如果您使用的是 Arduino Web 编辑器,此功能尚未实现,您需要通过 Arduino 桌面应用程序。
图> 图>
发送 HTTP 请求
我们现在准备从 Arduino 板发送 HTTP 请求。
现在,我们将为我们的参数设置一个任意值,稍后将用实际传感器值替换该值。
浮点温度 =22;内部水分 =150;内部光 =40; String warning ="这是一条警告信息";警告.replace(" ", "%20");
请注意,必须对字符串进行编码 ,因为不能在 HTTP 请求中发送空格。所有空格都替换为编码的等效 %20
设置好参数后,我们将调用 send_email()
函数,它将所有这些转换为字符串,并且将重建我们之前使用的相同 URL 然后将其发布到 Zapier 服务器。
使用您的 WiFi 凭据和您从 Zapier 收到的 URL 填写此草图并上传。
#include #include const char* ssid =SECRET_SSID; // 您的网络 SSID(名称) const char* password =SECRET_PSWD; // 您的网络密码 String httpsRequest =SECRET_REQUEST; // 你的 Zapier URL const char* host ="hooks.zapier.com"; WiFiSSLClient客户端;无效设置(){ Serial.begin(9600);而(!串行);延迟(2000); Serial.print("连接无线网络:"); Serial.println(ssid); while (WiFi.begin(ssid, password) !=WL_CONNECTED) { Serial.print(".");延迟(500); Serial.println(""); Serial.println("WiFi 已连接"); } void loop() { 浮动温度 =22;内部水分 =150;内部光 =40; String warning ="这是一条警告信息";警告.replace(" ", "%20");发送电子邮件(温度、湿度、光线、警告); delay(20000) } void send_email(float temperature, int water, int light, String warning) { // 将值转换为字符串 String _temperature =String(temperature);字符串_水分=字符串(水分); String _light =String(light);字符串 _warning =警告; if (client.connect(host, 443)) { client.println("POST" + httpsRequest + "?temperature=" + _temperature + "&moisture=" + _moisture + "&light=" + _light + "&warning=" + _warning + " HTTP/1.1"); client.println("主机:" + String(host)); client.println("连接:关闭");客户端打印();延迟(1000); while (client.available()) { // 在控制台打印服务器的回答 char c =client.read();串行写入(c);客户端停止(); // 与服务器断开连接 } else { Serial.println("无法连接到客户端"); } }
它会每 20 秒向您选择的地址发送一封电子邮件。
请注意请求,Zapier 每月只允许您进行 100 个免费请求。
RTC 和警报
我们可以使用 MKR1000 的实时时钟在每天的某个时间发送一封电子邮件。
此草图将时间和日期设置为 2017 年 12 月 4 日 16:00然后在每天 16:01 触发警报。
请注意,由于警报附加到中断 功能我们不能包括任何延迟 ,但我们可以使用布尔变量来触发 loop()
中的动作
#include RTCZero rtc; // 创建 RTC 对象 /* 更改这些值以设置当前初始时间 */ const byte seconds =0; const 字节分钟 =0; const 字节小时 =16; /* 更改这些值以设置当前初始日期 */ const byte day =4; const 字节月 =12; const 字节年 =17; bool email_already_sent =false;无效设置(){ Serial.begin(9600);而(!串行);延迟(2000); rtc.begin(); // 初始化 RTC 24H 格式 rtc.setTime(hours, minute, seconds); rtc.setDate(日、月、年); rtc.setAlarmTime(16, 1, 0); // 设置 Arduino 发送电子邮件的时间 rtc.enableAlarm(rtc.MATCH_HHMMSS); rtc.attachInterrupt(alarmMatch); } void loop() { if (!email_already_sent) { // send_email(); email_already_sent =true; } } void alarmMatch() { // 当闹钟响起时触发 Serial.println("Alarm Match!"); email_already_sent =false; } 代码>
DIY土壤水分传感器
放置在土盆中的两根电线形成一个可变电阻器,其电阻因土壤湿度而异 .
这个可变电阻连接在分压器配置中,Arduino 收集与 2 条线之间的电阻成正比的电压。
这意味着土壤越潮湿,Arduino 测量的电压就越小。
使用 1 兆欧电阻器 和两根电线,我们就可以制作我们的 DIY 土壤湿度传感器!
上传以下草图,您可以开始读取传感器的值,我们建议您先在干燥的土壤中开始测试 并记下您读取的值。
该值将用于设置阈值 以便 Arduino 知道您的植物何时需要水并向您发送紧急电子邮件。
int materialPin =A2; // 根据您使用的电阻设置此三值 // 校准此值的最简单方法是在干土壤和湿土壤中测试传感器 int Threeshold =800;无效设置(){ Serial.begin(9600);而(!串行);延迟(2000); } void loop() { Serial.println(get_average_moisture());延迟(5000); } int get_average_moisture() { // 取 10 个值的平均值更准确 int tempValue =0; // 临时存储水分值的变量 (int a =0; a <10; a++) { tempValue +=analogRead(moisturePin);延迟(100); } 返回临时值 / 10; } 代码>
添加温度和光传感器
请参阅下面的示意图以连接两个传感器。我们将使用这两个函数从传感器读取值:
float get_temperature(){ int reading =analogRead(A1);浮动电压 =读数 * 3.3;电压 /=1024.0; // 以摄氏度为单位打印温度浮点温度 C =(电压 - 0.5) * 100; //从每度 10 mv 转换为 500 mV 偏移 // 转换为华氏浮点温度 F =(温度 C * 9.0 / 5.0) + 32.0;回水温度C; } int get_light(){ int light_value=analogRead(A0);返回光值; } 代码>
请注意,您可以通过返回 temperatureF
来使用华氏度单位 而不是 temperatureC
#ProTip:使用 ThingSpeak 绘制值
对于你们所有的控制狂,这里是在一个漂亮的图表中绘制所有数据的说明,如下所示:
我们将使用 ThingSpeak 平台绘制图表,按照以下步骤开始。
图> 图>下载 ThingSpeak 库,让我们开始吧。下面的草图每分钟将传感器值上传到云端,只需填写您的 WiFi 凭据和您频道的 API 密钥并上传。
#include #include #include "ThingSpeak.h" const char* ssid =SECRET_SSID; // 您的网络 SSID(名称) const char* password =SECRET_PSWD; // 您的网络密码 WiFiClient ThingSpeakClient;无符号长 myChannelNumber =356392; const char * myWriteAPIKey =SECRET_WRITE_API; int lightPin =A0; //光传感器连接到的模拟引脚 int tempPin =A1; //TMP36 的 Vout (sense) 引脚连接到的模拟引脚 int 湿气Pin =A2;无效设置(){ Serial.begin(9600);而(!串行);延迟(2000); Serial.print("连接无线网络:"); Serial.println(ssid); while (WiFi.begin(ssid, password) !=WL_CONNECTED) { Serial.print(".");延迟(500); Serial.println(""); Serial.println("WiFi 已连接"); ThingSpeak.begin(ThingSpeakClient);} void loop() { ThingSpeak.setField(1, get_light()); ThingSpeak.setField(2, get_temperature()); ThingSpeak.setField(3, get_average_moisture()); ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); Serial.println("消息发送到云端");延迟(60000); // 每 1 分钟发送一次值 } float get_temperature() { int reading =analogRead(tempPin);浮动电压 =读数 * 3.3;电压 /=1024.0; // 以摄氏度为单位打印温度浮点温度 C =(电压 - 0.5) * 100; //从每度 10 mv 转换为 500 mV 偏移 // 转换为华氏浮点温度 F =(温度 C * 9.0 / 5.0) + 32.0;回水温度C; }int get_average_moisture() { // 取 10 个值的平均值以更准确 int tempValue =0; // 临时存储水分值的变量 (int a =0; a <10; a++) { tempValue +=analogRead(moisturePin);延迟(10); } 返回临时值 / 10; } int get_light() { int light_value =analogRead(A0);返回光值; } 代码>
在下面的完整 Pro 草图 您可以看到如何将此上传附加到每分钟触发的 RTC 警报。
不幸的是 Gmail 不允许我们嵌入 图表 和 iframes 在电子邮件的正文中,但我们可以通过电子邮件在一个漂亮的按钮中发送链接,请参阅下面的提示。
我们选择了 ThingSpeak,但还有很多替代品!以 Dweet.io 和 freeboard.io 为例。
#ProTip:设计您的电子邮件
Zapier 允许我们在正文中嵌入一些 html 和 css 代码 的电子邮件。我们可以使用它来发送非常风格化的电子邮件,如下所示:
要实现此结果,只需将 正文类型更改为 html 在 Zapier 界面上添加自定义 HTML 和 CSS。
图>复制并粘贴此模板:
HELLO !
这是您关于花园的每日更新#9752;
♨温度:{{querystring__温度}} C
☔水分:{{_querystring__moisture}}
☀光:{{querystring__light}}
{{querystring__warning}}
查看图表
#ProTip:使用 PostMan 测试 API
处理 HTTP 请求可能很困难,幸运的是有很多工具可以帮助我们构建所需的 URL。
邮递员就是一个很好的例子:
只需粘贴 Zapier 给出的初始 URL,添加参数并发送即可。它将打印出来自服务器的响应并为您编写 URL。
代码
完成草图
#ProTips 完整草图
示意图
制造工艺