34浏览
查看: 34|回复: 0

[项目] 校园气象站:用LoRa+太阳能打造4公里级数据链路

[复制链接]
本帖最后由 云天 于 2025-7-22 21:52 编辑

——基于 FireBeetle ESP32 × 云雀气象仪 × LoRaWAN × 10 W 太阳能套件
校园气象站:用LoRa+太阳能打造4公里级数据链路图8

【缘起:两个真实痛点】
痛点
现状
我们的目标
远距离传输
教学楼屋顶→实验楼机房 Wi-Fi 只有 80 m,4G 月租高
4 km 级、免流量费
长期供电
220 V 拉线危险,普通充电宝 3 天就没电
连续阴雨天 ≥7 天续航

【系统总览】
气象仪端(Sensor Node)
├─ FireBeetle ESP32
├─ 云雀气象仪(I²C)
├─ LoRaWAN 模块(I²C)
└─ 10 W 太阳能套件(12 V→5 V)
校园气象站:用LoRa+太阳能打造4公里级数据链路图7校园气象站:用LoRa+太阳能打造4公里级数据链路图5校园气象站:用LoRa+太阳能打造4公里级数据链路图6

接收端(Receiver Node)
├─ FireBeetle 2 ESP32-E
├─ LoRaWAN 模块(I²C)
└─ Wi-Fi → MQTT → Siot → Mind+ 实时面板
校园气象站:用LoRa+太阳能打造4公里级数据链路图4

【关键硬件清单】
模块
链接
数量
备注
FireBeetle ESP32
DFR0478
1
低功耗版
FireBeetle 2 ESP32-E
DFR0654-F
1
WIFI和蓝牙双模通信
云雀气象仪
EDU0157
1
五合一传感器
LoRaWAN 模块(EU868)
DFR1115-868
2
4 km 级
10 W 太阳能套件
KIT0210
1
18650×3
3D 打印外壳
附件 STL
1
IP54 级防水

【硬件接线表】
1.气象仪端Sensor Node)
云雀气象仪
LoRaWAN
FireBeetle ESP32
太阳能套件
VCC

5 V
5 V
GND
GND
GND
GND
SDA
SDA
D21

绿 SCL
SCL
D22


VCC
5 V
5 V
注意:LoRaWAN 模块同时支持 3.3 V/5 V,直接接到 FireBeetle 的 5 V 即可。

2.接收端(Receiver Node)接线同上,只需把 LoRaWAN 模块接到 FireBeetle 2 ESP32-E 的 I²C 引脚即可。
校园气象站:用LoRa+太阳能打造4公里级数据链路图1

【代码编写】
1.气象仪端Sensor Node)

  1. #include <DFRobot_LWNode.h>
  2. #include "DFRobot_Atmospherlum.h"
  3. // 创建对象
  4. DFRobot_Atmospherlum_I2C  atm(0x42,&Wire);
  5. #define FREQ  914900000
  6. DFRobot_LWNode_IIC node(1);//设置节点地址为1
  7. void setup( void ) {
  8.     Serial.begin(115200);
  9.     delay(5000);
  10.     node.begin(/*communication IIC*/&Wire,/*debug UART*/&Serial);
  11.    
  12.    
  13.     const uint32_t loraConfig[] = {FREQ, DBM16, 125000, 12}; //配置LoRa通信参数
  14.     while(!node.setFreq(loraConfig[0])  ||
  15.           !node.setEIRP(loraConfig[1])  ||
  16.           !node.setBW(loraConfig[2])    ||
  17.           !node.setSF(loraConfig[3])    ||
  18.           !node.start()) {
  19.         Serial.println("LoRa init failed");
  20.         delay(2000);
  21.     }
  22. while(atm.begin()!=0){delay(1000);}  
  23. Serial.println("yunque ok");
  24. }
  25. void loop( void ){
  26.     String data=atm.getValue("Speed")+","+atm.getValue("Dir")+","+atm.getValue("Temp")+","+atm.getValue("Humi")+","+atm.getValue("Pressure");
  27.     delay(2000);
  28.     node.sendPacket(2, data);  //发送温湿度数据给地址为2的节点
  29.     node.sleep(5000);
  30. }
复制代码
2.接收端(Receiver Node)
  1. #include <DFRobot_LWNode.h>
  2. #include <DFRobot_Iot.h>
  3. // 静态常量
  4. const String topics[5] = {"siot/pres","siot/speed","siot/dir","siot/humi","siot/tem"};
  5. // 创建对象
  6. DFRobot_Iot myIot;
  7. #define FREQ  914900000   
  8. DFRobot_LWNode_IIC node(2);//设置节点地址为2
  9. void rxCBFunc(uint8_t from, void *buffer, uint16_t size, int8_t rssi, int8_t snr){
  10.     char *p = (char *)buffer;
  11.     Serial.print("recv from: ");
  12.     Serial.println(from, HEX);
  13.     Serial.print("recv data: ");
  14.     for(uint8_t i = 0; i < size; i++){
  15.         Serial.print(p[i]);
  16.     }
  17.     Serial.println();
  18.     Serial.println("Text:");
  19.     Serial.println((char *)buffer);
  20.     Serial.print("rssi=");Serial.println(rssi);
  21.     Serial.print("snr=");Serial.println(snr);
  22.     String input = (char *)buffer;
  23. String values[5];  // 存放结果
  24. int index = 0;
  25. // 先补一个逗号,方便统一处理
  26. input += ",";
  27. while (input.length() > 0) {
  28.   int commaIndex = input.indexOf(',');
  29.   if (commaIndex == -1) break;
  30.   values[index] = input.substring(0, commaIndex);
  31.   input = input.substring(commaIndex + 1);
  32.   index++;
  33. }
  34.   myIot.publish(topic_1, values[0], 1);//风速
  35.   myIot.publish(topic_2, values[1], 1);//风向
  36.   myIot.publish(topic_4, values[2], 1);//温度
  37.   myIot.publish(topic_3, values[3], 1);//湿度
  38.   myIot.publish(topic_0, values[4], 1);//气压
  39. }
  40. void setup( void ){
  41.     Serial.begin(115200);
  42.             pinMode(D9, OUTPUT);
  43.         myIot.wifiConnect("***", "********");
  44.         while (!myIot.wifiStatus()) {}
  45.         digitalWrite(D9, HIGH);
  46.         myIot.init("192.168.31.11","siot","5490164669696611","dfrobot", topics, 1883);
  47.         myIot.connect();
  48.         while (!myIot.connected()) {}
  49.         
  50.     delay(5000);
  51.     node.begin(/*communication IIC*/&Wire,/*debug UART*/&Serial);
  52.     const uint32_t config[] = {FREQ, DBM16, 125000, 12};   //配置LoRa通信参数
  53.     while(!node.setFreq(config[0])    ||
  54.           !node.setEIRP(config[1])   ||
  55.           !node.setBW(config[2])     ||
  56.           !node.setSF(config[3])     ||
  57.           !node.start()) {
  58.         Serial.println("LoRa init failed, retrying...");
  59.         delay(2000);
  60.     }
  61.     node.setRxCB(rxCBFunc);
  62. }
  63. void loop( void ){
  64.     node.sleep(5000);
  65. }
复制代码

【太阳能供电计算】
  • 日均功耗
    ESP32 40 mA + 传感器 40 mA + LoRa 发射 120 mA(占空比 1%)≈ 45 mA
    45 mA × 5 V × 24 h = 5.4 Wh
  • 电池容量
    18650×3(3.7 V 2600 mAh)= 28.9 Wh
    可用 80 % → 23.1 Wh
    23.1 Wh ÷ 5.4 Wh ≈ 4.3 天(无日照)
  • 太阳能板补充
    10 W × 4 h(冬季)= 40 Wh/日,远超需求 → 阴雨天 7 天无压力。

校园气象站:用LoRa+太阳能打造4公里级数据链路图2


校园气象站:用LoRa+太阳能打造4公里级数据链路图3


【演示视频】







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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail