×

使用ESP8266的基础知识

消耗积分:2 | 格式:zip | 大小:0.12 MB | 2023-02-07

分享资料个

描述

介绍

以下项目使用土壤湿度传感器、DHT11 温度传感器和 ESP8266 来收集温度、湿度和水分读数并将它们发送到 ThingSpeak。本文将帮助您学习使用 ESP8266 的基础知识,并通过 ThingSpeak 等 API 将传感器数据发送到网站。

传感器简介

 
DHT11传感器
 

DHT11温湿度传感器模块是一款基本型、低成本的数字温湿度传感器。它使用电容式湿度传感器和热敏电阻来测量周围的空气,并在数据引脚上输出数字信号(不需要模拟输入引脚)。

 
土壤水分传感器
 

土壤湿度传感器模块对环境湿度最为敏感,一般用于检测土壤的含水量;模块在土壤湿度小于设定阈值时DO口输出高电平,当土壤湿度超过设定阈值时,模块D0输出低电平;小板数字输出D0可直接与单片机相连,单片机检测高低,从而检测土壤水分;小板数字量输出DO店继电器模块可直接驱动蜂鸣器模块,可组成土壤水分报警设备;小板模拟量输出AO和AD模块通过AD转换器相连,可以得到更准确的土壤水分值。

编程 ESP8266

为了通过互联网发送数据,我们需要先将 ESP8266 连接到 WI-FI 网络,然后对其进行编程以收集值并将其发送到 ThingSpeak API。

其代码解释如下:

首先你需要下载 ESP8266 和 ThingSpeak 的库,你可以在这里找到:

ThingSpeak 库:https ://github.com/mathworks/thingspeak-arduino

要下载 ESP8266 库,请按照以下步骤操作:

  • 现在打开 Arduino IDE 并单击File > Preferences
  • 一个窗口会打开这样
image_wQa1gdd233.png?auto=compress%2Cformat&w=740&h=555&fit=max
窗口弹出
 
  • 将 URL 粘贴到框中,然后单击“确定”。
  • 现在转到工具 > 板 > 板管理器。
image_UNI8MqqBsv.png?auto=compress%2Cformat&w=740&h=555&fit=max
董事经理
 
  • 如图所示在方框上输入“ESP8266”,您将获得安装选项,选择最新版本并单击安装。

现在,为了使用ESP8266,首先配置如下威廉希尔官方网站 。此外,确保在继续之前从 Arduino UNO 中移除微控制器,

esp01_bb_kbz54maVw8.png?auto=compress%2Cformat&w=740&h=555&fit=max
闪烁的 ESP 设置
 

现在,我们首先需要将 ESP8266 设置为编程模式,我们使用以下步骤执行此操作:

  • 打开威廉希尔官方网站 电源。
  • 按住闪光灯开关
  • 在按住闪光灯开关的同时,一次复位开关。
  • 现在,松开闪光灯开关

如果正确执行此过程,您可能会看到 ESP8266 中的蓝色 LED 闪烁。完成这些步骤后,我们可以继续上传实际程序

下面简单了解一下程序:

#include "ThingSpeak.h"
#include 
//------- WI-FI details ----------//
char ssid[] = " "; //SSID here
char pass[] = " "; // Passowrd here
//--------------------------------//
//----------- Channel details ----------------//
unsigned long Channel_ID =  ; // Your Channel ID
const char * myWriteAPIKey = " "; //Your write API key
//-------------------------------------------//
const int Field_Number_1 = 1;
const int Field_Number_2 = 2;
const int Field_Number_3 = 3;
String value = "";
int value_1 = 0, value_2 = 0, value_3 = 0;
int x, y, z;
WiFiClient  client;

首先,我们包含库并设置所需的变量。在 ssid 和 pass 下提供您的 Wi-Fi 凭据(名称和密码)。分别给出通道 ID 和写入 API 密钥。如果你想知道如何设置 thingspeak,你可以参考这个网站:Thingspeak 设置和基础 - Robo India || 教程 || 学习阿杜诺 || 机器人学由于我们的项目中将包含三个字段(湿度、温度、水分),因此我们使用三个变量作为字段编号,三个变量作为值。

