Kami mengalahkan modul GPRS dari Amperka

gambar
Sebelum kami dapat mengalahkan bus CAN , kami harus mengalahkan perangkat keras berikutnya, yaitu, modul GPRS. Ini adalah hidupnya sebagai pengembang - sepanjang waktu dia harus memenangkan seseorang (harus ada senyum terlarang).

Untuk salah satu proyek khusus, saya perlu menambahkan kemampuan untuk mengontrol dan menerima telemetri melalui GSM menggunakan SMS. Saya melihat daftar opsi yang tersedia dan memilih GPRS Shield dari Amperka. Kenapa tidak Kelihatannya layak, diproduksi oleh perusahaan terkenal, memiliki dukungan teknis, harganya tidak jauh berbeda dengan pesaing dan umumnya membuat kesan yang sangat bagus.

Tapi itu dia. Anda dapat mempelajari tentang pencarian itu dan kursus pendidikan berkelanjutan yang luar biasa yang harus saya lalui, dengan mengintegrasikan modul GPRS ini dengan Arduino Mega Server dengan mengklik tombol di bawah ini.

Modul itu sendiri


Seperti yang saya katakan, modul itu sendiri membuat kesan yang sangat baik dengan akurasi eksekusi dan hubungannya dengan perusahaan terkenal. Sekali lagi, situs web produsen memiliki contoh penggunaan dan perpustakaan asli. Karena modul ini bermerek, ada harapan untuk dukungan yang memadai jika ada masalah dengannya.

gambar

Ke depan, saya akan mengatakan bahwa dukungan teknis menjawab pertanyaan saya dengan benar selama dua minggu, mencari bug di perpustakaan saya dan bahkan merilis versi baru berdasarkan alasan untuk berkomunikasi dengan saya. Tapi ... saya masih harus membuat modul bekerja sendiri.

Proyek


Beberapa kata tentang proyek GSM Coop, yang membutuhkan modul GPRS. Itu perlu untuk mengembangkan otomatisasi untuk mengelola kandang ayam. Memang, di masa yang menakjubkan kita hidup, sekarang kandang ayam perlu dikontrol melalui browser web, Smart-sensor nirkabel dan telemetri GSM. Ini semacam objek strategis, bukan kandang ayam.

gambar

Tetapi jika itu perlu, maka itu perlu. Kami membeli komponen, di antaranya modul GPRS, dan melanjutkan.

Tumit Achilles


Sekarang tentang fitur-fitur modul. Pada dasarnya, ini berhasil. Dia bekerja dengan contoh-contoh yang disajikan di situs web produsen dan atas dasar itu Anda bahkan dapat membuat beberapa sketsa sederhana. Tapi ada tiga "tapian".

Catatan Dua motherboard digunakan dalam proyek: Arduino Mega 2560 dan Arduino Due, dan semua yang berikut ini berlaku khusus untuk mereka dan hanya untuk mereka.

Perangkat keras "tetapi" pertama. Modul tidak bekerja dengan Arduino Due. Tidak mungkin. Bahkan korespondensi beberapa hari dengan dukungan teknis Amperka tidak membantu. Baik saya maupun spesialis perusahaan berhasil membuat GPRS Shield bekerja dengan Arduino Due. Dan ini sangat mengecewakan karena Due adalah pengontrol yang sangat baik dengan kemampuan hebat dan akan senang dapat menggunakannya dengan GPRS Shield.

"Tapi" kedua adalah sistemik. Modul ini membutuhkan pustaka SoftwareSerial untuk bekerja. Ketika saya memulai percakapan saya dengan GPRS Shield dan dukungan teknis Amperka, ini adalah solusi non-alternatif. Setelah proses kami, versi perpustakaan yang direvisi dengan dukungan untuk mengerjakan Serial besi dirilis, tapi ... tidak pernah mendapatkan karena Due atau Mega. Apa yang umumnya sulit dijelaskan - jika modul bekerja pada SoftSerial, lalu apa yang mencegahnya bekerja pada besi Serial?

