فلوی کامل سیستم تحویل
یک سیستم تحویل کامل چند لایه دارد: ۱) سفارش: کاربر از اپ موبایل یا وبسایت آدرس تحویل را وارد میکند. ۲) ارسال Waypoint: سرور مختصات GPS را از طریق LoRa به ربات میفرستد. ۳) حرکت: ربات با GPS waypoint به مقصد میرود. ۴) تأییدیه: وقتی رسید، یک کد یکبار مصرف از طریق SMS به گیرنده میفرستد. گیرنده کد را وارد میکند و کمپارتمان باز میشود.
🛠️ کارت پروژه
| پشته | Arduino + GPS + LoRa (ربات) + Python Server + اپ وب |
| اعلان | SMS با ماژول SIM800L یا ایمیل |
اسکریپت Python — سرور مسیریابی
import serial, time, json
# دریافت Waypoint از وبسرویس
def get_next_delivery():
return {"lat": 35.7125, "lng": 51.4055, "code": "7842"}
# ارسال به ربات از طریق LoRa Gateway
lora_serial = serial.Serial('/dev/ttyUSB0', 9600)
def send_waypoint(delivery):
cmd = f"WP:{delivery['lat']:.6f},{delivery['lng']:.6f}\n"
lora_serial.write(cmd.encode())
print(f"Sent waypoint: {delivery['lat']}, {delivery['lng']}")
def wait_arrival():
while True:
if lora_serial.in_waiting:
msg = lora_serial.readline().decode().strip()
if "ARRIVED" in msg:
return True
time.sleep(0.5)
delivery = get_next_delivery()
send_waypoint(delivery)
if wait_arrival():
# ارسال SMS با کد تأیید
print(f"Delivery arrived. Code: {delivery['code']}")
# send_sms(customer_phone, f"کد تحویل: {delivery['code']}")
کد Arduino — دریافت Waypoint از سرور
double targetLat, targetLng;
bool hasTarget = false;
void loop(){
// دریافت Waypoint از LoRa
int pkt = LoRa.parsePacket();
if(pkt > 0){
String cmd = "";
while(LoRa.available()) cmd += (char)LoRa.read();
if(cmd.startsWith("WP:")){
String coords = cmd.substring(3);
int comma = coords.indexOf(',');
targetLat = coords.substring(0,comma).toDouble();
targetLng = coords.substring(comma+1).toDouble();
hasTarget = true;
}
}
if(hasTarget && gps.location.isValid()){
float dist = gpsDist(gps.location.lat(), gps.location.lng(), targetLat, targetLng);
if(dist < 3.0){
stopMotors();
hasTarget = false;
// اعلان رسیدن
LoRa.beginPacket(); LoRa.print("ARRIVED"); LoRa.endPacket();
} else {
navigateTo(targetLat, targetLng);
}
}
}