void setup()
{
 Serial.begin(115200);
 WiFi.mode(WIFI_STA);
 ThingSpeak.begin(client);
 internet();
}

在设置下,我们只需将波特率设置为 115200 并初始化 Wi-Fi 和 ThingSpeak 客户端模式。

void internet()
{
 if (WiFi.status() != WL_CONNECTED)
 {
   while (WiFi.status() != WL_CONNECTED)
   {
     WiFi.begin(ssid, pass);
     delay(5000);
   }
 }
}
void upload()
{
 ThingSpeak.writeField(Channel_ID, Field_Number_1, value_1, myWriteAPIKey);
 delay(15000);
 ThingSpeak.writeField(Channel_ID, Field_Number_2, value_2, myWriteAPIKey);
 delay(15000);
 ThingSpeak.writeField(Channel_ID, Field_Number_3, value_3, myWriteAPIKey);
 delay(15000);
 value = "";
}

互联网和上传功能被定义为将 ESP8266 连接到 Wi-Fi 并将接收到的数据上传到 Thingspeak。

现在,这是核心部分:

void loop()
{
 internet();
 if (Serial.available() > 0)
 {
   delay(100);
   while (Serial.available() > 0)
   {
     value = Serial.readString();
     if (value[0] == '*')
     {
       if (value[7] == '#')
       {
         value_1 = ((value[1] - 0x30) * 10 + (value[2] - 0x30));
         value_2 = ((value[3] - 0x30) * 10 + (value[4] - 0x30));
         value_3 = ((value[5] - 0x30) * 10 + (value[6] - 0x30));
       }
     }
   }
 }
 upload();
}

为了发送数据,我们首先将其对齐到所需的流中,然后添加开始和停止符号。这可以用一个例子来解释:

假设在给定时间,温度、湿度和湿度的值分别为30C、71% 和 62% 这些值中的每一个最大值都可以是 2 位整数。如果所有这些值都以相同的顺序写在一起,那就是30-71-62 或者在程序中我们会将其视为字符串“ 307162 ”。通过这种方式,我们将传感器值发送到串行端口,随后由 ESP8266 中的程序分离。但是,我们必须定义一个开始和停止符号来区分两组值。这是使用作为“*”(星号)的起始符号和作为“#”(散列)的终止符号来完成的。

因此,为此我们声明空字符串类型变量。在Arduino程序中你会看到,当我们要向这个变量写入数据时,首先向串口发送开始符号,然后发送数据流,最后发送停止符号。

在程序中,这些值使用索引简单地分开。

value_1 保存温度,value_2 保存湿度,value_3 保存水分值。

请注意,您不能发送小数值根据我们用来发送数据的方法,这是可以理解的。

所以,现在如果您已按照描述将 ESP8266 设置为编程模式,您就可以通过 ESP8266 上传代码了。再次确保所有连接正确不要ESP8266任何引脚连接5V 否则烧毁IC _ 此外,记住上传代码之前从Arduino板上移除控制器还要确保选择_ 作为GENERICESP8266模块”。

完成这些步骤后,您可以按上传按钮。

Arduino编程

现在您已经完成了 ESP8266 的编程。我们可以继续上传 Arduino 程序。确保移除 ESP8266 连接,然后继续。另外,将开发板更改为 'Arduino UNO'

该威廉希尔官方网站 中使用的传感器需要一个模拟引脚和一个数字引脚。DHT11 通过数字引脚读取,该数字引脚在程序中设置为引脚 5。土壤湿度传感器引脚设置为 A0 模拟引脚。

现在,如前所述,我们不能使用十进制数。这在发送温度和湿度值时成为一个问题。因此,我们使用 round() 函数形式的“math.h”库来解决这个问题。此函数只是将十进制数近似为最接近的整数。

编程的工作简要说明如下:

DHT11