Yang ketiga "tetapi", konseptual. Bukan itu saja. Penyergapan utama terletak pada prinsip perpustakaan modul. Ini bekerja dalam mode tertutup, yaitu, itu memblokir operasi pengontrol sementara menunggu kedatangan SMS (yang 99% dari waktu) dan selama semua operasi lain dari modul. Apa artinya ini? Ini berarti bahwa di perpustakaan standar dari pabrikan, Anda tidak dapat membuat apa pun selain sketsa uji. Kandang ayam strategis tidak bersinar untuk Anda, karena ribuan aplikasi keren lainnya seperti sistem keamanan, manajemen rumah kaca, kontrol rumah pintar melalui GSM, dll., Dll. Tidak bersinar.

Lebih Lanjut Tentang SoftwareSerial


Modul ini tidak berfungsi pada Arduino Due, oleh karena itu kita akan berbicara tentang Arduino Mega. Yang menarik dari situasinya adalah bahwa memiliki Mega memiliki tiga port perangkat keras bebas Serial1, Serial2 dan Seria3, kami dipaksa untuk terhubung dan menggunakan perpustakaan SoftwareSerial. Dengan cara yang tidak dapat dibayangkan dan tidak dapat dibayangkan, termasuk penataan ulang jumper pada modul dan interogasi dengan kecanduan dukungan teknis Amperka, tidak mungkin untuk membuat GPRS Shield bekerja dengan port perangkat keras pada Arduino Mega.

Oke ... Kami menggunakan SoftwareSerial, tapi di sini kami menunggu penyergapan. SoftwareSerial dapat bekerja pada banyak pin Arduino Mega, tetapi untuk beberapa alasan hanya berfungsi pada pin ke-62 dan 63. Kenapa hanya pada mereka? Teka-teki ini bagus. Untuk semua penampilan, kita tidak akan pernah tahu jawaban untuk pertanyaan ini.

Pilihan tepung


Dan sekarang, seperti biasa, kita memahami bahwa perpustakaan standar tidak cocok untuk penggunaan praktis. Dengan memblokir pengontrol saat menunggu untuk menerima tanggapan dari modul GPRS, perpustakaan juga memblokir semua proses lainnya. Pengontrol hanya keluar dari kenyataan 99% dari waktu, menunggu sampai permintaan atau tanggapan tiba atau batas waktu berakhir.

Ini mengakhiri aplikasi GPRS Shield, kecuali yang diuji: mengirim permintaan untuk menghidupkan soket - dihidupkan, mengirim permintaan untuk mematikan - dimatikan. Tidak boleh ada pembicaraan tentang pekerjaan server web, bekerja dengan sensor, kontrol aktuator dan hal-hal lain, semua ini tidak akan bekerja.

Timbul pertanyaan - apakah kita meninggalkan perpustakaan pabrikan dan menulis kode kontrol GPRS Shield (mudah dikatakan), atau kita meninggalkan modul itu sendiri dan mencari solusi alternatif. Tetapi modul sudah ada di sana, jadi diputuskan untuk meninggalkan perpustakaan dan menulis kode kontrol modul Anda.

Penaklukan Everest


Saya melewatkan seluruh proses pembuatan kode yang menggantikan perpustakaan standar dari Amperka, saya hanya mencatat bahwa itu sangat, sangat sulit dan memerlukan pekerjaan penelitian yang cukup besar, kompilasi algoritma yang canggih, dan upaya yang cukup untuk menguji solusi yang dihasilkan.

Semuanya akan mudah bagi Anda - sedikit keajaiban dan kode kerja siap pakai dari modul AMS untuk mendukung GPRS Shield sudah siap.

gambar

