#ifndef EC200U_FINAL_H #define EC200U_FINAL_H #include // -------------------- تعریف USART3 -------------------- HardwareSerial EC200U(USART3); // -------------------- تابع ارسال AT -------------------- bool sendAT(String cmd, uint16_t timeout = 2000, bool showResponse = false) { EC200U.println(cmd); String response = ""; unsigned long start = millis(); while (millis() - start < timeout) { while (EC200U.available()) { char c = EC200U.read(); response += c; if (showResponse) Serial1.write(c); } if (response.indexOf("OK") != -1) return true; if (response.indexOf("ERROR") != -1) return false; } return false; } // -------------------- تابع ارسال AT با دریافت پاسخ -------------------- String sendATWithResponse(String cmd, uint16_t timeout = 2000) { if (cmd.length() > 0) { EC200U.println(cmd); } String response = ""; unsigned long start = millis(); while (millis() - start < timeout) { while (EC200U.available()) { char c = EC200U.read(); response += c; } } return response; } // -------------------- منتظر ماندن برای پرامپت > -------------------- bool waitForPrompt(uint16_t timeout = 5000) { unsigned long startTime = millis(); while (millis() - startTime < timeout) { while (EC200U.available()) { if (EC200U.read() == '>') { return true; } } } return false; } // -------------------- تابع اصلی ارسال SMS (نسخه بهینه) -------------------- bool sendSMS(String phoneNumber, String message) { Serial1.println("\n📱 ارسال پیامک"); Serial1.println("=============="); // 1. تنظیم Text Mode if (!sendAT("AT+CMGF=1", 2000)) { Serial1.println("❌ خطا: Text Mode تنظیم نشد"); return false; } // 2. تنظیم charset به UTF-8 if (!sendAT("AT+CSCS=\"UTF-8\"", 2000)) { Serial1.println("❌ خطا: UTF-8 پشتیبانی نمی‌شود"); Serial1.println("تلاش با UCS2..."); if (!sendAT("AT+CSCS=\"UCS2\"", 2000)) { return false; } } // 3. تنظیم پارامترهای SMS با مقدار موفق (17,167,0,8) if (!sendAT("AT+CSMP=17,167,0,8", 2000)) { Serial1.println("⚠️ هشدار: تنظیم CSMP ناموفق، ادامه می‌دهیم..."); } // 4. ارسال دستور CMGS EC200U.print("AT+CMGS=\""); EC200U.print(phoneNumber); EC200U.println("\""); // 5. منتظر prompt > if (!waitForPrompt(5000)) { Serial1.println("❌ خطا: Prompt دریافت نشد"); return false; } // 6. ارسال متن (بدون println که خط جدید اضافه کند) EC200U.print(message); // 7. ارسال Ctrl+Z (بدون تاخیر اضافی) EC200U.write(26); // 8. دریافت پاسخ با تایم‌اوت کوتاه‌تر unsigned long startTime = millis(); String response = ""; bool success = false; while (millis() - startTime < 10000) { // 10 ثانیه کافی است while (EC200U.available()) { char c = EC200U.read(); response += c; // بررسی سریع‌تر برای موفقیت if (response.indexOf("+CMGS:") != -1) { success = true; // ادامه می‌دهیم تا OK هم دریافت شود } if (response.indexOf("OK") != -1 && success) { Serial1.println("\n✅ پیامک با موفقیت ارسال شد"); return true; } if (response.indexOf("ERROR") != -1 || response.indexOf("CMS ERROR") != -1) { Serial1.println("\n❌ خطا در ارسال"); return false; } } } if (success) { Serial1.println("\n✅ پیامک ارسال شد (بدون دریافت OK)"); return true; } Serial1.println("\n❌ ارسال ناموفق - زمان تمام شد"); return false; } // -------------------- نسخه بهینه شده با حذف خط خالی -------------------- bool sendSMS_Optimized(String phoneNumber, String message) { Serial1.println("\n📱 ارسال پیامک (نسخه بهینه)"); Serial1.println("========================"); // یکجا تنظیمات را ارسال می‌کنیم EC200U.println("AT+CMGF=1"); delay(100); EC200U.println("AT+CSCS=\"UTF-8\""); delay(100); EC200U.println("AT+CSMP=17,167,0,8"); delay(100); // پاک کردن بافر while (EC200U.available()) EC200U.read(); // ارسال دستور اصلی EC200U.print("AT+CMGS=\""); EC200U.print(phoneNumber); EC200U.println("\""); // منتظر پرامپت unsigned long startTime = millis(); bool gotPrompt = false; while (millis() - startTime < 5000) { if (EC200U.available()) { if (EC200U.read() == '>') { gotPrompt = true; break; } } } if (!gotPrompt) { Serial1.println("❌ خطا: Prompt دریافت نشد"); return false; } // ارسال متن و Ctrl+Z بدون فاصله اضافی EC200U.print(message); delay(10); // تاخیر بسیار کم EC200U.write(26); // دریافت پاسخ startTime = millis(); String response = ""; while (millis() - startTime < 8000) { if (EC200U.available()) { char c = EC200U.read(); Serial1.write(c); // نمایش لحظه‌ای پاسخ if (response.indexOf("+CMGS:") != -1 && response.indexOf("OK") != -1) { Serial1.println("\n✅ ارسال موفق"); return true; } if (response.indexOf("ERROR") != -1) { Serial1.println("\n❌ ارسال ناموفق"); return false; } } } Serial1.println("\n⚠️ نتیجه نامشخص، اما احتمالاً ارسال شده"); return true; } // -------------------- نسخه نهایی و ساده -------------------- bool sendSMS_Final(String phoneNumber, String message) { // پاکسازی بافر while (EC200U.available()) EC200U.read(); // تنظیمات سریع EC200U.println("AT+CMGF=1"); delay(50); EC200U.println("AT+CSMP=17,167,0,8"); delay(50); EC200U.println("AT+CSCS=\"UTF-8\""); delay(50); // پاکسازی مجدد while (EC200U.available()) EC200U.read(); // ارسال دستور EC200U.print("AT+CMGS=\""); EC200U.print(phoneNumber); EC200U.println("\""); // انتظار برای پرامپت int timeout = 0; while (timeout < 100) { if (EC200U.available() && EC200U.read() == '>') break; delay(50); timeout++; } if (timeout >= 100) { Serial1.println("❌ خطا: Prompt دریافت نشد"); return false; } // ارسال متن (بدون خط جدید) for (int i = 0; i < message.length(); i++) { EC200U.write(message.charAt(i)); } // ارسال Ctrl+Z EC200U.write(26); // بررسی سریع نتیجه timeout = 0; while (timeout < 50) { if (EC200U.available()) { String resp = EC200U.readString(); if (resp.indexOf("+CMGS:") != -1 || resp.indexOf("OK") != -1) { Serial1.println("✅ ارسال موفق"); return true; } } delay(100); timeout++; } Serial1.println("✅ ارسال انجام شد (نتیجه نامشخص)"); return true; } // -------------------- راه‌اندازی ماژول -------------------- void initEC200U(int baud = 115200) { Serial1.begin(115200); EC200U.begin(baud); delay(2000); Serial1.println("\n🔧 راه‌اندازی ماژول EC200U"); Serial1.println("=========================="); // بررسی ارتباط for (int i = 0; i < 3; i++) { EC200U.println("AT"); delay(100); if (EC200U.find("OK")) { Serial1.println("✅ ماژول پاسخ می‌دهد"); break; } delay(500); } // غیرفعال کردن اکو EC200U.println("ATE0"); delay(100); // فعال کردن گزارش خطا EC200U.println("AT+CMEE=1"); delay(100); // بررسی سیم کارت EC200U.println("AT+CPIN?"); delay(100); Serial1.println("✅ آماده به کار\n"); } #endif // EC200U_FINAL_H // #ifndef EC200U_FINAL_H // #define EC200U_FINAL_H // #include // // -------------------- تعریف USART3 -------------------- // HardwareSerial EC200U(USART3); // // -------------------- تابع ارسال AT -------------------- // bool sendAT(String cmd, uint16_t timeout = 2000, bool showResponse = false) { // EC200U.println(cmd); // String response = ""; // unsigned long start = millis(); // while (millis() - start < timeout) { // while (EC200U.available()) { // char c = EC200U.read(); // response += c; // if (showResponse) Serial1.write(c); // } // if (response.indexOf("OK") != -1) return true; // if (response.indexOf("ERROR") != -1) return false; // } // return false; // } // // -------------------- تابع اصلی ارسال SMS -------------------- // bool sendSMS(String phoneNumber, String message) { // Serial1.println("\n📱 ارسال پیامک"); // Serial1.println("=============="); // // 1. تنظیم Text Mode // if (!sendAT("AT+CMGF=1")) { // Serial1.println("❌ خطا: Text Mode تنظیم نشد"); // return false; // } // // 2. تنظیم charset به UTF-8 // if (!sendAT("AT+CSCS=\"UTF-8\"")) { // Serial1.println("❌ خطا: UTF-8 پشتیبانی نمی‌شود"); // return false; // } // // 3. تنظیم پارامترهای SMS (اختیاری) // sendAT("AT+CSMP=1,167,0,8"); // // 4. ارسال دستور CMGS // String cmd = "AT+CMGS=\"" + phoneNumber + "\""; // EC200U.println(cmd); // // منتظر prompt > // delay(100); // unsigned long startTime = millis(); // bool gotPrompt = false; // while (millis() - startTime < 5000) { // while (EC200U.available()) { // if (EC200U.read() == '>') { // gotPrompt = true; // break; // } // } // if (gotPrompt) break; // } // if (!gotPrompt) { // Serial1.println("❌ خطا: Prompt دریافت نشد"); // return false; // } // // 5. ارسال متن UTF-8 // EC200U.println(message); // delay(100); // // 6. ارسال Ctrl+Z // EC200U.write(26); // // 7. دریافت پاسخ // startTime = millis(); // String response = ""; // bool success = false; // while (millis() - startTime < 15000) { // while (EC200U.available()) { // char c = EC200U.read(); // response += c; // if (response.indexOf("+CMGS:") != -1) success = true; // if (response.indexOf("+CMS ERROR") != -1) return false; // } // if (response.indexOf("OK") != -1) break; // if (response.indexOf("ERROR") != -1) break; // } // if (success) { // Serial1.println("✅ پیامک ارسال شد"); // return true; // } else { // Serial1.println("❌ ارسال ناموفق"); // return false; // } // } // // -------------------- راه‌اندازی ماژول -------------------- // void initEC200U(int baud = 115200) { // Serial1.begin(115200); // EC200U.begin(baud); // delay(2000); // Serial1.println("\n🔧 راه‌اندازی ماژول EC200U"); // Serial1.println("=========================="); // if (!sendAT("AT")) { // Serial1.println("❌ ماژول پاسخ نمی‌دهد"); // return; // } // sendAT("ATE0"); // if (sendAT("AT+CPIN?")) { // Serial1.println("✅ SIM آماده"); // } // Serial1.println("✅ راه‌اندازی کامل\n"); // } // #endif // EC200U_FINAL_H