为了使用 DHT11,我们需要安装它的库:https ://drive.google.com/open?id=1aWuF115pMaZbySQS2CIHBxJiPSM1ezhE

现在为了获得读数,我们只需使用函数dht.humiditydht.temperature ,这会为我们提供相应的十进制值。为了发送使用这些数据,我们通过简单地将值传递为 round(DHT.humidity) 和 round(DHT.temperature) 来四舍五入。

mySerial.print('*'); // Starting char
mySerial.print(round(DHT.temperature)); //2 digit data
mySerial.print(round(DHT.humidity)); //2 digit data

您还可以参考 DHT11 的示例程序以更好地理解代码

这是 DHT11 的连接:

image_4AIWpLfgtx.png?auto=compress%2Cformat&w=740&h=555&fit=max
DHT11连接器
 

请注意,此数据引脚连接到引脚 2。您可以通过更改示例程序中的引脚值来连接到所需的引脚。

土壤湿度

土壤湿度传感器值在模拟引脚上读取。首先,您需要知道在您的湿润土壤样本中使用时土壤水分的最大模拟输出是多少。只需按照此处所示进行连接,并上传以下代码:(观察串行绘图仪)

void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600); delay(2000);
}
void loop() {
 // put your main code here, to run repeatedly:
 Serial.print("Start");
 Serial.println(analogRead(A0));
}
soil_moisture_bb_7isN9NtboI.png?auto=compress%2Cformat&w=740&h=555&fit=max
土壤水分连接
 

现在将传感器放入土壤中,查看达到的最大读数。该值将代表 100% 的湿度。在我的例子中,这是 550。现在为了获得相应的整数百分比值,我们使用 map() 函数。模拟读数是在 op_value 变量中获取的,所以我们所做的就是:

op_value = map(op_value, 550, 0, 0, 100);

这样写意味着 550 是 100%,0 是 0%。

这就是循环语句现在的样子

ack = 0;
 int chk = DHT.read11(DHTxxPIN);
 switch (chk)
 {
   case DHTLIB_ERROR_CONNECT:
     ack = 1;
     break;
 }
 if (ack == 0)
 {
   Serial.print("Temperature(*C) = ");
   Serial.println(DHT.temperature);
   Serial.print("Humidity(%) = ");
   Serial.println(DHT.humidity);
   op_value = analogRead(A0);
   op_value = map(op_value,550,0,0,100);
   Serial.print("Moisture(%): ");
   Serial.print(op_value);
   Serial.print("%");
   Serial.println("\n ------------------------- \n");
   //------Sending Data to ESP8266--------//
   mySerial.print('*'); // Starting char
   mySerial.print(round(DHT.temperature)); //2 digit data
   mySerial.print(round(DHT.humidity)); //2 digit data
   mySerial.print(op_value); //2 digit data
   mySerial.println('#'); // Ending char
   //------------------------------------//
   delay(2000);
 }
 if (ack == 1)
 {
   Serial.print("NO DATA");
   Serial.print("\n\n");
   delay(2000);
 }

我们使用 ack 变量来简单地检查 DHT 是否正确连接。请注意,不需要对土壤水分值使用 round() 函数,因为它已经是一个 2 位整数。

将威廉希尔官方网站 配置为与显示的各个部分相同。上传 Arduino 代码时,确保 ESP8266 的 GPIO0 和 RST 没有接地。

威廉希尔官方网站

连接最终应该是这样的:

DHT11

数据引脚-->pin5

Vcc------>5V

地线------>地线

土壤水分传感器

A0-------->A0

Vcc-------->5V

地线------>地线

ESP8266

3.3V------>3.3V

EN---------->3.3V

地线------>地线

Rx-------->pin10

Tx---------->pin11

RST------>断开连接

GPIO0----->断开连接

GPIO2------>断开连接

最后威廉希尔官方网站 可能看起来像这样:

 
 
 
20210710_202504_dmcKMRi7sz.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 
1 / 2
 

物语

