LoRa-網路通訊無距離-ESP32
LoRa-網路通訊無距離-ESP32
某淘上拜了二條TTGO-LoRa32,因為參加社團的課程,漸漸意識到網路的距離
會越來越廣,越來越無所不聯。所以就買了二條回來開始學習。
那麼是什麼是LoRa呢?
這名字每次都聯想到蘿莉控😂,好啦!回歸研究。
LoRa 是一種無線數據通信技術,它使用可由 Semtech LoRa 收發器芯片生成的無線電調製技術。
它有如下特點:
少量數據的長距離通信(這意味著低帶寬)
低功率要求進行長距離通信
不同國家有不同登記的頻率
以下是常用的頻率
- 868 MHz for Europe
- 915 MHz for North America
- 433 MHz band for Asia
或者自行查找自己國家內可用的頻率
LoRa 的適合的運用範籌:
- 物聯網 (IoT)
- 智能家居
- 機器對機器通信
- 以及更多…
所以像牽涉到太陽能這類運用就很適合使用LoRa
LoRa 的不適合的運用範籌:
- 需要高數據速率傳輸;
- 需要非常頻繁的傳輸;
- 或者在人口密集的網絡中。
所以可以用在哪?
例如:1.無線電通訊這種點對點式的通訊
或者
2.特定的聯網-LoRaWAN
3.智慧農場的監控系統也是符合使用LoRa的範籌
那WIFI和LoRa又有什麼不同呢?
Wi-Fi,在中文裡又稱作“行動熱點”,是Wi-Fi聯盟製造商的商標做為產品的品牌認證,是一個創建於IEEE 802.11標準的無線局域網技術。
優點:
- 設備可以接入互聯網
- 避免佈線
缺點:
- 距離近(50米)
- 功耗大
- 必須有熱點
LoRa是低功耗局域網無線標準 。它最大特點就是在同樣的功耗條件下比其他無線方式傳播的距離更遠,實現了低功耗和遠距離的統一,它在同樣的功耗下比傳統的無線射頻通信距離擴大3-5倍。
優點 :
- 遠距離(城鎮2~5km,郊區15km)
- 低功耗(據說電池可工作10年)
- 安全(AES128加密)
缺點:
- 速度慢
- 不可接入互聯網
使用TTGO -LoRa32
ESP32 開發板不是使用 ESP32 和單獨的 LoRa 收發器模塊,而是內置 LoRa 芯片和 OLED,這使得佈線更加簡單。
#include <WiFi.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <LoRa.h>
const int sck = 5; //sck
const int miso = 19; //miso
const int mosi = 27; //mosi
const int ss = 18; // cs
const int reset = 14; // reset
const int dio0 = 26; // dio
//設定LoRa上的oled
const int sda=4;
const int scl=15;
const int oled_rest=16;
Adafruit_SSD1306 oled(128, 64, &Wire, oled_rest);
int count=0;
void setup() {
// 初始化串列
Serial.begin(115200);
//OLED設定
//reset oled
pinMode(oled_rest, OUTPUT);
digitalWrite(oled_rest, LOW);
delay(20);
digitalWrite(oled_rest, HIGH);
Wire.begin(sda, scl);
if(!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C, false, false)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // 繼續執行迴圈直到oled初始化正常運作
}
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setTextSize(1);
oled.setCursor(0,0);
oled.print("LORA SENDER ");
oled.display();
while (!Serial);
Serial.println("我是LoRa的發送端");
//SPI LoRa pins
SPI.begin(sck, miso, mosi, ss);
//設定發射模組
LoRa.setPins(ss, reset, dio0);
//將 LoRa.begin(---E-) 參數替換為您所在位置的頻率
//433E6 for Asia
//866E6 for Europe
//915E6 for North America
while (!LoRa.begin(866E6)){
Serial.print(".");
delay(500);
}
//設定同步字元,使非設定好的LoRa以外的使用者聯入
//0~0xFF都可以
LoRa.setSyncWord(0xFF);
Serial.println("LoRa初始化完成!");
oled.setCursor(0,10);
oled.print("LoRa Initializing OK!");
oled.display();
delay(2000);
}
void loop() {
Serial.printf("發送數據包: ");
Serial.println(count);
//寄送數據包到接受端
LoRa.beginPacket();
LoRa.print("hello!");
LoRa.print(count);
LoRa.endPacket();
//oled上的顯示
oled.clearDisplay();
oled.setCursor(0,0);
oled.println("LORA SENDER");
oled.setCursor(0,20);
oled.setTextSize(1);
oled.print("LoRa packet sent.");
oled.setCursor(0,30);
oled.print("Counter:");
oled.setCursor(50,30);
oled.print(count);
oled.display();
count++;
delay(10000);
}
接收端
#include <WiFi.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <LoRa.h>
const int sck = 5; //sck
const int miso = 19; //miso
const int mosi = 27; //mosi
const int ss = 18; // cs
const int reset = 14; // reset
const int dio0 = 26; // dio
//設定LoRa上的oled
const int sda=4;
const int scl=15;
const int oled_rest=16;
Adafruit_SSD1306 oled(128, 64, &Wire, oled_rest);
String LoRaData;
void setup() {
// 初始化串列
Serial.begin(115200);
//OLED設定
//reset oled
pinMode(oled_rest, OUTPUT);
digitalWrite(oled_rest, LOW);
delay(20);
digitalWrite(oled_rest, HIGH);
Wire.begin(sda, scl);
if(!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C, false, false)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // 繼續執行迴圈直到oled初始化正常運作
}
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setTextSize(1);
oled.setCursor(0,0);
oled.print("LORA RECEIVER");
oled.display();
while (!Serial);
Serial.println("我是LoRa的接收端");
//SPI LoRa pins
SPI.begin(sck, miso, mosi, ss);
//設定發射模組
LoRa.setPins(ss, reset, dio0);
//將 LoRa.begin(---E-) 參數替換為您所在位置的頻率
//433E6 for Asia
//866E6 for Europe
//915E6 for North America
while (!LoRa.begin(866E6)){
Serial.print(".");
delay(500);
}
//設定同步字元,使非設定好的LoRa以外的使用者聯入
//0~0xFF都可以
LoRa.setSyncWord(0xFF);
Serial.println("LoRa初始化完成!");
oled.setCursor(0,10);
oled.print("LoRa Initializing OK!");
oled.display();
delay(2000);
}
void loop() {
// 嚐試解析封包
int packetSize=LoRa.parsePacket();
if (packetSize){
Serial.println("Received packet");
//讀取封包
while (LoRa.available()){
LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
//印出rssi
int rssi=LoRa.packetRssi();
Serial.print(" with RSSI ");
Serial.println(rssi);
oled.clearDisplay();
oled.setCursor(0,0);
oled.print("LORA RECEIVER");
oled.setCursor(0,20);
oled.print("Received packet:");
oled.setCursor(0,30);
oled.print(LoRaData);
oled.setCursor(0,40);
oled.print("RSSI:");
oled.setCursor(30,40);
oled.print(rssi);
oled.display();
}
}
留言
張貼留言