Kode modul AMS penuh menggantikan perpustakaan standar
/* Modul GPRS part of Arduino Mega Server project */ #ifdef GPRS_FEATURE #include <SoftwareSerial.h> #define ALWAYS 1 #define GPRS_ON_PIN 2 #define GPRS_STATE_PIN 3 #define GPRS_RX_PIN 62 #define GPRS_TX_PIN 63 #define MASTER "+7yyyxxxxxxx" #define MESSAGE "Hello" #define CHECK_ERROR 0 #define CHECK_MARKER 1 #define CHECK_OK 2 #define NO_CHECK 3 #define MARKER_OK "OK" #define MARKER_NO_CHECK "-" // GPRS commands #define DATA_TEMP1 "temp1" #define DATA_CONT1 "cont1" #define DATA_LEAK1 "leak1" #define DATA_SMOKE1 "smoke1" #define DATA_ALL "all" #define DATA_RELAY1 "relay1" #define DATA_SERVO1 "servo1" #define DATA_PERIOD "period" #define CMD_RELAY1 "relay1=" #define CMD_SERVO1 "servo1=" #define CMD_PERIOD "period=" byte gprsPeriod = 24; SoftwareSerial GPRS(GPRS_RX_PIN, GPRS_TX_PIN); #define MAX_SOFT_SERIAL 128 char bufferGprs[MAX_SOFT_SERIAL]; int curBuf = 0; #define MESSAGE_LENGTH 20 char message[MESSAGE_LENGTH]; char phone[16]; char datetime[24]; void gprsInit() { initStart("GPRS", true); GPRS.begin(9600); gprsOnOff(); gprsStart(); sendGprs("AT+CFUN=1", "OK"); sendGprs("AT+CNMI=2,1", "OK"); sendGprs("AT+CMGF=1", "OK"); sendGprs("AT+CLIP=1", "OK"); modulGprs = MODUL_ENABLE; initDone(true); } void clearBufferGprs() { for (int i = 0; i < curBuf; i++) { bufferGprs[i] = 0; } } void gprsStart() { while (ALWAYS) { delay(1000); curBuf = 0; GPRS.println("AT"); if (GPRS.available() > 0) { while (GPRS.available() > 0) { bufferGprs[curBuf++] = GPRS.read(); } bufferGprs[curBuf] = '\0'; if (strcmp(bufferGprs, "AT\r\n\r\nOK\r\n") == 0) { timeStamp(); Serial.println(" GPRS ON"); break; } else { Serial.print("."); } } clearBufferGprs(); } } // gprsStart() void gprsOnOff() { pinMode(GPRS_ON_PIN, OUTPUT); if (digitalRead(GPRS_STATE_PIN) != HIGH) { digitalWrite(GPRS_ON_PIN, HIGH); delay(3000); } digitalWrite(GPRS_ON_PIN, LOW); } bool clearSoftwareSerial() { if (GPRS.available() > 0) { while (GPRS.available() > 0) { char c = GPRS.read(); } } } #define DELAY_GPRS_COMMAND 2000 byte sendGprs(String command, char marker[]) { unsigned long timer = millis(); bool success = false; clearSoftwareSerial(); clearBufferGprs(); Serial.print(F("Send command: ")); //Serial.println(command); while (ALWAYS) { if (millis() - timer > DELAY_GPRS_COMMAND) { Serial.print(F("Send error: ")); Serial.println(command); //clearBufferGprs(); return CHECK_ERROR; } curBuf = 0; GPRS.println(command); delay(280); if (GPRS.available() > 0) { while (GPRS.available() > 0) { char c = GPRS.read(); if (curBuf > MAX_SOFT_SERIAL - 2) {break;} bufferGprs[curBuf++] = c; Serial.print(c); } Serial.println(); bufferGprs[curBuf] = '\0'; if (marker == MARKER_NO_CHECK) { Serial.print(F("Send no check, ")); Serial.println(millis() - timer); return NO_CHECK; } else if (StrContains(bufferGprs, marker)) { Serial.print(F("Send success, ")); Serial.println(millis() - timer); return CHECK_MARKER; } else if (StrContains(bufferGprs, MARKER_OK)) { Serial.print(F("Send success, ")); Serial.println(millis() - timer); return CHECK_OK; } else { Serial.println("."); } } // if (GPRS.available() > 0) delay(500); } // while (ALWAYS) } // sendGprs( ) // +CMGR: "REC READ", "XXXXXXXXXXX", "", "16/10/01,10:00:00+12" // SMS text void parseSms(char *message, char *phone, char *datetime) { int i = 0; int j = 0; while (bufferGprs[i] != '\"') {i++;} i++; while (bufferGprs[i] != '\"') {i++;} i++; while (bufferGprs[i] != '\"') {i++;} i++; while (bufferGprs[i] != '\"') {phone[j++] = bufferGprs[i++];} phone[j] = '\0'; i++; while (bufferGprs[i] != '\"') {i++;} i++; while (bufferGprs[i] != '\"') {i++;} i++; while (bufferGprs[i] != '\"') {i++;} i++; j = 0; while (bufferGprs[i] != '\"') {datetime[j++] = bufferGprs[i++];} datetime[j] = '\0'; i++; while (bufferGprs[i] != '\n') {i++;} i++; j = 0; //Serial.print(F("strlen(bufferGprs): ")); Serial.println(strlen(bufferGprs)); while (i < strlen(bufferGprs) - 1) { if (j > MESSAGE_LENGTH - 1) {break;} if ((byte)bufferGprs[i] == 13) {break;} message[j++] = bufferGprs[i++]; } Serial.print(F("strlen(message1): ")); Serial.println(strlen(message)); message[j] = '\0'; Serial.print(F("strlen(message2): ")); Serial.println(strlen(message)); for (int z = 0; z < strlen(message); z++) { Serial.print((byte)message[z]); Serial.print(F(" ")); } Serial.println(); } void deleteSms() { if (sendGprs("AT+CMGDA=\"DEL ALL\"", "OK")) { Serial.println(F("All SMS deleted")); } else { Serial.println(F("Error delete all SMS")); } } String stringSens(byte v) { String s = ""; switch (v) { case 0: s = (F("OFF")); break; case 1: s = (F("ON")); break; default: s = (F("?")); } return s; } String stringLeak(byte v) { String s = ""; switch (v) { case 0: s = (F("LEAK!")); break; case 1: s = (F("OK")); break; default: s = (F("?")); } return s; } String stringSmoke(byte v) { String s = ""; switch (v) { case 0: s = (F("OK")); break; case 1: s = (F("SMOKE!")); break; default: s = (F("?")); } return s; } String mkTemp1() {String s = DATA_TEMP1; s += '='; s += String(lpTempTemp); s += '\n'; return s;} String mkCont1() {String s = DATA_CONT1; s += '='; s += stringSens(lpContCont1); s += '\n'; return s;} String mkLeak1() {String s = DATA_LEAK1; s += '='; s += stringLeak(lpLeakLeak1); s += '\n'; return s;} String mkSmoke1() {String s = DATA_SMOKE1; s += '='; s += stringSmoke(smokeSmoke); s += '\n'; return s;} String mkRelay1() {String s = DATA_RELAY1; s += '='; s += stringSens(relayRelay); s += '\n'; return s;} String mkServo1() {String s = DATA_SERVO1; s += '='; s += stringSens(servoState); s += '\n'; return s;} String mkPeriod() {String s = DATA_PERIOD; s += '='; s += String(gprsPeriod); s += '\n'; return s;} String mkAll() { String s = ""; s += mkTemp1(); s += mkCont1(); s += mkLeak1(); s += mkSmoke1(); s += mkRelay1(); s += mkServo1(); s += mkPeriod(); return s; } void gprsSetRelay(byte v) { switch (v) { case 0: if (relayRelay) { relayRelay = STATE_OFF; } break; case 1: if (!relayRelay) { relayRelay = STATE_ON; } break; } } void gprsSetServo(byte v) { switch (v) { case 0: servoState = STATE_OFF; break; case 1: servoState = STATE_ON; break; } } void gprsAnswer() { String s = ""; String mess = String(message); String data = ""; if (mess == DATA_TEMP1) {s += mkTemp1();} else if (mess == DATA_CONT1) {s += mkCont1();} else if (mess == DATA_LEAK1) {s += mkLeak1();} else if (mess == DATA_SMOKE1) {s += mkSmoke1();} else if (mess == DATA_RELAY1) {s += mkRelay1();} else if (mess == DATA_SERVO1) {s += mkServo1();} else if (mess == DATA_PERIOD) {s += mkPeriod();} else if (mess == DATA_ALL) {s += mkAll();} else if (mess.indexOf(F("=")) >= 0) { byte p = mess.indexOf(F("=")); if (mess.indexOf(CMD_RELAY1) >= 0) {data = mess.substring(p + 1); gprsSetRelay(data.toInt()); s += DATA_RELAY1; s += '='; s += stringSens(relayRelay);} else if (mess.indexOf(CMD_SERVO1) >= 0) {data = mess.substring(p + 1); gprsSetServo(data.toInt()); s += DATA_SERVO1; s += '='; s += stringSens(servoState);} else if (mess.indexOf(CMD_PERIOD) >= 0) {data = mess.substring(p + 1); gprsPeriod = data.toInt(); s += DATA_PERIOD; s += '='; s += String(gprsPeriod);} } else { Serial.println(F("Not command!")); } //Serial.print(F("mess: ")); Serial.println(mess); //Serial.print(F("answ: ")); Serial.println(s); if (s == "") {s = "Error";} Serial.println(F("Send answer... ")); if (sendSms(MASTER, s)) { Serial.println(F("success")); } else { Serial.println(F("error")); } } void readSms() { byte result = sendGprs("AT+CMGR=1,1", "+CMGR:"); if (result == CHECK_MARKER) { parseSms(message, phone, datetime); Serial.print(F("Number: ")); Serial.println(phone); Serial.print(F("Datetime: ")); Serial.println(datetime); Serial.print(F("Message: ")); Serial.println(message); deleteSms(); if (String(phone) == String(MASTER)) { Serial.println(F("Message from MASTER!")); gprsAnswer(); } } else if (result == CHECK_OK) { Serial.println(F("No SMS")); } else { Serial.println(F("Error read SMS")); } } bool sendSms(char *number, String data) { String numstr = "AT+CMGS=\"" + String(number) + "\""; String messtr = data + String((char)26); if (sendGprs(numstr, ">")) { if (sendGprs(messtr, MARKER_NO_CHECK)) { return true; } } return false; } void sendPeriod() { Serial.println(F("Send period SMS... ")); if (sendSms(MASTER, mkAll())) { Serial.println(F("success")); } else { Serial.println(F("error")); } } void gprsWorks() { if (cycle20s) { readSms(); } switch (gprsPeriod) { case 1: if (cycle1h) {sendPeriod();} break; case 6: if (cycle6h) {sendPeriod();} break; case 12: if (cycle12h) {sendPeriod();} break; default: if (cycle24h) {sendPeriod();} break; } } #endif // GPRS_FEATURE 