您将收到的第一组数据全为零。这可确保您的 Wi-Fi 连接和 ThingSpeak 连接都正常运行。现在,请记住我们在发送每个字段的读数之前添加了 15 秒的延迟。因此,将所有数据发送到各自的字段总共需要 45 秒。阅读图表可能如下所示:

 
 
 
grap1_CI3iHYpgqg.PNG?auto=compress%2Cformat&w=740&h=555&fit=max
 
1 / 3
 

您可以进一步通过简单的 Matlab 代码将数据相互比较。在使用 thingSpeakRead() 函数时,我们使用参数 NumMinutes 来检索指定持续时间内的数据。所以,写 10 意味着检索 10 分钟前的数据。

此外,由于 15 秒的延迟,在每个字段中的新读数之前,它们将始终是两个 NaN 值。因此,我们使用 ~isnan() 从变量中删除这些值。

确保填写通道 ID 和读取 API 密钥变量:

grap4_tBfRxCd8Eg.PNG?auto=compress%2Cformat&w=740&h=555&fit=max
湿度与水分
 
readID =  ;
readkey = ' ';
hum =  thingSpeakRead(readID, 'Field', 2, 'NumPoints', 10, 'ReadKey', readkey);
moist= thingSpeakRead(readID, 'Field', 3, 'NumPoints', 10, 'ReadKey', readkey);
hum = hum(~isnan(hum));
moist = moist(~isnan(moist));
stem(moist(end-10:end),hum(end-10:end)')
xlabel('Moisture(%)')
ylabel('Humidity(%)')
grap5_HCdjVN6kD5.PNG?auto=compress%2Cformat&w=740&h=555&fit=max
温度与湿度
 
readID =  ;
readkey = ' ';
temp =  thingSpeakRead(readID, 'Field', 1, 'NumMinutes', 10, 'ReadKey', readkey);
moist= thingSpeakRead(readID, 'Field', 3, 'NumMinutes', 10, 'ReadKey', readkey);
temp = temp(~isnan(temp));
moist = moist(~isnan(moist));
stem(moist(end-10:end),temp(end-10:end)')
xlabel('Moisture (%)');
ylabel('Temperature (C)');

错误

以下是您可能会遇到的错误:

  • ESP8266错误:

如果您遇到此错误,则表示您上传代码时 ESP8266 未处于编程模式。所以,首先要确保你的连接是正确的。特别检查接地引脚连接到 GPIO0 和 RST 此外,请确保您使用与本文中相同的 esp 和 thingspeak 库,以避免任何进一步的错误。

image_IR36LHlWAu.png?auto=compress%2Cformat&w=740&h=555&fit=max
 
  • ThingSpeak 错误:

发送到 ThingSpeak 的第一个读数将全部为零。这表明 ESP8266 和 ThingSpeak 之间已成功建立连接。现在,如果您只收到零,那么您可能需要检查是否正在传递来自 Arduino 的数据。我们这样做如下,

打开您的串行监视器并以*XXXXXX# 格式键入任何随机值,这类似于我们发送传感器值的方式。如果您在图表中看到结果,则表示正在传递值。但是,传感器值不是我们需要的正确整数格式。查看您是否可以找到在串行端口中发送的整数类型,确保在 myserial.print() 函数中传递的值使用 round() 函数或基于您的程序的任何其他方法四舍五入。唯一的要求是值必须是 2 位整数。

 

这是因为变量没有足够的值来制作绘图。正如代码中提到的,它需要10 个值来制作 plot 此外,它从过去 10 分钟的操作中获取这 10 个值因此,如果您在那么长的时间内没有使用该系统,那么您将没有足够的价值。您可以随时根据需要更改绘制图形的持续时间。但请记住,第一次运行系统时,您将需要等待 10-15 分钟才能获得绘图。您可以将程序更改为较短的持续时间,但请记住,无论您选择什么持续时间,它都必须足以让 10 个值准备好在现场使用。您可以进行的最短持续时间为 5 分钟。


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

评论(0)
发评论

下载排行榜

全部0条评论

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

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用ESP8266的基础知识',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);