GSM Shield + Arduino Mega + библиотека SIM900

alexandr_22
Offline
Зарегистрирован: 15.03.2015

Здравствуйте!

Помогите, пожалуйста, разобраться что делаю не так. В общем, исходные данные:

К Arduino Mega подключаю GSM шилд (http://www.ebay.com/itm/SIM900-Quad-band-GSM-GPRS-Shield-for-Arduino-UNO...). Перемычки ставлю GRX-D3 и GTX-D2 + ставлю перемычки между D2-D19 и D3-D18 (где-то прочитал что без этого не работает - так и есть, как только ставлю перемычки подключается).

Питание на Arduino Mega от блока питания.

Заливаю скетч:

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

#define pinRED  12        //на этот пин повешал светодиод, который должен вкл/выкл
#define pinPower 7        //этим сигналом включаем шилд (?)

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
char position;
String myCommand = "";

void setup() 
{
  
  pinMode(pinRED, OUTPUT); 
  digitalWrite(pinRED, LOW);
	
  pinMode(pinPower, OUTPUT); 
  digitalWrite(pinPower, HIGH);

  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");

  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  } else {
  	Serial.println("\nstatus=IDLE");
  }

  if(started){
    //если всё нормально отправляем смс
    sms.SendSMS("+71234567890", "Arduino GSM Enable");
    Serial.println("\nSMS sent OK");
  }

  //Очистка от старых смс
  for(position=0;position<=25;position++) {
  	sms.DeleteSMS(position);
  }

};

void loop() 
{

  position = sms.IsSMSPresent(SMS_UNREAD);
  
  if(started){
    //Read if there are messages on SIM card and print them.
    if(sms.GetSMS(position, n, smsbuffer, 160))
    {
      Serial.println(n);
      Serial.println(smsbuffer);
      myCommand = smsbuffer;
            
      if (myCommand = "on"){
        //Serial.println(smsbuffer);
      	digitalWrite(pinRED, HIGH);
      }
      if (myCommand = "off"){
      	//Serial.println(smsbuffer);
        digitalWrite(pinRED, LOW);
      }
    }
    delay(1000);
    
  }

  sms.DeleteSMS(position);  //удаление сообщение

};

Работает не сильно стабильно, но в основном запускается, отправляет сообщение и даже их принимает, вод логи из сериал монитора (конечно часть):

ATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: 
OK
ATT: +CMGL:
RIC: 
OK
+712345678910
on

Ну и собственно есть следующие проблемы:

1. Главная - светодиод не включается, не выключается

2. Судя по сообщениям сериал-монитора, последнее сообщение не удаляется.

И ещё, пробовал запустить этот шилд с помощью АТ-команд, там вообще тишина, ни отправить не принять..

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Попробуйте стандартную библиотеку, идущую с  IDE GSM.h
У меня была аналогичная ситуация с удалением в SIM900.h - не совпадали position
Еще один момент, что СМС могут приходить с переводами строк, потому проверки

if (myCommand = "on"){

не всегда достаточно.
Попробуйте

if (myCommand = "on" || myCommand.substring(0,1) == "on"){

 

alexandr_22
Offline
Зарегистрирован: 15.03.2015

Благодарю, про стандартную библиотеку что-то не подумал даже. Удаление думаю осуществить циклом (как при старте), может не сильно эстетично, но думаю должно сработать. Вечером обязательно попробую Ваш код, надеюсь это решит проблему, очень уж мне понравился алгоритм работы с этой библиотекой.

alexandr_22
Offline
Зарегистрирован: 15.03.2015

Вроде получил нужный результат, осталось добиться стабильной работы, вот рабочий скетч.

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

#define pinRED  12        //на этот пин повешал светодиод, который должен вкл/выкл
#define pinPower 7        //этим сигналом включаем шилд 

boolean started=false;
char smsbuffer[160];
char n[20];
char position;
String myCommand = "";

void setup() 
{
	pinMode(pinRED, OUTPUT); 
	pinMode(pinPower, OUTPUT);

	digitalWrite(pinRED, HIGH);		

	digitalWrite(pinPower, HIGH);
	delay(1000);
    digitalWrite(pinPower, LOW);
  	delay(2000);
  	digitalWrite(pinPower, HIGH);
  
  	digitalWrite(pinRED, LOW);

  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");

  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  } else {
  	Serial.println("\nstatus=IDLE");
  }

  if(started){
    //если всё нормально отправляем смс
    sms.SendSMS("+71234567890", "Arduino GSM Enable");
    Serial.println("\nSMS sent OK");
  }

  //Очистка от старых смс
  for(position=1;position<=21;position++) {
  	sms.DeleteSMS(position);
  }

  myCommand = "";

};

void loop() 
{

  position = sms.IsSMSPresent(SMS_UNREAD);
  
  if(position){
    //Read if there are messages on SIM card and print them.
    if(sms.GetSMS(position, n, smsbuffer, 160))
    {
      Serial.println(n);
      Serial.println(smsbuffer);

      myCommand = String(smsbuffer);

      if ((myCommand == "on") || (myCommand.substring(0,1) == "on")){
      	digitalWrite(pinRED, HIGH);
      }

      if ((myCommand == "off") || (myCommand.substring(0,1) == "off")){

        digitalWrite(pinRED, LOW);
      }
	
  	sms.DeleteSMS(position);  

    }
    delay(1000);
    
  }

};

 

barmalei321
Offline
Зарегистрирован: 20.04.2015

Привет alexandr_22 бутьде так добры сфотографируйте как вы подсоединили перемычки.

alexandr_22
Offline
Зарегистрирован: 15.03.2015

Привет. Фото только такого качества есть (пока возможности сделать лучшего качества нет). Суть в том, что бы сделать перемычки 19<->2, 18<->3, и шилд должен быть установлен на Мегу,  просто с перемычками не будет работать.

barmalei321
Offline
Зарегистрирован: 20.04.2015

Спасибо за фото, но у меня arduino uno. Перемычки ставлю GRX-D3 и GTX-D2 а в ответ тишина вот скетч

barmalei321
Offline
Зарегистрирован: 20.04.2015
#include <GSM.h>

#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess; // include a 'true' parameter for debug enabled
GSM_SMS sms;

// char array of the telephone number to send SMS
// change the number 1-212-555-1212 to a number
// you have access to
char remoteNumber[20]= "12125551212";  

// char array of the message
char txtMsg[200]="Test";

void setup()
{
  // initialize serial communications
  Serial.begin(9600);

  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");
  sendSMS();
}

void loop()
{
// nothing to see here
}

void sendSMS(){

  Serial.print("Message to mobile number: ");
  Serial.println(remoteNumber);

  // sms text
  Serial.println("SENDING");
  Serial.println();
  Serial.println("Message:");
  Serial.println(txtMsg);

  // send the message
  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
  Serial.println("\nCOMPLETE!\n");  
}
 

 

barmalei321
Offline
Зарегистрирован: 20.04.2015