Modul ini dikembangkan dan diuji pada versi AMS 0.16 untuk Arduino Mega. Pengujian menunjukkan operasi GPRS Shield benar-benar stabil dan andal di bawah kendali modul ini.

Hubungkan ke Modul Dukungan AMS GPRS Shield


Untuk menghubungkan modul GPRS Shield ke Arduino Mega Server, Anda perlu melakukan beberapa langkah sederhana. Pertama, tambahkan baris berikut ke file utama AMS

 #define GPRS_FEATURE 

dan

 byte modulGprs = MODUL_NOT_COMPILLED; 

di bagian yang sesuai. Di sana Anda perlu menambahkan variabel uji yang dalam proyek nyata Anda akan bertanggung jawab atas parameter yang dikendalikan (suhu, status kontak, dll.).

 float lpTempTemp; byte lpContCont1; byte lpLeakLeak1; byte smokeSmoke; byte relayRelay; byte servoState; 

Penjelasan tentang Fitur yang Didukung


Modul ini berisi serangkaian dasar permintaan dan perintah, tetapi Anda dapat mengganti perintah ini dengan yang lain dan / atau memperluas rangkaian dasar perintah dan permintaan yang Anda butuhkan.

Pertanyaan


Permintaan dikirim melalui SMS, sistem mengirimkan respons (juga melalui SMS) yang berisi informasi tentang parameter yang diminta. Sangat sederhana: kami mengirim permintaan "temp1" dari telepon, sistem sebagai respons mengirimkan nilai suhu saat ini temp1=20.50 .

