风筝
发表于: 2020-2-26 20:34:31 | 显示全部楼层

在过去的几年中,有许多通信技术可用于物联网设备之间的交互连接。在这些技术中,最受欢迎的是Wi-Fi技术和蓝牙模块。但是它们有一些局限性,例如通讯距离限制、接入点数量有限和高功耗。因此,Semtech引入了LoRa技术来解决所有这些问题。使用单节电池,该设备可以运行一年。


在本篇文章中,我们将使用LoRa模块SX1278与NodeMCU ESP8266开发板分别制作一个发射器和接收器电路。然后在0.96英寸I2C OLED显示屏上显示传输的参数。我们将以两个示例学习Lora SX1278和ESP8266通讯。首先,发射器将发送一个简单的数据包,然后检查在接收器是否已接收到数据。第二个示例中,我们将DHT11湿度和温度传感器添加到发送器电路中,并将湿度温度值无线发送到接收器。


所需的组件

以下是制作本文所需的组件

●    Nodemcu ESP8266开发板

●    LoRa SX1278模块

●    DHT11传感器

●    0.96英寸OLED显示屏

●    连接导线

●    面包板


Semtech SX1278 LoRa模块

SX1276 / 77/78/79收发器具有LoRa远程调制解调器,可提供超长距离扩频通信和高抗干扰性,同时将电流消耗降至最低。

LoRa-SX1278.jpg


使用低成本晶振,SX1278可以实现-148dBm以上的灵敏度。高灵敏度与集成的+ 20dBm功率放大器相结合,产生了业界领先的链路预算,使其成为任何需要长距离或稳定性应用的最佳选择。与传统的调制技术相比,Lora SX1278在阻塞和选择性方面还具有显着优势,解决了长距离、抗干扰性和能耗之间平衡的传统设计。


Semtech SX1278引脚排列

市场上有SX1278模块有各种不同版本和类型。但是基本上所有的引脚都具有相同的引脚,因为LoRa SX1278是SPI模块。

SX1278-Pinout.jpg


该SX1278模块具有12个用于与微控制器接口的引脚以及另外两个用于天线的引脚。


DHT11温湿度传感器

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

dht11.png


它使用起来相当简单,但是获取数据时需要严格的时序。该传感器唯一真正的缺点是,您只能每2秒从其中获取一次新数据,因此,在使用库时,传感器的读数可能长达2秒未发生变化。


0.96英寸OLED显示屏

以下是一个0.96英寸的蓝色OLED显示模块。显示模块可以使用SPI / I2C协议与微控制器连接。分辨率为128×64。该模块包括显示电路板、显示屏、预焊接到板上的4针排针。

0.96-OLED-Display.jpg

OLED(有机发光二极管)是一种自发光技术,由置于阳极和阴极之间的多层有机薄膜组成。与LCD技术相比,OLED不需要背光。 OLED在几乎所有类型的显示屏中都具有很高的应用潜力,并且被认为是下一代平板显示器的终极技术。


LoRa SX1278和ESP8266收发器的简单示例

让我们从这个简单示例中了解。首先将将Lora SX1278模块与NodeMCU ESP8266开发板连接。原理图连接和代码如下。


发射器电路

以下是一个简单的发送器电路。如下图所示组装电路。

SX1278-NodeMCU-Transmitter.jpg


连接非常简单。将OLED的SDA和SCL引脚分别连接到Nodemcu的D2、D1。Lora SX1278与NodeMCU ESP8266的连接如下。

NodeMCU引脚
SX1278引脚
GND
GND
3.3V
VCC
D8
NSS
D7
MOSI
D6
MISO
D5
SCK
D0
RST

连接实物如下:

1loratx.jpg


接收器电路

以下是一个简单的接收器电路。如下图所示组装电路。

RX2.jpg

连接非常简单。 Lora SX1278和NodeMCU ESP8266的连接如下。

NodeMCU引脚
SX1278引脚
GND
GND
3.3V
VCC
D8
NSS
D7
MOSI
D6
MISO
D5
SCK
D0
RST
D2
DIO0

RX2-1.jpg


发射器代码

在使用此代码之前,将以下库添加到Arduino IDE:

1. Lora库

2. SSD1306 OLED库

