gsm module

Arduino shields
Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

gsm module

Berichtdoor ercmrj » 28 Mrt 2015, 14:42

Ik heb onlangs een "GPRS/GSM SIM900 Shield" gekocht en ben deze nu aan het uitproberen met behulp van deze site:

http://www.cooking-hacks.com/documentat ... troduction

Als ik een sms naar de module stuur met mijn gsm dan kan ik de tekst lezen op de serieele monitor, de module is echter bedoelt om smsjes te lezen die van een gps tracker komen, echter op mijn gsm zijn de smsjes normaal te lezen die door de tracker gestuurd worden, maar als ik de gps-tracker een sms laat sturen naar de module dan zie ik op de serieele monitor van de arduino dit:

Starting...
AT
AT+CPIN=****
Setting SMS mode...
AT+CMGF=1
AT+CPMS="SM","SM","SM"
AT+CMGR=1
"REC UNREAD","+31683898829","","15/03/28,13:20:04+04"
00700061007300730077006F00720064002000650072007200210020000A

OKAT+CMGD=1

Daar waar de reeks getallen staan zou de tekst moeten staan.

Iemand enig idee hoe ik dit op kan lossen?

Dit is de code die in de arduino staat:
Code: Alles selecteren
int8_t answer;
int x;
int onModulePin= 2;
char SMS[200];

void setup(){

    pinMode(onModulePin, OUTPUT);
    Serial.begin(115200); 

    Serial.println("Starting...");
    power_on();
   
    delay(3000);
   
    // sets the PIN code
    sendATcommand("AT+CPIN=****", "OK", 2000);
   
    delay(3000);
   
    Serial.println("Setting SMS mode...");
    sendATcommand("AT+CMGF=1", "OK", 1000);    // sets the SMS mode to text
    sendATcommand("AT+CPMS=\"SM\",\"SM\",\"SM\"", "OK", 1000);    // selects the memory

    answer = sendATcommand("AT+CMGR=1", "+CMGR:", 2000);    // reads the first SMS
    if (answer == 1)
    {
        answer = 0;
        while(Serial.available() == 0);
        // this loop reads the data of the SMS
        do{
            // if there are data in the UART input buffer, reads it and checks for the asnwer
            if(Serial.available() > 0){   
                SMS[x] = Serial.read();
                x++;
                // check if the desired answer (OK) is in the response of the module
                if (strstr(SMS, "OK") != NULL)   
                {
                    answer = 1;
                }
            }
        }while(answer == 0);    // Waits for the asnwer with time out
       
        SMS[x] = '\0';
       
        Serial.print(SMS);   
        sendATcommand("AT+CMGD=1", "OK", 1000); // DIT WIST HET GEHEUGEN EN ZORGT ERVOO
                                                // DAT ER MAAR EEN SMS TE ZIEN IS 
    }
    else
    {
        Serial.print("error ");
        Serial.println(answer, DEC);
    }


}


void loop(){

}

void power_on(){

    uint8_t answer=0;
   
    // checks if the module is started
    answer = sendATcommand("AT", "OK", 2000);
    if (answer == 0)
    {
        // power on pulse
        digitalWrite(onModulePin,HIGH);
        delay(3000);
        digitalWrite(onModulePin,LOW);
   
        // waits for an answer from the module
        while(answer == 0){     // Send AT every two seconds and wait for the answer
            answer = sendATcommand("AT", "OK", 2000);   
        }
    }
   
}

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){

    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;

    memset(response, '\0', 100);    // Initialice the string

    delay(100);

    while( Serial.available() > 0) Serial.read();    // Clean the input buffer

    Serial.println(ATcommand);    // Send the AT command


        x = 0;
    previous = millis();

    // this loop waits for the answer
    do{
        // if there are data in the UART input buffer, reads it and checks for the asnwer
        if(Serial.available() != 0){   
            response[x] = Serial.read();
            x++;
            // check if the desired answer is in the response of the module
            if (strstr(response, expected_answer) != NULL)   
            {
                answer = 1;
            }
        }
        // Waits for the asnwer with time out
    }while((answer == 0) && ((millis() - previous) < timeout));   

    return answer;
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: gsm module

Berichtdoor nicoverduin » 28 Mrt 2015, 15:37

Altijd fijn als je uit het oude ascii/ebcdic tijdperk kom:)
Dit staat er:
cpp code
00
7000 p
6100 a
7300 s
7300 s
7700 w
6F00 o
7200 r
6400 d
2000
6500 e
7200 r
7200 r
2100 !
2000
0A