temp1 - permintaan suhu
cont1 - minta status kontak
leak1 - meminta status sensor kebocoran
smoke1 - kueri status detektor asap
relay1 - meminta status relai (kunci)
servo1 - meminta status pengumpan servo
periode - permintaan periode paket telemetri otomatis
semua - meminta semua parameter sistem

Menanggapi permintaan "semua", sistem mengirimkan daftar semua parameter. Dalam hal mengirim perintah yang tidak terdaftar, sistem akan mengirimkan respons "Kesalahan". Jika parameter yang dikontrol berada di luar kisaran normal, sistem itu sendiri dapat mengirim pesan alarm ke ponsel cerdas operator.

Untuk mengelola sistem yang hanya dapat dilakukan oleh operator terdaftar, sistem memiliki perlindungan terhadap akses tidak sah - sistem hanya merespons perintah dari nomor telepon tertentu.

Tim


Perintah dikirim melalui SMS, setelah menerima perintah, sistem mengubah statusnya dan mengirim respons dengan informasi tentang keadaan baru aktuator atau pengaturannya.

relay1 = - perintah kontrol relai (kunci)
servo1 = - perintah kontrol pengumpan
period = - perintah untuk mengubah periode pengiriman otomatis telemetri

Sebuah contoh Perintah relay1=1 , respon relay1=ON . Perintah relay1=0 , respon relay1=OFF .

