本帖最后由 豆爸 于 2024-4-22 03:39 编辑
关于LoRa
LoRa是Semtech公司开发的一种低功耗局域网无线标准。它最大特点是在同样的功耗条件下比其他无线方式传播的距离更远,实现了低功耗和远距离的统一,在同样的功耗下比传统的无线射频通信距离扩大3-5倍。主要频段:470MHz,亚洲其他地区主要是902-928MHz,欧洲主要是868MHz,美洲主要是915mHz。
LoRa技术被广泛应用于智能仪表、智慧城市、智慧社区、智慧农业等领域。
项目目标
- 发送端:实现现场温湿度的采集与显示,并将现场采集到的温湿度通过LoRa发送到接受端
- 接收端:实现将通过LoRa接收到的数据,在OLED上显示
硬件清单
1、发送端:
- FireBeetle 2 Board ESP32 C6 *1
- 扩展版 *1
- LoRa模块 *1
- DHT11温湿度传感器 *1
- 0.96" OLED屏 I2C *1
2、接收端:
- FireBeetle 2 Board ESP32 C6 *1
- 扩展版 *1
- LoRa模块 *1
- 0.96" OLED屏 I2C *1
程序代码
发送端程序代码:
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #define SCREEN_WIDTH 128 // OLED display width, in pixels
- #define SCREEN_HEIGHT 64 // OLED display height, in pixels
- #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
-
- #include "DHT.h"
- #define DHTPIN 8 // DHT11连接到Arduino的引脚2
- #define DHTTYPE DHT11 // DHT型号为DHT11
- DHT dht(DHTPIN, DHTTYPE);
-
- int n = 10;
- char c;
-
- void setup() {
- Serial1.begin(9600,SERIAL_8N1,/*rx =*/16,/*Tx =*/17);
- Serial.begin(9600);
- dht.begin();
-
- // 初始化I2C
- Wire.begin(/*SDA=*/19, /*SCL=*/20);
- // 初始化OLED
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
- // 清屏
- display.clearDisplay();
- delay(500);
- // 设置字号
- display.setTextSize(1);
- // 设置文字颜色
- display.setTextColor(WHITE);
- // 设置屏幕方向
- display.setRotation(0);
- display.display();
- delay(2000);
- }
-
- void SendData(){
- float temperature = dht.readTemperature(); // 读取温度数据
- float humidity = dht.readHumidity();
- // 串口发送
- Serial1.print(F("Temperature: "));
- Serial1.print(temperature);
- Serial1.println(F("C "));
- Serial1.print(F("Humidity: "));
- Serial1.print(humidity);
- Serial1.println(F("% "));
- // 打印输出
- // Serial.print(F("% Temperature: "));
- // Serial.print(temperature);
- // Serial.println(F("°C "));
- // Serial.print(F("Humidity: "));
- // Serial.print(humidity);
-
- // 清屏、设置光标位置
- display.clearDisplay();
- display.setCursor(0, 0);
-
- // 显示温湿度
- display.println("Temperature: ");
- display.println();
- display.print(temperature, 1); // 显示温度,保留1位小数
- display.println("C");
- display.println();
-
- display.println("Humidity: ");
- display.println("");
- display.print(humidity, 1); // 显示湿度,保留1位小数
- display.println("%");
-
-
- // 显示数据到OLED
- display.display();
- // 等待1秒再次更新数据
- delay(1000);
- }
-
- // the loop routine runs over and over again forever:
- void loop() {
- SendData();
- delay(500); // 延时500ms
- }
复制代码
接收端程序代码:
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #define SCREEN_WIDTH 128 // OLED display width, in pixels
- #define SCREEN_HEIGHT 64 // OLED display height, in pixels
- #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
-
- int n = 10;
- char c;
-
- void setup() {
- Serial1.begin(9600,SERIAL_8N1,/*rx =*/16,/*Tx =*/17);
- Serial.begin(9600);
- dht.begin();
-
- // 初始化I2C
- Wire.begin(/*SDA=*/19, /*SCL=*/20);
- // 初始化OLED
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
- // 清屏
- display.clearDisplay();
- delay(500);
- // 设置字号
- display.setTextSize(1);
- // 设置文字颜色
- display.setTextColor(WHITE);
- // 设置屏幕方向
- display.setRotation(0);
- display.display();
- delay(2000);
- }
-
- void RecvData(){
- // 获取串口缓冲区中是否已经接收到字符串
- n = Serial1.available();
- if(n > 0)
- {
- // 打印获取到的字符串字数
- // Serial.print("Read ");
- // Serial.print(n);
- // Serial.print("chars. \n Rev:");
- // 将获取的字符串打印出来
- // 清屏、设置光标位置
- display.clearDisplay();
- display.setCursor(0, 0);
- while(n--)
- {
- c = Serial1.read();
- Serial.print(c);
- display.print(c);
- }
- Serial.println();
- display.println();
- display.display();
- // 等待1秒再次更新数据
- delay(1000);
- }
- }
-
-
- // the loop routine runs over and over again forever:
- void loop() {
- RecvData();
- delay(500); // 延时500ms
- }
复制代码
|