Dus komt de boodschap neer op een byte 00, daarna 2 bytes per teken waarbij de eerste byte gebruikt kan worden (in hex) langs de ascii tabel) en een 0x0A (line feed) als terminator
Daar de boodschap elke 4 bits apart verstuurt, zul je de string moeten omzetten in de feitelijke tekens.

Samenvattend:

Elke byte (of char wat je wilt) bestaat uit 2 tekens uit de string (ascii). Dus als er staat 7200 is dat 4 tekens die je binnen krijgt. Uiteindelijk wordt dat als je dit als bytes will zien: 72 00 en is voor jouw de eerste byte relevant (=72). Zoek je dit op in een ascii tabel dan vind je de letter "r". Echter als je Serial.write(72) doet (dus geen print) dan krijg je ook de letter "r"

Edit nog eens naar de string gekeken. Je kan het ook zo zien:

cpp code
00 70	p
00 71 a
00 73 s
00 73 s
00 77 w
00 6F o
00 72 r
00 64 d
00 20
00 65 e
00 72 r
00 72 r
00 21 !
00 20
00 0A end of line

Dit lijkt mij nog meer logisch. :mrgreen: Ik vermoed dat het Unicode is
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: gsm module

Berichtdoor ercmrj » 28 Mrt 2015, 16:37

Zou ik dan ook het bericht moeten vertalen naar die oude code en naar de tracker toe moeten sturen, want ik stuurde "begin123456" en verwacht dan terug "begin ok!"

edit:
Ik heb met mijn gsm "begin123456" gestuurd en idd Nico het klopt als een bus, nu krijg ik een regel terug en als ik die vertaal levert dat de coordinaten op waar de tracker zich bevindt.

Heel erg bedankt alvast.

2e probleem waar ik mee zit is dat ik de serieele monitor elke keer aan en uit moet zetten wil ik een nieuwe sms kunnen uitlezen. Voor mij is het script nog een beetje te moeilijk om daar een oplossing voor te vinden.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: gsm module

Berichtdoor nicoverduin » 28 Mrt 2015, 17:43

De Seriële monitor uit/aan zetten leidt tot een reset. Dus start je programma opnieuw. Mogelijk zit daar je probleem.

Edit: ff gekeken naar je code. Het klopt dat hij maar naar 1 sms luistert... Dit doe je in de setup() allemaal en je moet dat verplaatsen naar de loop(). Daar gebeurt helemaal niets.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: gsm module

Berichtdoor ercmrj » 28 Mrt 2015, 19:44

Krijg dat zo nog niet voor elkaar Nico, het programma komt nu idd in een loop, maar hij blijft de 1e sms lezen, maar ik heb wel iets anders gevonden een software reset:

http://www.instructables.com/id/two-way ... /?ALLSTEPS

Daar kan ik voorlopig mee vooruit.
Nu nog een vertaalroutine maken om die cijfers naar tekst te krijgen, zal wel een hele klus worden schat ik.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: gsm module

Berichtdoor nicoverduin » 29 Mrt 2015, 11:02

ercmrj schreef:Krijg dat zo nog niet voor elkaar Nico, het programma komt nu idd in een loop, maar hij blijft de 1e sms lezen, maar ik heb wel iets anders gevonden een software reset:

http://www.instructables.com/id/two-way ... /?ALLSTEPS

Daar kan ik voorlopig mee vooruit.
Nu nog een vertaalroutine maken om die cijfers naar tekst te krijgen, zal wel een hele klus worden schat ik.

Daar kan je niet mee vooruit.... Je start het programma elke keer opnieuw
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: gsm module

Berichtdoor ercmrj » 03 Apr 2015, 20:32

Na heel wat uren zoeken en proberen heb ik hier:
http://www.theengineeringprojects.com/2 ... duino.html
nog een ander "simpeler" programma gevonden, het werkt nu perfect maar het zal wel niet de juiste methode zijn want ik heb nog steeds de reset functie nodig.

