ESP8266-01是一个出色的模块,可消除我们对物联网项目的所有需求。自发布以来,它已经建立了强大的社区,并发展成为易于使用,便宜且功能强大的Wi-Fi模块。另一个更加流行的开源平台是Arduino,它已经围绕着它构建了许多项目。将这两个平台结合起来将为许多创新项目打开大门,因此在本教程中,我们将学习如何将ESP8266-01模块与Arduino接口。这样,我们将能够在Arduino和Internet之间发送或接收数据。
在本教程中,我们将使用带ESP8266-01的API从互联网上读取时间,日期,温度和湿度。然后将这些值发送到Arduino开发板,并在16 * 2 LCD屏幕上显示它们。听起来不错吧!!因此,让我们开始吧。
所需材料:
- Arduino开发板(任何版本)
- ESP8266-01
- 带有3.3V选项的FTDI编程器板
- 16x2 LCD
- 电位器
- 按钮
- 连接线
- 面包板
如何工作?
在我们深入之前,重要的是要知道这件事实际上是如何工作的。基本上,我们必须从ESP8266-01模块开始。我们将使用Arduino IDE对ESP8266进行编程,并将编写代码以使用API通过http请求读取JSON文件。然后,我们将用短语表示该JSON文件,以仅从完整的JSON文件中提取所需的信息。
信息成语后,我们将使用串行通讯将其打印出来。这些串行线随后将连接到Arduino,以便Arduino可以读取从ESP8266发送的信息。一旦信息被读取和处理,我们将在LCD屏幕上显示它。
没关系,如果您还没有完全理解这一点,因为我们将在本教程的其余部分中学习相同的内容。
编写ESP8266-01:
本教程假设您具有ESP8266模块的一些经验。如果不是这样,建议您通读以下三个教程以完全了解它。
- ESP8266-01入门
- 使用AT指令对ESP8266-01进行编程
- 使用Arduino IDE编程ESP8266-01并刷新其内存
您还可以在此处查看我们所有的ESP8266项目。
在这里,我们将使用Arduino IDE来对ESP8266-01模块进行编程。对于硬件,我们使用3.3V的FTDI板对ESP8266进行编程,因为它将使硬件更加简单。ESP8266与FTDI板的连接电路图如下所示。
确保满足以下条件
1. ESP8266-01只能承受3.3V的电压,请勿使用5V的电压。因此,仅在3.3V模式下设置FTDI。
2. GPIO_0必须接地才能进入编程模式
3.复位引脚应通过按钮连接到接地引脚。应该在上传代码之前按下此按钮。每次按下该按钮,ESP8266-01模块上的蓝色LED都会变高,表示模块已重置。
连接完成后,打开Arduino IDE并检查是否能够成功上传示例程序。如果不确定如何使用Arduino IDE将程序上传到ESP8266,请按照Arduino编程ESP8266进行学习。至此,我假设您已经成功上传了眨眼程序。
。完整的程序在本页的结尾给出,在下面,我将它们解释为小片段。该程序还需要编译Arduino JSON库,因此,如果尚未将库添加到Arduino IDE,请通过从Github从Arduino JSON库下载来添加它。
ESP8266必须连接互联网以获取有关日期,时间,温度和湿度的数据。因此,您必须通过在下面几行中证明SSID和密码来允许它连接到Wi-Fi
const char * ssid =“ JIO-Fi”; //输入您的Wi-Fi SSID const char * password =“ Pas123”; //输入您的Wi-Fi密码
在 setup() 函数内部,我们检查ESP是否能够与Wi-Fi连接,否则,仅通过在串行监视器上打印“ Connecting..”,它将永远在那里等待。
while(WiFi.status()!= WL_CONNECTED){//等待直到Wi-Fi连接 延迟(1000); Serial.print(“ Connecting..”); //打印正在连接..直到建立连接 }
下一步是非常重要的一步。如果Wi-Fi连接成功,我们必须调用http get请求以从Internet读取JSON文件。在本教程中,我使用的是wunderground.com提供的API。因此,如果您打算使用相同的API,则可以进入链接并注册以获得免费的API密钥,或者使用您选择的任何API。完成API的确定后,您将获得以下类似的链接
注意:我已经更改了此链接的API密钥,因此将无法使用。保持您的API密钥安全,不要共享。
我的API用于获取钦奈的天气数据。您可以使用任何API。但是,当您在任何浏览器中加载API时,它都应该返回一个JSON文件。例如,我的API返回以下JSON文件
您的文件可能会返回包含不同数据的文件。我们可以通过读取ESP8266并通过以下几行在串行监视器上打印JSON来检查ESP8266是否也接收了该JSON文件
int httpCode = http.GET(); // 如果(httpCode> 0){//检查返回代码 //有效载荷= http.getString(); //将值存储在 varibale Payload中以进行调试// // Serial.println(payload); //打印有效载荷以进行调试,否则注释两行
我评论了这些行,因为它们仅用于测试。一旦确保ESP8266能够获取JSON数据,就可以开始编写数据了。如您所见,这些数据非常庞大,除了日期,时间,温度和湿度这些对我们而言必不可少的值外,其他大多数值均无用。
因此,我们使用JSON Arduino库来分隔所需的值并将其存储在变量中。这是可能的,因为JSON文件中的值被分配为名称值对。因此,此名称是一个字符串,其中包含我们所需的值。
为此,我们必须转到一个网站,该网站将分析JSON文件并提供Arduino代码。是的,就是那样简单。转到https://arduinojson.org/assistant/,然后粘贴我们在浏览器中加载的JSON文件,然后按Enter。完成后,我的情况如下所示
向下滚动以查看自动创建的短语编制程序
您所需要做的就是选择所需的变量,将其复制并粘贴到您的Arduino IDE上,就像我在这里所做的那样
/ *使用JSON librarey来对数据进行相符* / //使用https://arduinojson.org/assistant/来获取JSON字符串的短语值const size_t bufferSize = JSON_OBJECT_SIZE(0)+ JSON_OBJECT_SIZE(1)+ JSON_OBJECT_SIZE(2) + 2 * JSON_OBJECT_SIZE(3)+ JSON_OBJECT_SIZE(8)+ JSON_OBJECT_SIZE(12)+ JSON_OBJECT_SIZE(56)+ 2160; DynamicJsonBuffer jsonBuffer(bufferSize); JsonObject&root = jsonBuffer.parseObject(http.getString()); / *短语数据结尾* / //将值sin寻址到所需变量 JsonObject¤t_observation = root; //在current_observation下, JsonObject¤t_observation_observation_location = current_observation; //在observation_location下 const char * current_observation_station_id = current_observation; //“ ICHENNAI1” //获取位置详细信息 const char * current_observation_local_time_rfc822 = current_observation; //本地时间//获取本地时间 const char * current_observation_temperature_string = current_observation; //“ 90.7 F(32.6 C)” //获取温度值 const char * current_observation_relative_humidity = current_observation; //“ 73%” //获取湿度值
我刚刚复制了变量 current_observation_station_id,current_observation_local_time_rfc822,current_observation_temperature_string和current_observation_relative_humidity 。由于我们计划在LCD屏幕上仅显示这四个数据。
最后,我们从互联网上获得了所需的数据,并将其保存为一个变量,可以方便地使用。要将这些数据发送到Arduino,我们只需 通过串行监视器串行写入它们。以下几行将完全相同
//通过串行监视器 Serial.print(current_observation_station_id) 打印变量//将位置详细信息发送到Arduino delay(100); //稳定性延迟 Serial.print(current_observation_local_time_rfc822); //将本地时间详细信息发送到Arduino delay(100); //稳定性延迟 Serial.print(current_observation_temperature_string); //将温度详细信息发送到Arduino delay(100); //稳定性延迟 Serial.print(current_observation_relative_humidity); //将湿度详细信息发送到Arduino delay(100); //稳定延迟
请注意,由于命令 Serial.println() 会附加/ n和/ r以及我们不需要的数据,因此我使用了 Serial.print() 而不是 Serial.println() 。我们还添加了10秒的延迟,以便ESP仅在10秒的间隔内将这些值发送给Arduino。
将ESP8266-01与Arduino连接:
到目前为止,我们已经对ESP8266-01进行了编程,以每隔10秒的时间从Internet读取所需的数据并将其串行发送出去。现在我们必须将ESP与Arduino接口,以便我们可以读取此串行数据。我们还必须向Arduino添加一个16 * 2 LCD显示屏,以便我们可以显示从ESP8266模块接收的数据。的电路图接口的ESP8266模块与Arduino的如下所示
确保GPIO_0引脚没有空,仅使用Arduino的3.3V引脚为模块供电,然后按按钮将ESP模块放入操作模块。现在,我们上传到ESP的程序应该已经开始工作,并且该模块应该通过串行引脚将数据发送到Arduino。这些串行引脚连接到Arduino上的引脚编号6和7。因此,我们可以使用Arduino上的软件串行选项从引脚读取这些串行数据。
Arduino程序和工作方式:
该完整的Arduino的程序也与在本页面末尾的ESP代码给出沿。您可以向下滚动以查看程序,或者如果您想了解该程序,请进一步阅读。
接口程序非常简单,我们只需要使用软件串行库从引脚6和7读取数据并将它们显示在LCD屏幕上即可。由于接收到的数据是字符串格式的,因此我们必须使用substring选项将有效负载破坏到我们的要求,或者根据需要甚至将其转换为整数。因此,我们首先定义LCD连接到的引脚。
const int rs = 8,en = 9,d4 = 10,d5 = 11,d6 = 12,d7 = 13;// LCD连接到 LiquidCrystal LCD的引脚(rs,en,d4,d5,d6,d7);
由于我们已将ESP8266的Rx和Tx引脚与Arduino的第6和第7引脚相连,因此我们必须初始化这些引脚的 软件串行 ,以便我们可以从它们接收串行数据。我将其命名为ESP_Serial,您可以随便命名
ESP_Serial(6,7); // Tx,Rx
在 setup() 函数中,我们初始化用于串行监视器和软件串行的串行通信。如果您可以回忆,我们使ESP程序以9600波特率进行通信,因此我们必须对软件串行端口使用相同的波特率。我们还会在LCD上显示一则简短的介绍性消息2秒钟。
void setup(){lcd.begin(16,2); //我们正在使用16 * 2 LCD显示屏lcd.print(“ Arduino&ESP”); //显示介绍性信息Serial.begin(115200); ESP_Serial.begin(9600); delay(2000); lcd.clear(); }
在main loop() 函数内部,我们必须检查ESP8266是否正在发送任何东西。如果是,那么我们从ESP8266读取字符串,并将其保存到一个称为有效负载的变量中。可变有效负载的类型为String,它将保存从ESP8266模块发送的完整信息。
而(ESP_Serial.available()> 0){有效负载= ESP_Serial.readString();
现在,我们必须将此字符串拆分为小块,以便可以将其用于自己的目的,在这种情况下,我们必须将其拆分以在LCD屏幕上显示。使用 Arduino中的 substring 函数可以很容易地做到这一点。您必须知道每个字符的位置才能使用此 子字符串 功能。您可以在串行监视器上打印有效负载,以了解字符的位置,并使用它们对子字符串进行分类,如下所示
local_date = payload.substring(14,20); local_time = payload.substring(26,31); 温度= payload.substring(48,54); 湿度= payload.substring(55,60);
现在,我可以继续使用这些变量在串行监视器上打印它们,或仅在LCD上打印它们。但是,在串行监视器上打印它们将有助于我们检查子字符串是否正确分割。接下来,我们使用以下几行将它们打印在LCD显示屏上
lcd.clear(); lcd.setCursor(1,0); lcd.print(local_date); lcd.setCursor(8,0); lcd.print(local_time); lcd.setCursor(1,1); lcd.print(温度); lcd.setCursor(10,1); lcd.print(湿度);
将程序上传到Arduino,并确保连接如上电路图所示。调整液晶显示屏的对比度,直到您清楚地看到事物为止。您应该在LCD上看到Intro消息,然后几秒钟后,LCD屏幕上将显示日期,时间,温度和湿度等详细信息,如下所示。
您还可以注意到,每次输入数据时,ESP8266上的蓝色指示灯都会闪烁。如果看不到此消息,则表示ESP不在编程模式下,请尝试按“复位”按钮,同时检查连接。
与此类似,您可以使用任何API从互联网获取任何必需的数据,并将其提供给Arduino并使用Arduino处理您的工作。互联网上有大量的API,您可以使用这些API进行无数个项目。希望您理解该项目并喜欢构建它。如果您遇到任何问题,请将其发布在下面的评论部分或我们的论坛上。
您可以在这里找到我们所有与ESP8266相关的项目。