+1 đánh giá

Điều khiển từ qua qua SMS đơn giản với Arduino

Bài hướng dẫn sẽ giúp bạn cài đặt hệ thống điều khiển từ xa qua GPRS/GSM SMS dễ dàng.

Bước 1: Chuẩn bị
khoere_sms-control-4275184138.png khoere_kim-457721282.jpg

- Board Arduino UNO

- Shield GPRS

- Shield Role

- Board cắm dây

- Kìm

- Băng dính

- LED

Bước 2: Gắn thẻ SIM
khoere_sms-sim-989379393.jpg khoere_sms-sim2-763300973.jpg

Bạn cần đảm bảo rằng SIM đã được kích hoạt, có tiền trong tài khoản và nhớ ghi SĐT của SIM này ra giấy

Bước 3: Giao tiếp với Arduino bằng cổng nối tiếp trên GPRS Shield

- Với Shield Arduino, bạn có thể giao tiếp qua cổng nối tiếp có sẵn trên Shield  bằng phần mềm hoặc cổng Serial phần cứng, với phần cứng thì ta dùng Serial1 (D0,D1) trên Arduino, thường cổng này được nối với Cáp USB để nối lên máy tính. Còn Serial bằng phần mềm nằm ở chân D2,D3. (Nếu bạn thắc mắc thế nào là Serial bằng cứng và phần mềm thì tôi có thể giải thích như sau: với phần cứng thì Arduino có cả phần cứng đầy đủ của cổng nối tiếp, bộ đệm..với phần mềm thì hệ lập trình sẽ giả lập một bộ nối tiếp ở bất kỳ chân nào).

- Bạn cần chuyển 2 Jump TX và RX về phía có dòng dành cho Xduino.

Bước 4: Nạp chương trình

- Trước tiên bạn cần cấu hình để tăng bộ nhớ đệm của bộ truyền nối tiếp vì mặc định bộ nhớ đệm chỉ 64B, không đủ cho 1 tin nhắn SMS gồm 128 ký tự.

Mở file: SoftwareSerial.h ở đường dẫn arduinolibrariesSoftwareSerial, và sửa dòng
#define _SS_MAX_RX_BUFF 64 // RX buffer size
thành
#define _SS_MAX_RX_BUFF 128 // RX buffer size

- Bạn mở Arduino IDE lên, mở chương trình ở phần đính kèm lên, 

#include <SoftwareSerial.h>
 

// msg lưu tin nhắn nhận được
String msg = String();
// EN: 
int SmsContentFlag = 0;
//chân rơle
int relay_a=4;
int relay_b=5;
int relay_c=6;
int relay_d=7;

// EN: Mã PIN của SIM nếu có
//String SIM_PIN_CODE = String( XXXX );
 
void setup()
{
  Serial.begin(19200);                 // Định nghĩa tốc độ Baund, thường Shield Arduino sẽ  nhận tốc độ tự động.
  // cầu hình I/O
  pinMode( 4, OUTPUT ); 
  pinMode( 5, OUTPUT ); 
  pinMode( 6, OUTPUT ); 
  pinMode( 7, OUTPUT ); 
  digitalWrite( 4, LOW ); 
  digitalWrite( 5, LOW ); 
  digitalWrite( 6, LOW );
  digitalWrite( 7, LOW );
 Serial.println( AT+CMGF=1 ); 
 delay(200);
}
 
void loop()
{
    char SerialInByte;
    if(Serial.available())
    {       
        SerialInByte = (unsigned char)Serial.read();
       delay(5);
        
        // -------------------------------------------------------------------
        // EN: Chương trình sẽ kiểm tra bộ nhớ tin nhắn liên tục
        // -------------------------------------------------------------------
       // EN: nếu tin kết thúc bằng <CR> thì kiểm tra tin nhắn
        if( SerialInByte == 13 ){
          // EN: Đoc tin nhắn
          ProcessGprsMsg();
         }
         if( SerialInByte == 10 ){
            // EN: 
         }
         else {
           // EN: Lưu vào msg
           msg += String(SerialInByte);
         }
     }   
}
// EN: Kiêm tra nội dung
//    
void ProcessSms( String sms ){
  
  if( sms.indexOf(ona) >= 0 ){ // Nếu có dòng ona thì mở Role a và tương tự
    digitalWrite( relay_a, HIGH );
  }
   if( sms.indexOf(onb) >= 0 ){
    digitalWrite(  relay_b, HIGH );
  }
   if( sms.indexOf(onc) >= 0 ){
    digitalWrite(  relay_c, HIGH );
  }
  if( sms.indexOf(ond) >= 0 ){
    digitalWrite(  relay_d, HIGH );
  }
  if( sms.indexOf(offa) >= 0 ){
    digitalWrite(  relay_a, LOW );
  }
  if( sms.indexOf(offb) >= 0 ){
    digitalWrite(  relay_b, LOW );
  }
  if( sms.indexOf(offc) >= 0 ){
    digitalWrite(  relay_c, LOW );
  }
  if( sms.indexOf(offd) >= 0 ){
    digitalWrite(  relay_d, LOW );
  }
}
// EN: Cấu hình Text mode cho tin nhắn, nếu ko bạn sẽ chỉ nhận được các số ACSII vô nghĩa
void GprsTextModeSMS(){
  Serial.println( AT+CMGF=1 );
}

void GprsReadSmsStore( String SmsStorePos ){
  Serial.print( AT+CMGR= );
  Serial.println( SmsStorePos );
}

// EN: Clear the GPRS shield message buffer
void ClearGprsMsg(){
  msg = ;
}

// EN: interpret the GPRS shield message and act appropiately
void ProcessGprsMsg() {
  if( msg.indexOf( Call Ready ) >= 0 ){
   //  Serial.println( *** GPRS Shield registered on Mobile Network *** );
     GprsTextModeSMS();
  }
  
  // EN: unsolicited message received when getting a SMS message
  if( msg.indexOf( +CMTI ) >= 0 ){
   //  Serial.println( *** SMS Received *** );
     // EN: Look for the coma in the full message (+CMTI: SM,6)
     //     In the sample, the SMS is stored at position 6
     int iPos = msg.indexOf( , );
     String SmsStorePos = msg.substring( iPos+1 );
   //  Serial.print( SMS stored at  );
  //   Serial.println( SmsStorePos );     
     // EN: Ask to read the SMS store
     GprsReadSmsStore( SmsStorePos );
  }
  
  // EN: SMS store readed through UART (result of GprsReadSmsStore request)  
  if( msg.indexOf( +CMGR: ) >= 0 ){
    // EN: Next message will contains the BODY of SMS
    SmsContentFlag = 1;
    // EN: Following lines are essentiel to not clear the flag!
    ClearGprsMsg();
    return;
  }
  
  // EN: +CMGR message just before indicate that the following GRPS Shield message 
  //     (this message) will contains the SMS body 
  if( SmsContentFlag == 1 ){
 //   Serial.println( *** SMS MESSAGE CONTENT *** );
 //   Serial.println( msg );
 //   Serial.println( *** END OF SMS MESSAGE *** );
    ProcessSms( msg );
  }
  
  ClearGprsMsg();
  // EN: Always clear the flag
  SmsContentFlag = 0; 
}

 

(!) Nếu có bất kỳ thắc mắc nào cần hỏi vui lòng đặt câu hỏi tại HỏiHay.Net, Cộng đồng Hỏi đáp Hỏi Hay sẽ trả lời bạn.
1,783 lượt xem ^tháng ^ngày, ^năm
admin 2,030 điểm

Please log in or register to Comment this Media.

ẩn danh
good...
+1 đánh giá
^tháng ^ngày, ^năm