风筝
发表于: 2020-8-23 11:00:41 | 显示全部楼层

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显示屏。电路图如下所示。

Interfacing-LoRa-with-ESP32.png

Interfacing-LoRa-with-ESP32.jpg


下表列出了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扩展板的完整电路图如下:

Interfacing-LoRa-with-Arduino-UNO.png

Interfacing-LoRa-with-Arduino-UNO.jpg


获取天气数据的API链接

如前所述,我们需要API链接才能从Internet请求天气数据。在这里,我们将使用WeatherAPI,该API具有非常简单易用的API,可让我们检索天气信息。因此,首先在网站上注册账户以获取API链接。


注册后,转到“My Account”并获取API。 API密钥用于发出获取数据的请求。

API-link.png

现在返回并单击“ API Explorer

API-Explorer.jpg

现在,在“API Explorer”页面上,输入API和城市名称。

API-Explorer.png

然后向下滚动并单击“Show Response”按钮制作一个请求。它将为您提供API密钥。

API-KEY.jpg

现在,将您的API URL粘贴到新的浏览器标签中,查询的输出将如下所示(JSON数据):

API-URL.png

获取JSON数据后,生成代码,我们可以通过该代码读取JSON数据并根据需要对其进行断句设置。转到ArduinoJson Assistant,然后将JSON数据粘贴到Input部分中。

ArduinoJson-Assistant.png

现在向下滚动到解析程序,然后复制对您有用的代码部分。


ESP32 LoRa发射器代码

LoRa发射器和接收器端的完整代码在文档末尾给出。在这里,我们主要解释一些重要的代码片段。


首先,包括所有必需的库。 SPI.h用于ESP32与LoRa之间的SPI通信,Wire.h库用于I2C设备之间的通信。您可以从此处下载所需的库:

●    Wire.h

●    SH1106.h

●    Sandeep Mistry提供的LoRa库。

  1. #include <HTTPClient.h>
  2. #include <WiFi.h>
  3. #include <ArduinoJson.h>
  4. #include <SPI.h>
  5. #include <LoRa.h>
  6. #include <Wire.h>
  7. #include<SH1106.h>
复制代码

然后为OLED显示器创建一个实例,该实例包括地址和连接显示器的引脚。

  1. SH1106 display(0x3c, 21, 22);
复制代码

之后,输入Wi-Fi名称和密码。 ESP32需要互联网连接从网站获取天气数据。

  1. const char* ssid = "Wi-fi Name";
  2. const char* pass = "Password";
复制代码

在接下来的几行代码中,定义连接LoRa模块的引脚。

  1. #define ss 5
  2. #define rst 14
  3. #define dio0 2
复制代码

现在,输入之前生成的API链接。使用此链接,我们将获得Jaipur的温度和湿度数据。

  1. Const char* url = "http://api.weatherapi.com/v1/current.json?key=ade61a8aef37445d8c0100632202407&q=Jaipur";
复制代码

setup()函数中,我们将使用115200的波特率初始化串口监视器,并使用begin()函数初始化OLED显示屏和LoRa通信。

  1.   Serial.begin(115200);
  2.   Serial.println(ssid);
  3.   WiFi.begin(ssid, pass);
  4.   while (WiFi.status() != WL_CONNECTED)
  5.   {
  6.     delay(500);
  7.   }
  8.   LoRa.setPins(ss, rst, dio0);
  9.   while (!LoRa.begin(433E6)) {
  10.   }
  11.   LoRa.setSyncWord(0xF3);
  12. }
复制代码

在void loop()函数中,我们将检查ESP32是否接收到JSON文件,并使用以下代码在串口监视器上打印输出JSON数据。

  1. int httpCode = https.GET();
  2.   if (httpCode > 0) {
  3.     String payload = https.getString();
  4.     char charBuf[500];
  5.     payload.toCharArray(charBuf, 500);
  6.     Serial.println(payload);
复制代码

之后,使用通过ArduinoJson Assistant生成的分词程序。此分词程序将为我们提供Jaipur的温度和湿度数据。

  1. const size_t capacity = JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(8) + JSON_OBJECT_SIZE(23) + 490;
  2.   DynamicJsonDocument doc(capacity);
  3.   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}}";
  4.   deserializeJson(doc, json);
  5.   long current_last_updated_epoch = current["last_updated_epoch"];
  6.   const char* current_last_updated = current["last_updated"]; //
  7.   int current_temp_c = current["temp_c"]; // 31
  8.   int current_humidity = current["humidity"]; // 66
