|
LoRa是由Semtech公司引入的一种无线射频技术,旨在用于在不消耗大量功率的情况下将双向信息传输到长距离。如果您不熟悉LoRa,请先查看LoRa模块与Arduino开发板的连接方法。
在本篇文章中,我们将学习如何将LoRa模块SX1278与ESP32结合使用。在这里,我们将使用两个LoRa模块-一个连接到ESP32,另一个连接到Arduino开发板。 ESP32 LoRa设置将从任何给定城市的API请求天气数据,并将其发送到Arduino LoRa设置。然后Arduino LoRa将接收数据并将其显示在LCD显示屏上。因此ESP32 LoRa部分将作为发射器,而Arduino LoRa部分将充当接收器。在ESP32上还连接了OLED,实现在发射器显示温度和湿度。
所需的组件 ● ESP32控制器 ● Arduino Uno开发板 ● Arduino Lora扩展版 ● LoRa-02 SX1278模块 ● LCD模块1602 ● OLED显示模组 ● 面包板 ● 跳线
电路原理图 以下是LoRa发射器/服务器和接收器/客户端部分的电路图。在本文中,我们将使用LoRa SX1278模块将天气数据从ESP32模块发送到Arduino Uno开发板。温度和湿度数据将使用API从Internet读取,然后从ESP32模块使用LoRa模块发送到Arduino。
发射器部分 - ESP32与LoRa模块的连接图 在发送端,我们将ESP32连接到LoRa模块和OLED显示屏。电路图如下所示。
下表列出了ESP32和SX1278模块之间的完整连接。 LoRa SX1278模块 | ESP32 | 3.3V | 3.3V | GND | GND | NSS | D5 | DIO0 | D2 | SCK | D18 | MISO | D19 | MOSI | D23 | RST | D14 |
接收器部分 - LoRa模块与Arduino UNO的连接 在接收器方面,我们使用一款Arduino Lora扩展板。该扩展板由SX1278模块和一个LM317稳压器设计的3.3V稳压器组成。 扩展板直接插在Arduino上面,为其提供LoRa功能。 LoRa Arduino扩展板的完整电路图如下:
获取天气数据的API链接 如前所述,我们需要API链接才能从Internet请求天气数据。在这里,我们将使用WeatherAPI,该API具有非常简单易用的API,可让我们检索天气信息。因此,首先在网站上注册账户以获取API链接。
注册后,转到“My Account”并获取API。 API密钥用于发出获取数据的请求。
现在返回并单击“ API Explorer”
现在,在“API Explorer”页面上,输入API和城市名称。
然后向下滚动并单击“Show Response”按钮制作一个请求。它将为您提供API密钥。
现在,将您的API URL粘贴到新的浏览器标签中,查询的输出将如下所示(JSON数据):
获取JSON数据后,生成代码,我们可以通过该代码读取JSON数据并根据需要对其进行断句设置。转到ArduinoJson Assistant,然后将JSON数据粘贴到Input部分中。
现在向下滚动到解析程序,然后复制对您有用的代码部分。
ESP32 LoRa发射器代码 LoRa发射器和接收器端的完整代码在文档末尾给出。在这里,我们主要解释一些重要的代码片段。
首先,包括所有必需的库。 SPI.h用于ESP32与LoRa之间的SPI通信,Wire.h库用于I2C设备之间的通信。您可以从此处下载所需的库: ● Wire.h ● SH1106.h ● Sandeep Mistry提供的LoRa库。 - #include <HTTPClient.h>
- #include <WiFi.h>
- #include <ArduinoJson.h>
- #include <SPI.h>
- #include <LoRa.h>
- #include <Wire.h>
- #include<SH1106.h>
复制代码
然后为OLED显示器创建一个实例,该实例包括地址和连接显示器的引脚。 - SH1106 display(0x3c, 21, 22);
复制代码之后,输入Wi-Fi名称和密码。 ESP32需要互联网连接从网站获取天气数据。 - const char* ssid = "Wi-fi Name";
- const char* pass = "Password";
复制代码在接下来的几行代码中,定义连接LoRa模块的引脚。 - #define ss 5
- #define rst 14
- #define dio0 2
复制代码
现在,输入之前生成的API链接。使用此链接,我们将获得Jaipur的温度和湿度数据。 - Const char* url = "http://api.weatherapi.com/v1/current.json?key=ade61a8aef37445d8c0100632202407&q=Jaipur";
复制代码
在setup()函数中,我们将使用115200的波特率初始化串口监视器,并使用begin()函数初始化OLED显示屏和LoRa通信。 - Serial.begin(115200);
- Serial.println(ssid);
- WiFi.begin(ssid, pass);
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- }
- LoRa.setPins(ss, rst, dio0);
- while (!LoRa.begin(433E6)) {
- }
- LoRa.setSyncWord(0xF3);
- }
复制代码
在void loop()函数中,我们将检查ESP32是否接收到JSON文件,并使用以下代码在串口监视器上打印输出JSON数据。 - int httpCode = https.GET();
- if (httpCode > 0) {
- String payload = https.getString();
- char charBuf[500];
- payload.toCharArray(charBuf, 500);
- Serial.println(payload);
复制代码之后,使用通过ArduinoJson Assistant生成的分词程序。此分词程序将为我们提供Jaipur的温度和湿度数据。 - const size_t capacity = JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(8) + JSON_OBJECT_SIZE(23) + 490;
- DynamicJsonDocument doc(capacity);
- const char* json = "{"location":{"name":"Jaipur","region":"Rajasthan","country":"India","lat":26.92,"lon":75.82,"tz_id":"Asia/Kolkata","localtime_epoch":1595741089,"localtime":"2020-07-26 10:54"},"current":{"last_updated_epoch":1595740520,"last_updated":"2020-07-26 10:45","temp_c":31,"temp_f":87.8,"is_day":1,"condition":{"text":"Mist","icon":"//cdn.weatherapi.com/weather/64x64/day/143.png","code":1030},"wind_mph":0,"wind_kph":0,"wind_degree":0,"wind_dir":"N","pressure_mb":1008,"pressure_in":30.2,"precip_mm":0,"precip_in":0,"humidity":66,"cloud":50,"feelslike_c":32.2,"feelslike_f":89.9,"vis_km":5,"vis_miles":3,"uv":8,"gust_mph":7.2,"gust_kph":11.5}}";
- deserializeJson(doc, json);
- long current_last_updated_epoch = current["last_updated_epoch"];
- const char* current_last_updated = current["last_updated"]; //
- int current_temp_c = current["temp_c"]; // 31
- int current_humidity = current["humidity"]; // 66
复制代码
最后,我们将温度和湿度值发送到LoRa接收器。 - LoRa.beginPacket();
- LoRa.print("Temperature: ");
- LoRa.print(current_temp_c);
- LoRa.print("c");
- LoRa.print("Humidity: ");
- LoRa.print(current_humidity);
- LoRa.endPacket();
复制代码
Arduino LoRa接收器代码 同样,首先我们添加LoRa模块和LCD的库,并定义LCD连接到的引脚。 - #include <SPI.h>
- #include <LoRa.h>
- #include <LiquidCrystal.h>
- constintrs = 8, en = 7, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
- LiquidCrystallcd(rs, en, d4, d5, d6, d7);
复制代码
在loop()函数中,我们接收来自发送器模块的数据包。收到数据包后,Arduino开始读取它们作为字符并将其打印在LCD上。当它收到关键字“ c”时,它将剩余信息打印在第二行。 - void loop() {
- intpacketSize = LoRa.parsePacket();
- if (packetSize) {
- Serial.print("Received packet '");
- while (LoRa.available()) {
- char incoming = (char)LoRa.read();
- if (incoming == 'c')
- {
- lcd.setCursor(0, 1);
- }
- else
- {
- lcd.print(incoming);
- }
复制代码
ESP32 LoRa设置的工作过程 我们将硬件和程序准备就绪后,将代码上传到ESP32和Arduino模块中。发射器模块会将温度和湿度值发送到接收器模块。接收器LoRa模块将数值在LCD上进行显示,如下所示。
代码 以下是本文使用的完整代码:
main.rar
(2.03 KB, 下载次数: 51)
|