Wednesday, November 12, 2014

Send SMS jilid II

Mari kita lanjutkan ke jilid II, coz masih banyak PR dari jilid I :)
Ingat-ingat, apaya PRnya?

Error-nya harus pencat-pencet tombol RESET Mas. Kalo ngak dikasih tau ngak jadi jatuh cinta sama GSMduino Mas ADP. he...

Mari kita inventaris apa sajakah yang dilakuka pada saat proyek mengirim SMS kemarin? Mari kita buat daftarnya,yaitu;
  1. Buka program sendSMS.ino
  2. Hubungkan GSMduino dengan PC
  3. Upload program ke Hardware
  4. Buka 'Serial Monitor'
  5. kalo LED NET mati tekan RESET.
Buat bekal kita mencari error yang terjadi, beberapa informasi dasar dan flowchart-flowchart proses yang terjadi kita bahas dahulu.

Yang pertama, mari kita bahas proses menyalakan modul GSM. Untuk menyalakan modul GSM, setelah diberi catudaya 3.4-4.5V dan SIMCARD terpasang pada tempatnya, Pin PWRKEY harus diberi logika 0 atawa dihubungkan ke GND lebih dari 2detik. Masalah catudaya pada GSMduino sudah ada yang ngurus, anda tidak perlu pusing menentukan tegangan. Yang penting sumber catudaya 9-12V/2A terhubung dengan GSMduino. Masalah SIMCARD, harus dipastikan SIM-nya masih hidup dan ada pulsanya. Mengenai Pin PWRKEY dari datasheet M10 (modul GSM yang kita pakai);

Selain menghidupkan dengan PWRKEY, modul GSM juga dapat dihidupkan lewat RTC. Menghidupkan modul GSM lewat RTC kayaknya masih berat dibahas di sini. Dari pada nanti malah tidak fokus lebih baik tidak dibahas dulu ya :). (padahal yg nulis juga belum ngeh he....).

Yang ke dua, kita bahas bagaimana mematikan modul GSM. Dari datasheet M10, untuk mematikan modul GSM sama dengan menghidupkannya, yaitu memberi logika 0 pada Pin PWRKEY. Dari datasheet M10;


Yang ke dua kita buat flowchartnya. Flowchart program yang kita buat adalah seperti gambar di bawah ini:


 Kalo dilihat dari flowchart, sepertinya sudah benar. Tidak terdapat hal-hal yang aneh, atawa membikin error.


Sekarang kita bahas proses Upload perogram ARDUINO ke hardware. Saat tombol Upload pada sketch ditekan, proses yang dilakukan adalah Compiling program dan kemudian Upload program ke mikrokontroler.

 
Flowchart di atas adalah proses Upload program yang dilakukan sketch (PC) ke mikrokontroler. Lalu bagaimana proses yang terjadi pada mikrokontroler? Berikut ini flowchartnya;


Ternyata pada saat 'Serial Monitor' dibuka juga melakukan proses RESET. Apa saja yang terjadi? berikut ini flowchartnya;


Lalu......?! pusing? sama. hehe.......
Mari kita urutkan kembali.
Langkah 1 (buka program) dan langkah 2 (hubungkan GSMduino dengan PC) kayaknya biasa saja, normatif.
Langkah 3 (Upload program ke hardware) setelah selasai terjadi 1xRESET
Langkah 4 (Buka 'Serial Monitor') terjadi lagi 1xRESET
Mari kita teliti lagi.
  1. setiap RESET, prosedur 'setup' dipanggil.
  2. Isi prosedur 'setup' salah satunya adalah menghidupkan/menyalakan  modulGSM
  3. Setiap menghidupkan modulGSM terjadi Pin PWRKEY aktif LOW.
  4. Pin PWRKEY aktif LOW digunakan untuk menghidupkan dan mematikan modul GSM.

Dari urut-urutan di atas sudah ketemu belum yg menyebabkan ERROR?
Ya Anda Benar! terjadi 2xRESET yaitu pada Langkah 3 dan Langkah 4. RESET pertama akan menghidupkan modul GSM, sedangkan RESET yang kedua malah akan mematikan modul GSM.

Wah.... kok jelek gini rancangan!
sek Mas sabar.... sabar... itu cuma salah satu kelemahan program yg dibuat oleh bule, diantara segambreng kemudahan yang bisa di dapatkan. Tugas kita adalah membuat bubur menjadi enak, caranya ya dikasih bumbu. he...

Cara yang saya usulkan adalah sebelum melakukan RESET, tanyakan dulu apakah modul GSM dalam keadaan hidup atau mati. Jika mati lakukan RESET, jika hidup lompati saja proses RESET.
Setuju Mas, tapi bijimana caranya?
Biasanya jika seseorang masih hidup, maka jika diajukan pertanyaan padanya akan dia jawab. Kalo orang mati ya ngak bisa jawab lagi. Setuju?
Sama dengan modul GSM, jika masih hidup maka jika ditanya akan di jawab, tapi jika mati, ditanya maka akan diam seribu bahasa.
Nanyanya gimana Mas?
Kalo anda mungkin ditanya dengan bahasa Indonesia akan jawab, karena anda bisa bahasa Indonesia. Kalo modul GSM ya nanyanya pakai AT command. Ya betul tanya dengan pertanyaan 'AT/r', kalo hidup maka akan dijawab 'OK', kalo mati ngak akan di jawab.

Mari kita bedah 'setup' tempat RESET terjadi. Isi prosedur 'setup' adalah sebagai berikut;

// initialize serial communications and wait for port to open:

  Serial.begin(9600);
  while (!Serial) {

    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("SMS Messages Sender");

// connection state
  boolean notConnected = true;

  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
  while(notConnected)

  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)

      notConnected = false;
    else

    {
      Serial.println("Not connected");
      delay(1000);
    }
  }
  Serial.println("GSM initialized");

Mana to yang menyebabkan RESET? Ya perintah;

gsmAccess.begin(PINNUMBER)

Perintah ini dieksekusi jika 'notConnected' bernilai 'true'. Padahal variabel ini di atas dideklarasikan dan diberi nilai 'true'

  // connection state
  boolean notConnected = true;

Heladalah, belum-belum sudah yakin 'true' he... (bule yg buat :) )

Modul GSM Conected atawa tidak kan kita ngak tau. sebelum RESET ternyata modul GSM sudah hidup kan harusnya berarti 'notConnected = false'.

Nah kita cari tau dulu status modul GSM baru kita tentukan 'true' atau 'false'. Caranya adalah dengan menambah perintah sebagai berikut;

//==================================================================
  bool resp;
  char auxLocate1 [4];

  theGSM3ShieldV1ModemCore.gss.begin(9600);
  gsmAccess.prepareAuxLocate(PSTR("OK"), auxLocate1);
  theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT"));
  delay(400); 
  theGSM3ShieldV1ModemCore.genericParse_rsp(resp, auxLocate1);
  if(resp) {
    gsmAccess.ModemConfiguration(PINNUMBER);    
    notConnected = false;
  }
//==================================================================

Selipkan program di atas di bawah deklarasi 'notConected'. Sehingga program keseluruhan adalah;

/* 
     SMS sender 
     
     This sketch, for the Arduino GSM shield,sends an SMS message  
     you enter in the serial monitor. Connect your Arduino with the  
     GSM shield and SIM card, open the serial monitor, and wait for  
     the "READY" message to appear in the monitor. Next, type a  
     message to send and press "return". Make sure the serial  
     monitor is set to send a newline when you press return. 
     
     Circuit: 
     * GSM shield  
     * SIM card that can send SMS 
     
     created 25 Feb 2012 
     by Tom Igoe 
     
     This example is in the public domain. 
     
     http://arduino.cc/en/Tutorial/GSMExamplesSendSMS 
     
     */ 
      
    // Include the GSM library
    #include <GSM.h>  
      
    #define PINNUMBER ""  
      
    // initialize the library instance  
    GSM gsmAccess;  
    GSM_SMS sms;  
      
    void setup()  
    {  
    // initialize serial communications and wait for port to open:
      Serial.begin(9600);  
      while (!Serial) {  
        ; // wait for serial port to connect. Needed for Leonardo only  
      }  
        
      Serial.println("SMS Messages Sender");  
      
    // connection state 
      boolean notConnected = true;  
      
    //==================================================================
      bool resp;  
      char auxLocate1 [4];  
      
      theGSM3ShieldV1ModemCore.gss.begin(9600);  
      gsmAccess.prepareAuxLocate(PSTR("OK"), auxLocate1);  
      theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT"));  
      delay(400);   
      theGSM3ShieldV1ModemCore.genericParse_rsp(resp, auxLocate1);  
      if(resp) {  
        gsmAccess.ModemConfiguration(PINNUMBER);      
        notConnected = false;  
      }  
      
    //==================================================================  
      // Start GSM shield  
      // If your SIM has PIN, pass it as a parameter of begin() in quotes 
      while(notConnected)  
      {  
        if(gsmAccess.begin(PINNUMBER)==GSM_READY)  
          notConnected = false;  
        else  
        {  
          Serial.println("Not connected");  
          delay(1000);  
        }  
      }  
        
      Serial.println("GSM initialized");  
  theGSM3ShieldV1ModemCore.setStatus(GSM_READY);
 }  
      
    void loop()  
    {  
      
      Serial.print("Enter a mobile number: ");  
      char remoteNum[20];  // telephone number to send sms
      readSerial(remoteNum);  
      Serial.println(remoteNum);  
         
      // sms text  
      Serial.print("Now, enter SMS content: ");  
      char txtMsg[200];  
      readSerial(txtMsg);  
      Serial.println("SENDING");  
      Serial.println();  
      Serial.println("Message:");  
      Serial.println(txtMsg);  
        
      // send the message 
      sms.beginSMS(remoteNum);  
      sms.print(txtMsg);  
      sms.endSMS();   
      Serial.println("\nCOMPLETE!\n");  
    }  
      
    /* 
      Read input serial 
     */  
    int readSerial(char result[])  
    {  
      int i = 0;  
      while(1)  
      {  
        while (Serial.available() > 0)  
        {  
          char inChar = Serial.read();  
          if (inChar == '\n')  
          {  
            result[i] = '\0';  
            Serial.flush();  
            return 0;  
          }  
          if(inChar!='\r')  
          {  
            result[i] = inChar;  
            i++;  
          }  
        }  
      }  
    } 

 Untuk ganti gsmAccess.begin(PINNUMBER) kita harus memanggil perintah gsmAccess.ModemConfiguration(PINNUMBER).  

Sayangnya perintah ini dalam class GSM berada dalam akses 'privat'. Agak bersusah-susah dikit, tapi jangan takut. Cari file;

......arduino-1.0.5-r2\libraries\GSM\GSM3ShieldV1AccessProvider.h


Letaknya di \libraries\GSM\ pada folder ARDUINO anda.
Anda bisa membukanya dengan Syn editor, VisualC++, Ultra Edit, VB, Delphi, AVRStudio atau editor apapun, tapi jangan notepad, karena nanti acak-acakan tampilannya (kalo terpaksa ngak apa2 he...).
Ini saya buka dengan Delphi.


 Hasilnya

 Jangan lupa di Save.

Guna proses di atas adalah; supaya 'gsmAccess.ModemConfiguration' dapat kita akses untuk menggantikan 'gsmAccess.begin' yang ingin kita hindari karena ada proses LOW Pin PWRKEY.
Ayo kita bahas penambahan perintah yang kita buat. Pertama adalah deklarasi variabel yang kita butuhkan.

  bool resp;
  char auxLocate1 [4];

 Yang kedua adalah perintah mendeklarasikan serial emulator bagi modul GSM. Sebetulnya di dalam perintah 'gsmAccess.begin(PINNUMBER)', perintah ini akan dipanggil, tapi di dalamnya juga akan ada perintah PWRKEY aktif LOW yang kita hindari terlebih dahulu.

  theGSM3ShieldV1ModemCore.gss.begin(9600);

Perintah ke tiga adalah menentukan string yang akan di bandingkan dengan jawaban modul GSM. Jawaban yang diharapkan adalah 'OK'. Perintahnya adalah;

gsmAccess.prepareAuxLocate(PSTR("OK"), auxLocate1);

Perintah ke empat adalah perintah tanya ke modul GSM, yaitu perintah 'AT/r'.

theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT"));
Perintah ke lima tunda 400mS, untuk memberi waktu modul GSM menjawab.

 delay(400); 

Perintah ke enam adalah perintah membandingkan. Jika dijawab 'OK' maka variabel 'notConnected' kita rubah menjadi 'false' agar perintah 'gsmAccess.begin(PINNUMBER)',tidak di eksekusi.

  theGSM3ShieldV1ModemCore.genericParse_rsp(resp, auxLocate1);
  if(resp) {
    gsmAccess.ModemConfiguration(PINNUMBER);    
    notConnected = false;
  }

Dan jangan lupa kasih status GSM_READY supaya GSM bisa buat SMSan :). Pemberian status ini dapat dilakukan di akhir prosedur setup.

 theGSM3ShieldV1ModemCore.setStatus(GSM_READY);

Kalo status anda apa? Kawain atau Tidak Kawin hehe....
Sudah sehat sekarang program kita :)

Jangan jemu ya menunggu posting berikutnya. Pasti tambah SERU!
Semoga Bermanfaat.

1 comment:

Akulah Pathub said...

hmmm.... seru problem solving nya
masih banyak yg harus saya pelajari