复制代码

最后,我们将温度和湿度值发送到LoRa接收器。

  1. LoRa.beginPacket();
  2. LoRa.print("Temperature: ");
  3. LoRa.print(current_temp_c);
  4. LoRa.print("c");
  5. LoRa.print("Humidity: ");
  6. LoRa.print(current_humidity);
  7. LoRa.endPacket();
复制代码

Arduino LoRa接收器代码

同样,首先我们添加LoRa模块和LCD的库,并定义LCD连接到的引脚。

  1. #include <SPI.h>
  2. #include <LoRa.h>
  3. #include <LiquidCrystal.h>
  4. constintrs = 8, en = 7, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
  5. LiquidCrystallcd(rs, en, d4, d5, d6, d7);
复制代码

在loop()函数中,我们接收来自发送器模块的数据包。收到数据包后,Arduino开始读取它们作为字符并将其打印在LCD上。当它收到关键字“ c”时,它将剩余信息打印在第二行。

  1. void loop() {
  2. intpacketSize = LoRa.parsePacket();
  3. if (packetSize) {
  4. Serial.print("Received packet '");
  5. while (LoRa.available()) {
  6. char incoming = (char)LoRa.read();
  7. if (incoming == 'c')
  8.       {
  9. lcd.setCursor(0, 1);
  10.       }
  11. else
  12.       {
  13. lcd.print(incoming);
  14.       }
复制代码

ESP32 LoRa设置的工作过程

我们将硬件和程序准备就绪后,将代码上传到ESP32和Arduino模块中。发射器模块会将温度和湿度值发送到接收器模块。接收器LoRa模块将数值在LCD上进行显示,如下所示。

ESP32-LoRa-Working.jpg


代码

以下是本文使用的完整代码: main.rar (2.03 KB, 下载次数: 49)

跳转到指定楼层
碌碌无为
发表于: 2020-10-20 22:03:46 | 显示全部楼层

楼主您好,若SX1278更换成咱们国产的E32系列的无线传输模块,请问程序编码,区别大吗?谢谢。
回复

使用道具 举报

风筝
发表于: 2020-10-20 22:10:23 | 显示全部楼层

碌碌无为 发表于 2020-10-20 22:03
楼主您好,若SX1278更换成咱们国产的E32系列的无线传输模块,请问程序编码,区别大吗?谢谢。 ...

可以使用 改动不会很大
回复

使用道具 举报

碌碌无为
发表于: 2020-10-21 08:45:34 | 显示全部楼层

风筝 发表于 2020-10-20 22:10
可以使用 改动不会很大

感谢楼主回复。
网上可以找到使用E32的案例不多,能找到的,大多数是转发Renzo Mischianti的帖子,那个帖子,我看了几遍,有的语句前后还存在不对称的地方,试着做了一下,却始终无法通过两个无线模块传输数据;楼主能否针对本帖的内容,改用E32修改一下代码,让我等菜鸟学习一下?再次深表感谢!
回复

使用道具 举报

风筝
发表于: 2020-10-21 09:19:29 | 显示全部楼层

碌碌无为 发表于 2020-10-21 08:45
感谢楼主回复。
网上可以找到使用E32的案例不多,能找到的,大多数是转发Renzo Mischianti的帖子,那个帖 ...

手上暂时没有EBYTE公司的E32模组,晚一点我再尝试做一个教程
回复

使用道具 举报

碌碌无为
发表于: 2020-10-21 10:34:11 | 显示全部楼层

风筝 发表于 2020-10-21 09:19
手上暂时没有EBYTE公司的E32模组,晚一点我再尝试做一个教程

好的,谢谢楼主!
回复

使用道具 举报

songxp03
发表于: 2022-10-17 19:12:39 | 显示全部楼层

我是新手刚入门,电路图用啥话的啊。不像Proteus也不像Altium Designer
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 56 | 回复: 109



手机版|

GMT+8, 2024-12-22 02:12 , Processed in 0.051741 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表