电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>带有MKR WiFi 1010的植物通讯器

带有MKR WiFi 1010的植物通讯器

2022-11-01 | zip | 0.14 MB | 次下载 | 免费

资料介绍

介绍

正如英国诗人威廉·华兹华斯曾经说过的:

“你的思想是花园,你的思想是种子,收获可以是花朵或杂草。

“让你的植物保持活力可能是一个相当大的挑战,因为它们非常不善于沟通。让它们开心的一种方法是把你的植物带在身边,但也许你不想带着那个大仙人掌到处走走,或者蕨类植物从你的冬季夹克口袋里伸出来。

此外,大多数植物不喜欢寒冷。在花了几个月的时间尝试与我们的蜘蛛植物进行通信后,我们放弃并使用 MKR IoT Bundle 组件创建了一个可以远程调查任何植物健康状况的设备。

简而言之

在这个实验中,您将学习如何保护您的植物并确保它们能够生存以及如何使用 Arduino 魔法。

通过监测湿度、温度和光照,您可以确保您的植物生长良好。

它可以每天发送电子邮件和图表,并通知您它的需求。

成分

学习目标

  • 介绍 Zapier 互联网服务
  • 发送 HTTP 请求
  • 构建一个 DIY 湿度传感器
  • 使用 thingSpeak #ProTips绘制值
  • 使用 HTML 和 CSS #ProTips为您的电子邮件设置样式
  • 使用 PostMan #ProTips测试 API

想知道更多?

教程是让您熟悉 MKR WiFI 1010 和 IoT 的一系列实验的一部分。所有实验都可以使用 MKR IoT Bundle 中包含的组件构建。

  • 带有 MKR WiFi 1010 的植物通讯器

设置 Zapier

Zapier是一款在线自动化工具,可以方便地为我们管理其他应用的 API。它是组合多个任务的好工具,或者如果我们要使用的应用程序具有无法由 Arduino 管理的复杂 API。

在我们的例子中,我们将使用它发送一封电子邮件,其中包含从 Arduino 检索到的数据。

按照这几个简单的步骤来创建自己的 zap!

 
 
 
pYYBAGNgtciAdCVKAABXMXl2YG4208.png
 
1 / 4创建您的 Zapier 帐户或登录并创建一个新的 Zap
 

为了继续,我们需要先复制给定的 URL 来测试我们的钩子,然后选择按下 Continue 时出现的 Test and Review 按钮将这些参数添加到 URL:

Custom_Webhook_URL?temperature=0&moisture=0&light=0&warning=0 

现在只需将此 URL 复制并粘贴到新的浏览器页面上。您应该会看到如下响应:

 
 
 
poYBAGNgtc-ADJFUAABgm9kaB0U902.png
 
1 / 2将使用我们的附加参数形成的 URL 粘贴到 Web 浏览器中应该会产生上述结果。
 

恭喜!您刚刚发送了一个http 请求!

这正是我们将使用我们的 Arduino 板做的事情。但是,我们不会将该 URL 粘贴到浏览器页面中,而是将其直接发送到 Zapier 服务器。此外,我们将使用我们的传感器值修改现在设置为零的参数值。

有关测试和使用 API 的更高级方法,请查看页面底部的#ProTip 。

测试您的请求后,您可以继续创建 Zap。

继续编辑执行此操作...

 
 
 
poYBAGNgtdSAH9_tAABuyCIxZuE612.png
 
1 / 8我们创建 Zap,从应用程序中选择 Gmail
 

检查您的邮箱以查看 Zapier 生成的电子邮件。它将来自您在 gmail 配置的第一步中使用的帐户。

设立董事会

为了实现所有功能,我们将使用以下库:

  • WiFiNINA // 连接到互联网并扫描网络
  • RTCZero // 管理时间触发事件

您可以按照本指南中的说明从库管理器下载它们

发送 HTTP 请求

我们现在准备从 Arduino 板发送 HTTP 请求。现在我们将为我们的参数设置一个任意值,稍后将用真实的传感器值替换。

float temperature = 22;
int moisture = 150;
int light = 40;  
String warning = "This is a warning message";
warning.replace(" ", "%20");  

请注意,必须对字符串进行编码,因为不能在 HTTP 请求中发送空格。所有空格都替换为编码的等价物%20

设置好参数后,我们将调用该send_email()函数,它将所有参数转换为字符串,并重建我们之前使用的相同 URL,然后将其发布到 Zapier 服务器。

使用您的 WiFi 凭据和您从 Zapier 收到并上传的 URL 填写此草图。