Als iemand weet hoe het netter kan hoor ik het graag.

Code: Alles selecteren
    char RcvdMsg[200] = "";
    int RcvdCheck = 0;
    int RcvdConf = 0;
    int index = 0;
    int RcvdEnd = 0;
    char MsgMob[15];
    char MsgTxt[50];
    int MsgLength = 0;
    void(* resetFunc) (void) = 0;// Dit zorgt ervoor dat je het programma kan resetten
    boolean messageReceived=false;

    void setup()
    {
    Serial.begin(9600);
    Config();
    }

    void loop()
    {
   
    RecSMS();
    if (messageReceived)
      {
      Serial.println("reset");
      delay(2000);
      resetFunc(); //call reset
      }   
    }

    void Config() // This function is configuring our SIM900 module i.e. sending the initial AT commands
    {
    delay(1000);
    Serial.print("ATE0\r");
    Response();
    Serial.print("AT\r");
    Response();
    Serial.print("AT+CMGF=1\r");
    Response();
    Serial.print("AT+CNMI=1,2,0,0,0\r");
    Response();
    }

    void Response() // Get the Response of each AT Command
    {
    int count = 0;
    Serial.println();
    while(1)
    {
    if(Serial.available())
    {
    char data =Serial.read();
    if(data == 'K'){Serial.println("OK");break;}
    if(data == 'R'){Serial.println("GSM Not Working");break;}
    }
    count++;
    delay(10);
    if(count == 1000){Serial.println("GSM not Found");break;}

    }
    }

    void RecSMS() // Receiving the SMS and extracting the Sender Mobile number & Message Text
    {
    if(Serial.available())
      {
      char data = Serial.read();
      if(data == '+'){RcvdCheck = 1;}
      if((data == 'C') && (RcvdCheck == 1)){RcvdCheck = 2;}
      if((data == 'M') && (RcvdCheck == 2)){RcvdCheck = 3;}
      if((data == 'T') && (RcvdCheck == 3)){RcvdCheck = 4;}
      if(RcvdCheck == 4){index = 0; RcvdConf = 1; RcvdCheck = 0;}
 
      if(RcvdConf == 1)
        {
        if(data == '\n'){RcvdEnd++;}
        if(RcvdEnd == 3){RcvdEnd = 0;}
        RcvdMsg[index] = data;
   
        index++;
        if(RcvdEnd == 2){RcvdConf = 0;MsgLength = index-2;}
        if(RcvdConf == 0)
          {
          Serial.print("Mobile Number is: ");
          for(int x = 4;x <17;x++)
            {
            MsgMob[x-4] = RcvdMsg[x];
            Serial.print(MsgMob[x-4]);
            }
          Serial.println();
          Serial.print("Message Text: ");
          //Serial.print("rcvdmsg");Serial.println(RcvdMsg);
          for(int x = 46;x <MsgLength;x++)
            {
            MsgTxt[x-46] = RcvdMsg[x];
            Serial.print(MsgTxt[x-46]);
            }
          Serial.println();
          messageReceived = true;
          }
        }
      }
    }

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: gsm module

Berichtdoor nicoverduin » 04 Apr 2015, 08:21

En als je resetFunc() weglaat komt er maar 1 message binnen?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: gsm module

Berichtdoor ercmrj » 04 Apr 2015, 19:13

Hij reageert wel op een sms, maar hij print geen tekst op de Seriële monitor en in de variabele RcvdMsg staat nog de oude tekst. Ik ben nu ff niet in de gelegenheid om iets te testen maar het zou natuurlijk kunnen dat hij het eerste sms nog in het geheugen heeft en het 2e smsje erachter of zo. Dat was bij het vorige script ook het geval. Alleen zie ik bij dit script nog niet zo vlug wat ik zou moeten doen om het 2e te lezen.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: gsm module

Berichtdoor nicoverduin » 04 Apr 2015, 21:44

Dat zou zomaar eens kunnen wat je daar zegt. Je hebt een aantal variabelen die initialiseert voor de setup() Zoals bijv. de index. Maar waar worden al die variabelen gereset na het verwerken van een message? Je zou al die variabelen kunnen initialiseren aan het begin van recSMS.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Shields

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten