ایستگاه هواشناسی LoRa یعنی چه؟ (برای مبتدی)
تصور کنید یک سنسور دما و رطوبت در مزرعه، روی پشتبام یا در یک منطقه دور نصب کردهاید و میخواهید دادهها را بدون اینترنت و بدون سیمکارت دریافت کنید. این دقیقاً کاری است که یک ایستگاه هواشناسی LoRa انجام میدهد. ESP32 یک میکروکنترلر قدرتمند با WiFi/BT داخلی است که در این پروژه برای پردازش دادههای حسگر استفاده میشود.
DHT22 یک سنسور دیجیتال دقیق است که دما را با دقت ±0.5°C و رطوبت نسبی را با دقت ±2٪ اندازه میگیرد — مناسبتر از DHT11 برای کاربردهای جدی. BMP280 یک سنسور فشار هوا (Barometer) است که ارتفاع را نیز محاسبه میکند. با ارسال این دادهها از طریق LoRa، گیرنده در خانه روی یک نمایشگر همه چیز را نشان میدهد.
محصولی که میسازید
دو دستگاه: یک فرستنده (مقیم در محل اندازهگیری) و یک گیرنده با نمایشگر OLED که داده را نشان میدهد — تا ۵ کیلومتر از هم.
- زمان ساخت: ۳ تا ۴ ساعت
- هزینه: ۱ تا ۱.۵ میلیون تومان (برای دو دستگاه)
- برد: ۱-۵ کیلومتر فضای باز
قطعات لازم (BOM)
| قطعه | تعداد | نقش |
|---|---|---|
| TTGO LoRa32 V2.1 یا ESP32 + Ra-02 | ۲ عدد | فرستنده + گیرنده |
| DHT22 | ۱ عدد | دما و رطوبت |
| BMP280 | ۱ عدد | فشار هوا |
| نمایشگر OLED 0.96″ I2C | ۱ عدد | نمایش در گیرنده |
| مقاومت ۱۰k اهم | ۱ عدد | pull-up برای DHT22 |
کد فرستنده (ایستگاه)
#include <SPI.h>
#include <LoRa.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>
#define DHT_PIN 4
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(115200);
dht.begin();
bmp.begin(0x76);
if (!LoRa.begin(868E6)) { Serial.println("LoRa failed!"); while(1); }
LoRa.setSpreadingFactor(9);
Serial.println("Sender ready");
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
float pres = bmp.readPressure() / 100.0F;
if (!isnan(temp) && !isnan(hum)) {
String msg = "T:" + String(temp,1) + ",H:" + String(hum,1) + ",P:" + String(pres,1);
LoRa.beginPacket();
LoRa.print(msg);
LoRa.endPacket();
Serial.println("Sent: " + msg);
}
delay(30000); // هر ۳۰ ثانیه
}
کد گیرنده (نمایشگر خانه)
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void setup() {
Serial.begin(115200);
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(1); oled.setTextColor(WHITE);
oled.println("Waiting for data...");
oled.display();
if (!LoRa.begin(868E6)) { Serial.println("LoRa failed!"); while(1); }
LoRa.setSpreadingFactor(9);
}
void loop() {
int pktSize = LoRa.parsePacket();
if (pktSize) {
String data = "";
while (LoRa.available()) data += (char)LoRa.read();
int rssi = LoRa.packetRssi();
oled.clearDisplay();
oled.setCursor(0,0); oled.setTextSize(1);
oled.println("Weather Station");
oled.println(data);
oled.print("RSSI: "); oled.print(rssi); oled.println(" dBm");
oled.display();
Serial.println("Recv: " + data + " RSSI=" + rssi);
}
}
چکلیست تست
| تست | نتیجه |
|---|---|
| داده DHT22 در Serial Monitor فرستنده درست است؟ | دمای محیط ±۱°C |
| گیرنده در همان اتاق داده دریافت کرد؟ | بله — OLED نمایش میدهد |
| RSSI در فاصله ۱۰۰ متر چقدر است؟ | بهتر از -۱۰۰ dBm |
| فرستنده با باتری ۱۲ ساعت کار میکند؟ | Deep Sleep اضافه کنید |