434 lines
13 KiB
C
434 lines
13 KiB
C
#ifndef EC200U_FINAL_H
|
|
#define EC200U_FINAL_H
|
|
|
|
#include <Arduino.h>
|
|
|
|
// -------------------- تعریف 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 <Arduino.h>
|
|
|
|
// // -------------------- تعریف 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
|