#include 
#include
const char* ssid = SECRET_SSID;    //  your network SSID (name)
const char* password = SECRET_PSWD;  // your network password
String httpsRequest = SECRET_REQUEST; // your Zapier URL
const char* host = "hooks.zapier.com";
WiFiSSLClient client;
void setup() {
 Serial.begin(9600);
 while (!Serial);
 delay(2000);
 Serial.print("Connecting Wifi: ");
 Serial.println(ssid);
 while (WiFi.begin(ssid, password) != WL_CONNECTED) {
   Serial.print(".");
   delay(500);
 }
 Serial.println("");
 Serial.println("WiFi connected");
}
void loop() {
 float temperature = 22;
 int moisture = 150;
 int light = 40;
 String warning = "This is a warning message";
 warning.replace(" ", "%20");
 send_email(temperature, moistue, light, warning );
 delay(20000)
}
void send_email(float temperature, int moisture, int light, String warning) {
 // convert values to String
 String _temperature = String(temperature);
 String _moisture = String(moisture);
 String _light = String(light);
 String _warning = warning;
 if (client.connect(host, 443)) {
   client.println("POST " + httpsRequest + "?temperature=" + _temperature + "&moisture=" + _moisture + "&light=" + _light + "&warning=" + _warning + " HTTP/1.1");
   client.println("Host: " + String(host));
   client.println("Connection: close");
   client.println();
   delay(1000);
   while (client.available()) { // Print on the console the answer of the server
     char c = client.read();
     Serial.write(c);
   }
   client.stop();  // Disconnect from the server
 }
 else {
   Serial.println("Failed to connect to client");
 }
}

它会每 20 秒向您选择的地址发送一封电子邮件。

请注意请求,Zapier 每月只允许您 100 个免费请求。

RTC 和警报

我们可以使用 MKR WiFi 1010 的实时时钟在每天的某个时间发送一封电子邮件。

此草图将时间和日期设置为 2017 年 12 月 4 日 16:00,然后在每天 16:01 触发警报。

请注意,由于警报附加到中断函数,我们不能包含任何延迟,但我们可以使用布尔变量来触发循环()中的动作

#include 
RTCZero rtc; // create RTC object
/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 0;
const byte hours = 16;
/* Change these values to set the current initial date */
const byte day = 4;
const byte month = 12;
const byte year = 17;
bool email_already_sent = false;
void setup() {
 Serial.begin(9600);
 while (!Serial);
 delay(2000);
 rtc.begin(); // initialize RTC 24H format
 rtc.setTime(hours, minutes, seconds);
 rtc.setDate(day, month, year);
 rtc.setAlarmTime(16, 1, 0);  // Set the time for the Arduino to send the email
 rtc.enableAlarm(rtc.MATCH_HHMMSS);
 rtc.attachInterrupt(alarmMatch);
}
void loop() {
 if (!email_already_sent) {
   // send_email();
   email_already_sent = true;
 }
}
void alarmMatch() { // triggered when the alarm goes on
 Serial.println("Alarm Match!");
 email_already_sent = false;
}

DIY土壤湿度传感器

放置在土壤盆中的两根电线形成一个可变电阻器电阻根据土壤湿度而变化该可变电阻器以分压器配置连接,Arduino 收集与 2 根导线之间的电阻成比例的电压。这意味着土壤越潮湿,Arduino 测量的电压越小。使用1 兆欧电阻和两根电线,我们可以创建自己的 DIY 土壤湿度传感器!

 
poYBAGNgtdeAN1zMAAF0d254r7w452.png
 

上传以下草图,您可以开始读取传感器的值,我们建议您先在干燥的土壤中开始测试,并记下您读取的值。

该值将用于设置阈值,以便 Arduino 知道您的植物何时需要水并向您发送紧急电子邮件。

int moisturePin = A2;
// Set this threeshold accordingly to the resistance you used
// The easiest way to calibrate this value is to test the sensor in both dry and wet soil
int threeshold = 800;
void setup() {
 Serial.begin(9600);
 while (!Serial);
 delay(2000);
}
void loop() {
 Serial.println(get_average_moisture());
 delay(5000);
}
int get_average_moisture() { // make an average of 10 values to be more accurate
 int tempValue = 0; // variable to temporarly store moisture value
 for (int a = 0; a < 10; a++) {
   tempValue += analogRead(moisturePin);
   delay(100);
 }
 return tempValue / 10;
}

添加温度和光传感器

请参阅下面的示意图来连接两个传感器。我们将使用这两个函数从传感器读取值:

float get_temperature() {
 int reading = analogRead(A1);
 float voltage = reading * 3.3;
 voltage /= 1024.0;
 // Print tempeature in Celsius
 float temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mV offset
 // Convert to Fahrenheit
 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
 return temperatureC;
}
int get_light() {
 int light_value = analogRead(A0);
 return light_value;
} 

请注意,您可以通过返回temperatureF而不是使用华氏单位temperatureC

#ProTip:使用 ThingSpeak 绘制值

对于你们所有的控制狂来说,这里是把收集到的所有数据绘制成一个漂亮的图表的说明,如下所示:

 
pYYBAGNgteCAPXPYAAAkVaQr33M540.png
温度图
 

我们将使用 ThingSpeak 平台绘制图表,按照以下步骤开始。

 
 
 
 
pYYBAGNgteOAUOFeAAGNk-mrDRk895.png
 
1 / 3连接到 ThingSpeak 并创建一个帐户
 

下载ThingSpeak库,让我们开始吧。下面的这个草图将每分钟将传感器值上传到云端,只需填写您的 WiFi 凭据和您的频道的 API 密钥并上传。

#include 
#include
#include "ThingSpeak.h"
const char* ssid = SECRET_SSID;    //  your network SSID (name)
const char* password = SECRET_PSWD;  // your network password
WiFiClient  ThingSpeakClient;
unsigned long myChannelNumber = 356392;
const char * myWriteAPIKey = SECRET_WRITE_API;
int lightPin = A0; //the analog pin the light sensor is connected to
int tempPin = A1; //the analog pin the TMP36's Vout (sense) pin is connected to
int moisturePin = A2;
void setup() {
 Serial.begin(9600);
 while (!Serial);
 delay(2000);
 Serial.print("Connecting Wifi: ");
 Serial.println(ssid);
 while (WiFi.begin(ssid, password) != WL_CONNECTED) {
   Serial.print(".");
   delay(500);
 }
 Serial.println("");
 Serial.println("WiFi connected");
 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("message sent to cloud");
 delay(60000); // send values every 1 minute
}
float get_temperature() {
 int reading = analogRead(tempPin);
 float voltage = reading * 3.3;
 voltage /= 1024.0;
 // Print tempeature in Celsius
 float temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mV offset
 // Convert to Fahrenheit
 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
 return temperatureC;
}
int get_average_moisture() { // make an average of 10 values to be more accurate
 int tempValue = 0; // variable to temporarly store moisture value
 for (int a = 0; a < 10; a++) {
   tempValue += analogRead(moisturePin);
   delay(10);
 }
 return tempValue / 10;
}
int get_light() {
 int light_value = analogRead(A0);
 return light_value;
}

在下面的完整 Pro 草图中,您可以看到如何将此上传附加到每分钟触发的 RTC 警报。

不幸的是,Gmail 不允许我们在电子邮件正文中嵌入图表iframe,但我们可以通过电子邮件以漂亮的按钮发送链接,请参阅下面的提示。

我们选择了 ThingSpeak,但还有很多选择!Dweet.iofreeboard.io为例。

#ProTip:样式化您的电子邮件

Zapier 允许我们在电子邮件正文中嵌入一些 html 和 css 代码。我们可以使用它来发送非常风格化的电子邮件,如下所示:

 
pYYBAGNgteeAQ4WVAAA7acv1tQg930.png
程式化的电子邮件正文
 

要实现这个结果,只需在 Zapier 界面上将正文类型更改为 html并添加您的自定义 HTML 和 CSS。

 
 
 
poYBAGNgteqAHWptAABlQt_DjsE416.png
 
1 / 2要获得精美的电子邮件,请粘贴下面的 hTML 代码,并将正文类型更改为 Html
 

复制并粘贴此模板:

html> 
<html> 
<head> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
<style> 
.container{ 
margin-left: 10%; 
margin-right: 10%; 
background-color: #ECF1F1; 
min-height: 100%; 
padding-top: 5%; 
padding-bottom: 10%; 
font-family: monospace; 
letter-spacing: 2px; 
} 
.title{ 
text-align: center; 
color: #0CA1A6; 
font-size: 1.5em; 
padding-top: 0.2vh; 
} 
.subtitle{ 
text-align: center; 
color: #0CA1A6; 
font-size: 1.1em; 
padding-bottom: 4%; 
padding-left: 4%; 
padding-right: 4%; 
} 
.data{ 
padding-bottom: 2%; 
padding-top: 2%; 
padding-left: 5%; 
margin-left: 15%; 
margin-right: 15%; 
background-color: #F7F9F9; 
text-align: left; 
color: #4E5B61; 
font-size: 1em; 
font-weight: bold; 
} 
.bttn{ 
padding-bottom: 3%; 
padding-top: 3%; 
margin-left: 25%; 
margin-right: 25%; 
margin-top: 10%; 
background-color: #00979D; 
text-align: center; 
color: #F7F9F9; 
font-size: 1.4em; 
} 
.disclaimer{ 
text-align:center; 
color:#DA5B4A; 
font-size: 1.1em; 
font-weight: bold; 
margin-top: 10%; 
} 
.bttn:hover{ 
background-color: #008184; 
} 
a{ 
text-decoration: none; 
} 
style> 
head> 
<body> 
<div class="container"> 
<h2 class="title">HELLO !h2> 
<h4 class="subtitle">Here's your daily update about your garden h4> 
<div class="data">      Temperature: {{querystring__temperature}} C div> 
<div id="humidity" class="data">     Moisture: {{_querystring__moisture}}div> 
<div  class="data">     Light: {{querystring__light}}div> 
<div  class="disclaimer">{{querystring__warning}}div> 
<a href="your_link_to_thingSpeak"> 
<div class="bttn">SEE THE GRAPHdiv> 
a> 
div> 
body> 
html> 

#ProTip:使用 PostMan 测试 API

处理 HTTP 请求可能很困难,幸运的是有很多工具可以帮助我们构建所需的 URL。Postman 就是一个很好的例子:

 
pYYBAGNgteyAG6sYAAB9srEO69s376.png
 

只需粘贴 Zapier 给出的初始 URL,添加参数并发送即可。它将打印出服务器的响应并为您编写 URL。


下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费