Joseph Radford
/
Seeed_Arch_GPRS_V2_Send_SMS_HelloWorld
Demonstration of sending an SMS using the Arch GPRS V2
main.cpp@0:c58b0bf4e8ee, 2015-10-25 (annotated)
- Committer:
- jtr89
- Date:
- Sun Oct 25 02:11:56 2015 +0000
- Revision:
- 0:c58b0bf4e8ee
Initial commit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jtr89 | 0:c58b0bf4e8ee | 1 | /* |
jtr89 | 0:c58b0bf4e8ee | 2 | * Project: Seeed Arch GPRS V2 Send SMS Hello World |
jtr89 | 0:c58b0bf4e8ee | 3 | * Author: Joseph Radford |
jtr89 | 0:c58b0bf4e8ee | 4 | * Date: 25/10/2015 |
jtr89 | 0:c58b0bf4e8ee | 5 | * Target: Arch GPRS V2 |
jtr89 | 0:c58b0bf4e8ee | 6 | * Peripherals: SIM Card |
jtr89 | 0:c58b0bf4e8ee | 7 | */ |
jtr89 | 0:c58b0bf4e8ee | 8 | |
jtr89 | 0:c58b0bf4e8ee | 9 | #include "mbed.h" |
jtr89 | 0:c58b0bf4e8ee | 10 | |
jtr89 | 0:c58b0bf4e8ee | 11 | // declare pins for comms with the SIM900 |
jtr89 | 0:c58b0bf4e8ee | 12 | #define TX_GSM P1_27 |
jtr89 | 0:c58b0bf4e8ee | 13 | #define RX_GSM P1_26 |
jtr89 | 0:c58b0bf4e8ee | 14 | |
jtr89 | 0:c58b0bf4e8ee | 15 | // PINPWR to low on Q10 drives 3V3 to Q7, which drives Q5 to ground, which powers VBAT_900, with either VCC_BUCK or VCC_BAT |
jtr89 | 0:c58b0bf4e8ee | 16 | #define PINPWR P1_2 |
jtr89 | 0:c58b0bf4e8ee | 17 | |
jtr89 | 0:c58b0bf4e8ee | 18 | // PINONOFF controls PWRKEY on the SIM900, see manual for more info |
jtr89 | 0:c58b0bf4e8ee | 19 | #define PINONOFF P1_7 |
jtr89 | 0:c58b0bf4e8ee | 20 | |
jtr89 | 0:c58b0bf4e8ee | 21 | // declare LEDs |
jtr89 | 0:c58b0bf4e8ee | 22 | DigitalOut myled1(LED2); //left most LED if board is held as shown in Pinout diagram above |
jtr89 | 0:c58b0bf4e8ee | 23 | DigitalOut myled2(LED3); //2nd from left |
jtr89 | 0:c58b0bf4e8ee | 24 | DigitalOut myled3(LED4); //3rd from left |
jtr89 | 0:c58b0bf4e8ee | 25 | DigitalOut myled4(LED1); //4th from left (right most) |
jtr89 | 0:c58b0bf4e8ee | 26 | |
jtr89 | 0:c58b0bf4e8ee | 27 | // create pins for controlling power to SIM900 |
jtr89 | 0:c58b0bf4e8ee | 28 | DigitalOut m_sim900_pwr(PINPWR); |
jtr89 | 0:c58b0bf4e8ee | 29 | DigitalOut m_sim900_on (PINONOFF); |
jtr89 | 0:c58b0bf4e8ee | 30 | |
jtr89 | 0:c58b0bf4e8ee | 31 | // create object for UART comms to SIM900 |
jtr89 | 0:c58b0bf4e8ee | 32 | Serial m_sim900_serial (TX_GSM, RX_GSM); |
jtr89 | 0:c58b0bf4e8ee | 33 | |
jtr89 | 0:c58b0bf4e8ee | 34 | |
jtr89 | 0:c58b0bf4e8ee | 35 | // flash each LED one at a time, and then leave all off |
jtr89 | 0:c58b0bf4e8ee | 36 | void flashSequence() |
jtr89 | 0:c58b0bf4e8ee | 37 | { |
jtr89 | 0:c58b0bf4e8ee | 38 | myled1 = 1; myled2 = 0; myled3 = 0; myled4 = 0; |
jtr89 | 0:c58b0bf4e8ee | 39 | wait(0.5); |
jtr89 | 0:c58b0bf4e8ee | 40 | myled1 = 0; myled2 = 1; |
jtr89 | 0:c58b0bf4e8ee | 41 | wait(0.5); |
jtr89 | 0:c58b0bf4e8ee | 42 | myled2 = 0; myled3 = 1; |
jtr89 | 0:c58b0bf4e8ee | 43 | wait(0.5); |
jtr89 | 0:c58b0bf4e8ee | 44 | myled3 = 0; myled4 = 1; |
jtr89 | 0:c58b0bf4e8ee | 45 | wait(0.5); |
jtr89 | 0:c58b0bf4e8ee | 46 | myled4 = 0; |
jtr89 | 0:c58b0bf4e8ee | 47 | } |
jtr89 | 0:c58b0bf4e8ee | 48 | |
jtr89 | 0:c58b0bf4e8ee | 49 | int main() |
jtr89 | 0:c58b0bf4e8ee | 50 | { |
jtr89 | 0:c58b0bf4e8ee | 51 | /* start up sequence, so we know we reached main */ |
jtr89 | 0:c58b0bf4e8ee | 52 | flashSequence(); |
jtr89 | 0:c58b0bf4e8ee | 53 | |
jtr89 | 0:c58b0bf4e8ee | 54 | // set up baud rate. Borrowed from http://tronixstuff.com/2014/01/08/tutorial-arduino-and-sim900-gsm-modules/ |
jtr89 | 0:c58b0bf4e8ee | 55 | m_sim900_serial.baud(19200); |
jtr89 | 0:c58b0bf4e8ee | 56 | |
jtr89 | 0:c58b0bf4e8ee | 57 | |
jtr89 | 0:c58b0bf4e8ee | 58 | /* POWER ON SIM900 */ |
jtr89 | 0:c58b0bf4e8ee | 59 | |
jtr89 | 0:c58b0bf4e8ee | 60 | // power on sequence borrowed from http://gronlier.fr/blog/2014/11/seeeduino-arch-gprs-v2/ |
jtr89 | 0:c58b0bf4e8ee | 61 | // order of events specified by the SIM900 manual |
jtr89 | 0:c58b0bf4e8ee | 62 | m_sim900_pwr.write(1); // turn power supply off |
jtr89 | 0:c58b0bf4e8ee | 63 | m_sim900_on.write(1); |
jtr89 | 0:c58b0bf4e8ee | 64 | wait(0.5); // wait to settle |
jtr89 | 0:c58b0bf4e8ee | 65 | |
jtr89 | 0:c58b0bf4e8ee | 66 | m_sim900_pwr.write(0); // turn power supply on |
jtr89 | 0:c58b0bf4e8ee | 67 | m_sim900_on.write(0); // from the ref: "drive the PWRKEY to a low level for 1 second then release." |
jtr89 | 0:c58b0bf4e8ee | 68 | wait(1); // wait for one second |
jtr89 | 0:c58b0bf4e8ee | 69 | |
jtr89 | 0:c58b0bf4e8ee | 70 | m_sim900_on.write(1); // release power key |
jtr89 | 0:c58b0bf4e8ee | 71 | wait(20 /*0.5*/); // wait to settle |
jtr89 | 0:c58b0bf4e8ee | 72 | |
jtr89 | 0:c58b0bf4e8ee | 73 | |
jtr89 | 0:c58b0bf4e8ee | 74 | |
jtr89 | 0:c58b0bf4e8ee | 75 | /* SEND A MESSAGE */ |
jtr89 | 0:c58b0bf4e8ee | 76 | |
jtr89 | 0:c58b0bf4e8ee | 77 | // the following sequence and messages are borrowed from http://tronixstuff.com/2014/01/08/tutorial-arduino-and-sim900-gsm-modules/ |
jtr89 | 0:c58b0bf4e8ee | 78 | // Set SMS mode |
jtr89 | 0:c58b0bf4e8ee | 79 | m_sim900_serial.printf("AT+CMGF=1\r\n"); // AT command to send SMS message |
jtr89 | 0:c58b0bf4e8ee | 80 | myled1 = 1; |
jtr89 | 0:c58b0bf4e8ee | 81 | wait(0.1); |
jtr89 | 0:c58b0bf4e8ee | 82 | |
jtr89 | 0:c58b0bf4e8ee | 83 | // Send phone number |
jtr89 | 0:c58b0bf4e8ee | 84 | m_sim900_serial.printf("AT + CMGS = \"+61123456789\"\r\n"); // recipient's mobile number, in international format |
jtr89 | 0:c58b0bf4e8ee | 85 | myled2 = 1; |
jtr89 | 0:c58b0bf4e8ee | 86 | wait(0.1); |
jtr89 | 0:c58b0bf4e8ee | 87 | |
jtr89 | 0:c58b0bf4e8ee | 88 | // Send text |
jtr89 | 0:c58b0bf4e8ee | 89 | m_sim900_serial.printf("Hello, world. This is a text message from an Arch GPRS V2.\r\n"); // message to send |
jtr89 | 0:c58b0bf4e8ee | 90 | myled3 = 1; |
jtr89 | 0:c58b0bf4e8ee | 91 | wait(0.1); |
jtr89 | 0:c58b0bf4e8ee | 92 | |
jtr89 | 0:c58b0bf4e8ee | 93 | // End message |
jtr89 | 0:c58b0bf4e8ee | 94 | m_sim900_serial.putc((char)26); // End AT command with a ^Z, ASCII code 26 |
jtr89 | 0:c58b0bf4e8ee | 95 | m_sim900_serial.printf("\r\n"); |
jtr89 | 0:c58b0bf4e8ee | 96 | myled4 = 1; |
jtr89 | 0:c58b0bf4e8ee | 97 | wait(0.1); |
jtr89 | 0:c58b0bf4e8ee | 98 | |
jtr89 | 0:c58b0bf4e8ee | 99 | // do nothing for a bit |
jtr89 | 0:c58b0bf4e8ee | 100 | wait(5); |
jtr89 | 0:c58b0bf4e8ee | 101 | |
jtr89 | 0:c58b0bf4e8ee | 102 | // flash to signifty we are done |
jtr89 | 0:c58b0bf4e8ee | 103 | flashSequence(); |
jtr89 | 0:c58b0bf4e8ee | 104 | |
jtr89 | 0:c58b0bf4e8ee | 105 | // hang forever |
jtr89 | 0:c58b0bf4e8ee | 106 | while(1); |
jtr89 | 0:c58b0bf4e8ee | 107 | } |
jtr89 | 0:c58b0bf4e8ee | 108 | |
jtr89 | 0:c58b0bf4e8ee | 109 |