Penjelasan Kode


Inisialisasi modul GPRS. Inisialisasi standar modul AMS, peluncuran SoftwareSerial, dan sedikit keajaiban perintah GSM AT. Tujuan dari blok ini adalah untuk menghidupkan modul GPRS dan mengembalikannya dari nirwana jika pada saat itu ia meninggalkannya untuk beberapa alasan di luar kendali kami.

 void gprsInit() { initStart("GPRS", true); GPRS.begin(9600); gprsOnOff(); gprsStart(); sendGprs("AT+CFUN=1", "OK"); sendGprs("AT+CNMI=2,1", "OK"); sendGprs("AT+CMGF=1", "OK"); sendGprs("AT+CLIP=1", "OK"); modulGprs = MODUL_ENABLE; initDone(true); } 

Fungsi kerja utama modul. Setiap 20 detik, Arduino Mega Server memeriksa SMS yang masuk dan, jika ada permintaan atau perintah, jalankan. Akibatnya, penundaan rata-rata dalam pelaksanaan perintah adalah 10 detik (tidak termasuk keterlambatan pengiriman pesan SMS oleh operator telekomunikasi). Interval ini dapat dikonfigurasi, 20 detik dipilih sebagai kompromi antara kecepatan reaksi terhadap perintah SMS dan boot sistem.

Dalam 20 detik ini, AMS dapat melakukan apa pun yang diperlukan, dan SMS yang tiba pada periode ini tidak hilang. Saat menggunakan pustaka standar, sistem tidak dapat melakukan apa pun selain menunggu SMS datang, jika tidak, ia akan hilang (dan pengontrol tidak dapat melakukan apa pun saat ini juga).

Ada juga kode pengiriman telemetri dengan interval tertentu 1 jam, 6 jam, 12 jam atau 24 jam. Interval ini dapat diubah dengan mengirimkan perintah yang sesuai melalui SMS.

 void gprsWorks() { if (cycle20s) { readSms(); } switch (gprsPeriod) { case 1: if (cycle1h) {sendPeriod();} break; case 6: if (cycle6h) {sendPeriod();} break; case 12: if (cycle12h) {sendPeriod();} break; default: if (cycle24h) {sendPeriod();} break; } } 

Interaksi modul GPRS dan pengontrol dilakukan dengan menggunakan perintah AT khusus dan fungsi-fungsi berikut membentuk perintah modul GPRS dalam kode yang dapat dimengerti.

Fungsi pengiriman SMS. Dalam parameter fungsi, nomor telepon tujuan dan perintah atau permintaan dikirim dalam bentuk teks.

 bool sendSms(char *number, String data) { String numstr = "AT+CMGS=\"" + String(number) + "\""; String messtr = data + String((char)26); if (sendGprs(numstr, ">")) { if (sendGprs(messtr, MARKER_NO_CHECK)) { return true; } } return false; } 

Fungsi membaca SMS. Nilai-nilai yang diterima ditempatkan dalam pesan variabel, telepon dan datetime, yang masing-masing berisi perintah yang diterima, nomor telepon, dan waktu pengiriman.

 void readSms() { byte result = sendGprs("AT+CMGR=1,1", "+CMGR:"); if (result == CHECK_MARKER) { parseSms(message, phone, datetime); Serial.print(F("Number: ")); Serial.println(phone); Serial.print(F("Datetime: ")); Serial.println(datetime); Serial.print(F("Message: ")); Serial.println(message); deleteSms(); if (String(phone) == String(MASTER)) { Serial.println(F("Message from MASTER!")); gprsAnswer(); } } else if (result == CHECK_OK) { Serial.println(F("No SMS")); } else { Serial.println(F("Error read SMS")); } } 

