تلهمتری ابری ArduPilot چیست؟ (مبتدی)
معمولاً تلهمتری ArduPilot به Mission Planner روی لپتاپ میرسد — اما اگر بخواهیم داده پرواز را در ابر ذخیره کنیم و از هر جای دنیا ببینیم چه؟ با یک ESP32 به عنوان پل MAVLink-WiFi، میتوان داده تلهمتری پرواز را به ThingSpeak (سرویس IoT رایگان از MathWorks) ارسال کرد.
ThingSpeak هر فیلد را (ارتفاع، ولتاژ باتری، سرعت، موقعیت GPS) در یک Channel ذخیره میکند. میتوان نمودارهای زنده، هشدار ایمیل، و حتی MATLAB Analytics روی داده اجرا کرد — همه رایگان تا ۸ فیلد و ۸۰۰۰ پیام در روز.
محصولی که میسازید
پل تلهمتری ArduPilot به ابر ThingSpeak با ESP32.
- هزینه اضافه: فقط ESP32 ≈ ۵ دلار
- سرویس: ThingSpeak رایگان
- دادهها: ارتفاع، ولتاژ، سرعت، GPS
کد ESP32 — پل MAVLink به ThingSpeak
#include <WiFi.h>
#include <HTTPClient.h>
#include <HardwareSerial.h>
const char* ssid = "YourHotspot";
const char* pass = "YourPass";
const char* TS_KEY = "YOUR_THINGSPEAK_WRITE_KEY";
const char* TS_URL = "https://api.thingspeak.com/update";
HardwareSerial mavSerial(1); // UART1 ← Pixhawk
// سادهترین روش: دریافت MAVLink HEARTBEAT و GPS
float altitude=0, voltage=0, speed=0;
double lat=0, lon=0;
void parseMavlink(uint8_t* buf, int len) {
// بررسی Magic Byte و Message ID:
if(len < 8 || buf[0] != 0xFE) return;
uint8_t msgid = buf[5];
if(msgid == 24) { // GPS_RAW_INT
lat = *(int32_t*)(buf+9) / 1e7;
lon = *(int32_t*)(buf+13) / 1e7;
altitude = *(int32_t*)(buf+17) / 1000.0; // متر
}
if(msgid == 74) { // VFR_HUD
speed = *(float*)(buf+6);
}
if(msgid == 147) { // BATTERY_STATUS
voltage = *(int16_t*)(buf+20) / 1000.0;
}
}
void sendToThingSpeak() {
HTTPClient http;
String url = String(TS_URL) +
"?api_key=" + TS_KEY +
"&field1=" + String(altitude,1) +
"&field2=" + String(voltage,2) +
"&field3=" + String(speed,1) +
"&field4=" + String(lat,6) +
"&field5=" + String(lon,6);
http.begin(url);
int code = http.GET();
http.end();
}
void setup() {
mavSerial.begin(57600, SERIAL_8N1, 16, 17);
WiFi.begin(ssid, pass);
while(WiFi.status()!=WL_CONNECTED) delay(300);
}
void loop() {
static uint8_t buf[280]; static int idx=0;
while(mavSerial.available()) {
buf[idx++] = mavSerial.read();
if(idx >= 8 && idx == (buf[1]+8)) {
parseMavlink(buf, idx); idx=0;
}
if(idx > 280) idx=0;
}
static unsigned long t=0;
if(millis()-t > 15000) { // هر ۱۵ ثانیه
sendToThingSpeak(); t=millis();
}
}
تنظیم ThingSpeak Channel
| Field | داده | واحد |
|---|---|---|
| Field 1 | Altitude | متر |
| Field 2 | Battery Voltage | ولت |
| Field 3 | Ground Speed | m/s |
| Field 4+5 | GPS Latitude/Longitude | درجه |