在过去的几年中,有许多通信技术可用于物联网设备之间的交互连接。在这些技术中,最受欢迎的是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远程调制解调器,可提供超长距离扩频通信和高抗干扰性,同时将电流消耗降至最低。
使用低成本晶振,SX1278可以实现-148dBm以上的灵敏度。高灵敏度与集成的+ 20dBm功率放大器相结合,产生了业界领先的链路预算,使其成为任何需要长距离或稳定性应用的最佳选择。与传统的调制技术相比,Lora SX1278在阻塞和选择性方面还具有显着优势,解决了长距离、抗干扰性和能耗之间平衡的传统设计。
Semtech SX1278引脚排列 市场上有SX1278模块有各种不同版本和类型。但是基本上所有的引脚都具有相同的引脚,因为LoRa SX1278是SPI模块。
该SX1278模块具有12个用于与微控制器接口的引脚以及另外两个用于天线的引脚。
DHT11温湿度传感器 DHT11是一款超低成本数字温度和湿度传感器。它使用电容式湿度传感器和热敏电阻来测量周围的空气,并在数据引脚上发出数字信号(无需模拟输入引脚)。
它使用起来相当简单,但是获取数据时需要严格的时序。该传感器唯一真正的缺点是,您只能每2秒从其中获取一次新数据,因此,在使用库时,传感器的读数可能长达2秒未发生变化。
0.96英寸OLED显示屏 以下是一个0.96英寸的蓝色OLED显示模块。显示模块可以使用SPI / I2C协议与微控制器连接。分辨率为128×64。该模块包括显示电路板、显示屏、预焊接到板上的4针排针。
OLED(有机发光二极管)是一种自发光技术,由置于阳极和阴极之间的多层有机薄膜组成。与LCD技术相比,OLED不需要背光。 OLED在几乎所有类型的显示屏中都具有很高的应用潜力,并且被认为是下一代平板显示器的终极技术。
LoRa SX1278和ESP8266收发器的简单示例 让我们从这个简单示例中了解。首先将将Lora SX1278模块与NodeMCU ESP8266开发板连接。原理图连接和代码如下。
发射器电路 以下是一个简单的发送器电路。如下图所示组装电路。
连接非常简单。将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 |
连接实物如下:
接收器电路 以下是一个简单的接收器电路。如下图所示组装电路。
连接非常简单。 Lora SX1278和NodeMCU ESP8266的连接如下。 NodeMCU引脚 | SX1278引脚 | GND | GND | 3.3V | VCC | D8 | NSS | D7 | MOSI | D6 | MISO | D5 | SCK | D0 | RST | D2 | DIO0 |
发射器代码 在使用此代码之前,将以下库添加到Arduino IDE: 1. Lora库 2. SSD1306 OLED库 3. Adafruit GFX库 - #include <SPI.h>
- #include <LoRa.h>
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include <DHT.h>
- #define SCREEN_WIDTH 128 // OLED display width, in pixels
- #define SCREEN_HEIGHT 64 // OLED display height, in pixels
- // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
- #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
- #define DHTPIN 0 //pin where the dht11 is connected
- #define ss 15
- #define rst 16
- #define dio0 2
- int counter = 0;
- DHT dht(DHTPIN, DHT11);
- void setup()
- {
- Serial.begin(115200);
- dht.begin();
- // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
- if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
- Serial.println(F("SSD1306 allocation failed"));
- for(;;); // Don't proceed, loop forever
- }
-
- while (!Serial);
- Serial.println("LoRa Sender");
- LoRa.setPins(ss, rst, dio0);
- if (!LoRa.begin(473E6)) {
- Serial.println("Starting LoRa failed!");
- delay(100);
- while (1);
- }
-
- display.display();
- delay(2);
- display.clearDisplay();
- }
- void loop()
- {
- float h = dht.readHumidity();
- float t = dht.readTemperature();
- if (isnan(h) || isnan(t))
- {
- Serial.println("Failed to read from DHT sensor!");
- return;
- }
- Serial.print("Temperature: ");
- Serial.print(t);
- Serial.print(" degrees Celcius, Humidity: ");
- Serial.println(h);
- Serial.println();
- Serial.print("Sending packet: ");
- Serial.println(counter);
- display.clearDisplay();
- display.setTextSize(2); // Normal 1:1 pixel scale
- display.setTextColor(WHITE); // Draw white text
- display.setCursor(0,0); // Start at top-left corner
- display.print(F("Pkt No:"));
- display.print(counter);
-
- display.setCursor(0,20);
- display.print("Tem:");
- display.print(t);
- display.print("C");
- display.setCursor(0,40);
- display.print("Hum:");
- display.print(h);
- display.print("%");
- display.display();
-
- // send packet
- LoRa.beginPacket();
- LoRa.print(F("Pkt No:"));
- LoRa.println(counter);
-
- LoRa.print("Temp: ");
- LoRa.print(t);
- LoRa.println("°C");
-
- LoRa.print("Hum: ");
- LoRa.print(h);
- LoRa.print("%");
- LoRa.println("");
-
- LoRa.endPacket();
- counter++;
- delay(3000);
- }
复制代码
接收器的代码 - #include <SPI.h>
- #include <LoRa.h>
- #define ss 15
- #define rst 16
- #define dio0 2
- void setup() {
- Serial.begin(115200);
- while (!Serial);
- Serial.println("LoRa Receiver Callback");
- LoRa.setPins(ss, rst, dio0);
- if (!LoRa.begin(473E6)) {
- Serial.println("Starting LoRa failed!");
- while (1);
- }
- // register the receive callback
- LoRa.onReceive(onReceive);
- // put the radio into receive mode
- LoRa.receive();
- }
- void loop() {
- // do nothing
- }
- void onReceive(int packetSize) {
- // received a packet
- Serial.print("Received packet '");
- // read packet
- for (int i = 0; i < packetSize; i++) {
- Serial.print((char)LoRa.read());
- }
- // print RSSI of packet
- Serial.print("' with RSSI ");
- Serial.println(LoRa.packetRssi());
- }
复制代码
运行结果 上载代码后,发射器部分将开始发送数据,接收器部分将开始接收数据。
同样,您可以打开串口监视器,并观察已发送和已接收数据包的数量。
使用SX1278和ESP8266发送DHT11传感器湿度温度数据 以下是Loara SX1278和ESP8266组成的发射器电路。如下图所示组装电路。
连接非常简单。将OLED的SDA和SCL引脚分别连接到Nodemcu的D2、D1。如下图所示,将DHT11输出引脚连接到D3。类似地,按上述相同方法连接Lora SX1278和NodeMCU ESP8266。
接收器电路的连接与上一个示例相同。无需进行任何更改。
运行结果 上载代码后,发射器部分将开始发送数据,接收器部分将开始接收数据。湿度和温度值可以在OLED屏幕中观察到。
同样,您可以打开串口监视器,并通过数据包编号观察发送和接收的湿度温度数据。
|