Fungsi membentuk respons terhadap permintaan dan perintah SMS. Fungsi ini spesifik untuk setiap proyek dan Anda dapat mengubahnya di proyek Anda sesuai dengan logika sistem Anda.

 void gprsAnswer() { String s = ""; String mess = String(message); String data = ""; if (mess == DATA_TEMP1) {s += mkTemp1();} else if (mess == DATA_CONT1) {s += mkCont1();} else if (mess == DATA_LEAK1) {s += mkLeak1();} else if (mess == DATA_SMOKE1) {s += mkSmoke1();} else if (mess == DATA_RELAY1) {s += mkRelay1();} else if (mess == DATA_SERVO1) {s += mkServo1();} else if (mess == DATA_PERIOD) {s += mkPeriod();} else if (mess == DATA_ALL) {s += mkAll();} else if (mess.indexOf(F("=")) >= 0) { byte p = mess.indexOf(F("=")); if (mess.indexOf(CMD_RELAY1) >= 0) {data = mess.substring(p + 1); gprsSetRelay(data.toInt()); s += DATA_RELAY1; s += '='; s += stringSens(relayRelay);} else if (mess.indexOf(CMD_SERVO1) >= 0) {data = mess.substring(p + 1); gprsSetServo(data.toInt()); s += DATA_SERVO1; s += '='; s += stringSens(servoState);} else if (mess.indexOf(CMD_PERIOD) >= 0) {data = mess.substring(p + 1); gprsPeriod = data.toInt(); s += DATA_PERIOD; s += '='; s += String(gprsPeriod);} } else { Serial.println(F("Not command!")); } //Serial.print(F("mess: ")); Serial.println(mess); //Serial.print(F("answ: ")); Serial.println(s); if (s == "") {s = "Error";} Serial.println(F("Send answer... ")); if (sendSms(MASTER, s)) { Serial.println(F("success")); } else { Serial.println(F("error")); } } 

Fungsi membentuk jawaban. Ini adalah fungsi yang membentuk respons yang dikirim sistem melalui SMS ke ponsel cerdas pengguna sebagai tanggapan atas permintaan atau atas kebijakannya, sesuai dengan program yang ditetapkan.

 String stringSens(byte v) String stringLeak(byte v) String stringSmoke(byte v) String mkTemp1() String mkCont1() String mkLeak1() String mkSmoke1() String mkRelay1() String mkServo1() String mkPeriod() String mkAll() 

Dan fungsi dari eksekusi perintah. Ini adalah fungsi yang dijalankan oleh perintah SMS dan mengubah status sistem, mis., Mengubah pengaturannya atau mengaktifkan atau menonaktifkan aktuator.

 void gprsSetRelay(byte v) void gprsSetServo(byte v) 

Fungsi yang tersisa adalah murni teknis, melakukan semua pekerjaan kasar untuk melayani interaksi antara GPRS Shield dan mikrokontroler.

Sedikit lagi tentang SoftwareSerial


Semua hal di atas tidak cukup untuk GPRS Shield untuk bekerja dalam mode transparan dan berhenti memblokir proses lain yang berjalan pada mikrokontroler. Anda juga perlu memodifikasi kode perpustakaan SoftwareSerial. Faktanya adalah bahwa buffer 64 byte standarnya tidak cukup untuk mencerna sebagian besar perintah AT GSM dan mempertahankan interaksi dinamis antara modul dan controller.

Anda perlu meningkatkan buffer ini menjadi setidaknya 128 byte, dan hanya setelah itu sihir akan bekerja dan GPRS Shield akan mulai bekerja secara normal dalam mode transparan. Ini dilakukan dalam file SoftwareSerial.h . Line

 #define _SS_MAX_RX_BUFF 64 // RX buffer size 

perlu diubah ke

 #define _SS_MAX_RX_BUFF 128 // RX buffer size 

Kesimpulan


Anda melihat pertukaran perintah operator dan respons sistem di layar ponsel cerdas. Dan sementara sistem melakukan puluhan proses dalam mode pseudo-multitasking. Dan GPRS Shield mulai menempati kurang dari 1% dari waktu prosesor, bukannya 99% seperti sebelumnya, membebaskan sisa waktu untuk server web dan tugas-tugas lain untuk mengelola kandang ayam.

gambar

Itu saja, kami mengintegrasikan GPRS Shield ke AMS , mengatasi semua hambatan, membuatnya bekerja dalam mode transparan, tanpa memblokir proses lain seperti server web, pengoperasian sensor nirkabel dan aktuator, dan ini membuka prospek yang menarik untuk membangun sejumlah besar sistem dengan kontrol SMS GSM dan kontrol berdasarkan AMS - rumah kaca, sistem keamanan dan pemanas, berbagai pilihan untuk rumah pintar, dll, dll. hampir tak terhingga.

Source: https://habr.com/ru/post/id401721/


All Articles