3. Adafruit GFX库

  1. #include <SPI.h>
  2. #include <LoRa.h>
  3. #include <Wire.h>
  4. #include <Adafruit_GFX.h>
  5. #include <Adafruit_SSD1306.h>
  6. #include <DHT.h>

  7. #define SCREEN_WIDTH 128 // OLED display width, in pixels
  8. #define SCREEN_HEIGHT 64 // OLED display height, in pixels

  9. // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
  10. #define OLED_RESET      -1  // Reset pin # (or -1 if sharing Arduino reset pin)
  11. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

  12. #define DHTPIN 0          //pin where the dht11 is connected
  13. #define ss 15
  14. #define rst 16
  15. #define dio0 2
  16. int counter = 0;

  17. DHT dht(DHTPIN, DHT11);
  18. void setup()
  19. {
  20.   Serial.begin(115200);
  21.   dht.begin();

  22.   // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  23.   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
  24.     Serial.println(F("SSD1306 allocation failed"));
  25.     for(;;); // Don't proceed, loop forever
  26.   }
  27.   
  28.   while (!Serial);
  29.   Serial.println("LoRa Sender");
  30.   LoRa.setPins(ss, rst, dio0);
  31.     if (!LoRa.begin(473E6)) {
  32.     Serial.println("Starting LoRa failed!");
  33.     delay(100);
  34.     while (1);
  35.   }
  36.   
  37.   display.display();
  38.   delay(2);
  39.   display.clearDisplay();
  40. }

  41. void loop()
  42. {
  43.   float h = dht.readHumidity();
  44.   float t = dht.readTemperature();

  45.   if (isnan(h) || isnan(t))
  46.   {
  47.   Serial.println("Failed to read from DHT sensor!");
  48.   return;
  49.   }
  50.   Serial.print("Temperature: ");
  51.   Serial.print(t);
  52.   Serial.print(" degrees Celcius, Humidity: ");
  53.   Serial.println(h);
  54.   Serial.println();
  55.   Serial.print("Sending packet: ");
  56.   Serial.println(counter);

  57.   display.clearDisplay();
  58.   display.setTextSize(2);             // Normal 1:1 pixel scale
  59.   display.setTextColor(WHITE);        // Draw white text
  60.   display.setCursor(0,0);             // Start at top-left corner
  61.   display.print(F("Pkt No:"));
  62.   display.print(counter);
  63.   
  64.   display.setCursor(0,20);
  65.   display.print("Tem:");
  66.   display.print(t);
  67.   display.print("C");

  68.   display.setCursor(0,40);
  69.   display.print("Hum:");
  70.   display.print(h);
  71.   display.print("%");
  72.   display.display();
  73.   
  74.   // send packet
  75.   LoRa.beginPacket();
  76.   LoRa.print(F("Pkt No:"));
  77.   LoRa.println(counter);
  78.   
  79.   LoRa.print("Temp: ");
  80.   LoRa.print(t);
  81.   LoRa.println("°C");
  82.   
  83.   LoRa.print("Hum:  ");
  84.   LoRa.print(h);
  85.   LoRa.print("%");
  86.   LoRa.println("");
  87.   
  88.   LoRa.endPacket();

  89.   counter++;

  90.   delay(3000);
  91. }
复制代码

接收器的代码

  1. #include <SPI.h>
  2. #include <LoRa.h>

  3. #define ss 15
  4. #define rst 16
  5. #define dio0 2

  6. void setup() {
  7.   Serial.begin(115200);
  8.   while (!Serial);

  9.   Serial.println("LoRa Receiver Callback");

  10.   LoRa.setPins(ss, rst, dio0);

  11.   if (!LoRa.begin(473E6)) {
  12.     Serial.println("Starting LoRa failed!");
  13.     while (1);
  14.   }

  15.   // register the receive callback
  16.   LoRa.onReceive(onReceive);

  17.   // put the radio into receive mode
  18.   LoRa.receive();
  19. }

  20. void loop() {
  21.   // do nothing
  22. }

  23. void onReceive(int packetSize) {
  24.   // received a packet
  25.   Serial.print("Received packet '");

  26.   // read packet
  27.   for (int i = 0; i < packetSize; i++) {
  28.     Serial.print((char)LoRa.read());
  29.   }

  30.   // print RSSI of packet
  31.   Serial.print("' with RSSI ");
  32.   Serial.println(LoRa.packetRssi());
  33. }
复制代码

运行结果

上载代码后,发射器部分将开始发送数据,接收器部分将开始接收数据。

RX222.jpg

同样,您可以打开串口监视器,并观察已发送和已接收数据包的数量。

SS-LoraSimple.png


使用SX1278和ESP8266发送DHT11传感器湿度温度数据

以下是Loara SX1278和ESP8266组成的发射器电路。如下图所示组装电路。

TX2.jpg

连接非常简单。将OLED的SDA和SCL引脚分别连接到Nodemcu的D2、D1。如下图所示,将DHT11输出引脚连接到D3。类似地,按上述相同方法连接Lora SX1278和NodeMCU ESP8266。


接收器电路的连接与上一个示例相同。无需进行任何更改。


运行结果

上载代码后,发射器部分将开始发送数据,接收器部分将开始接收数据。湿度和温度值可以在OLED屏幕中观察到。

RX2-2.jpg

同样,您可以打开串口监视器,并通过数据包编号观察发送和接收的湿度温度数据。

SS-LoraComplex.png

跳转到指定楼层
mchh
发表于: 2024-1-18 16:32:52 | 显示全部楼层

请问我发消息的时候想指定让另一台设备接收,该怎么设置呢?
回复

使用道具 举报

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

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-21 20:26 , Processed in 0.056714 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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