WiFi SMS Gateway
After a long search on the internet, trying to find a cheap SMS Gateway, I got the idea to create one myself.
As I already had a GM862 module laying around, and I’ve got the WiShield WiFi module for the Arduino too, I thought it would be easy – but it wasn’t!
The hardware setup is pretty easy, except the powering for the GM862, as it requires about 3.8V. That was made with a Linear LT1528 3A low dropout voltage regulator.
After alot of testing and measuring, I finally made a working circuit, and afterwards an Eagle Schematic.
Ã?Â
In the following picture you will see the hardware setup, which consists of the Arduino with the WiShield on the top, the GM862 on two breadboards, and alot of wires!
Ã?Â
But the real problems appeared when I started programming! I had alot of troubles with the serial connection between the Arduino and the GM862 module, which apparently wasn’t caused by the hardware setup!
Ã?Â
After alot of debugging I figured it out, and a simple SMS sending code was working 🙂
Then after a couple of hours I’ve added the WiFi parsing code which sends an SMS to the requested number, with the requested message, read from the GET parameters!
You can grab the code here, and try it out:
/* * WiFi SMS Gateway sketch by Thomas Jespersen - http://elec.tkjweb.dk/blog * --- Remeber to change the PIN, if any, in the setup() routine! --- */ #include <WiServer.h> #define WIRELESS_MODE_INFRA 1 #define WIRELESS_MODE_ADHOC 2 // Wireless configuration parameters ---------------------------------------- unsigned char local_ip[] = {192,168,1,111}; // IP address of WiShield unsigned char gateway_ip[] = {192,168,2,254}; // router or gateway IP address unsigned char subnet_mask[] = {255,255,255,0}; // subnet mask for the local network const prog_char ssid[] PROGMEM = {"SSID"}; // max 32 bytes unsigned char security_type = 0; // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2 // WPA/WPA2 passphrase const prog_char security_passphrase[] PROGMEM = {"Passphrase"}; // max 64 characters // WEP 128-bit keys // sample HEX keys prog_uchar wep_keys[] PROGMEM = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, // Key 0 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 2 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Key 3 }; // setup the wireless mode // infrastructure - connect to AP // adhoc - connect to another WiFi device unsigned char wireless_mode = WIRELESS_MODE_INFRA; unsigned char ssid_len; unsigned char security_passphrase_len; // End of wireless configuration parameters ---------------------------------------- //unsigned byte TimeBeforeConnection; unsigned int lastSMStime = 0; char number[7]; char* message; void sendSMS() { if (millis()/1000 > lastSMStime) { Serial.print("AT+CMGF=1\r\n"); delay(500); Serial.print("AT+CMGS="); delay(250); for (int i=0; i < 8; i++) { Serial.print(number[i]); } //Serial.print(number); // Replace with a valid phone number Serial.print("\r\n"); delay(2500); Serial.print(message); delay(500); // End the SMS with a control-z Serial.print(0x1A,BYTE); lastSMStime = (millis()/1000) + 2; } } // This is our page serving function that generates web pages boolean sendMyPage(char* URL) { // Check if the requested URL matches "/" if (strcmp(URL, "/") == 0) { // Use WiServer's print and println functions to write out the page content WiServer.print("<html>"); WiServer.print("<head><title>TKJ's SMS Gateway</title>"); WiServer.print("<h1>This is TKJ's SMS Gateway</h1><br>"); WiServer.print("</html>"); // URL was recognized return true; } // Check if the requested URL starts with "/?" if (URL[0] == '/' && URL[1] == '?') { for (int i=0; i<8; i++) { number[i] = '0'; } message = ""; for (int i=0; i < 8; i++) { number[i] = URL[i+2]; } for (int i=0; i < strlen(URL); i++) { message[i] = URL[i+10]; } // Use WiServer's print and println functions to write out the page content WiServer.print("<html>"); WiServer.print("<head><title>TKJ's SMS Gateway</title>"); WiServer.print("<h1>The SMS is now sent!</h1><br><p>"); //WiServer.print(message); WiServer.print("</p>"); WiServer.print("</html>"); sendSMS(); // URL was recognized return true; } // URL not found return false; } void setup() { // Turn GSM Module ON pinMode(3, OUTPUT); digitalWrite(3, HIGH); delay(500); digitalWrite(3, LOW); delay(500); digitalWrite(3, HIGH); delay(1000); // Type Mobile SIM Pin Code Serial.begin(9600); // Remember to change the PIN, if any Serial.print("AT+CPIN=0000\r\n"); // Initialize WiServer and have it use the sendMyPage function to serve pages WiServer.init(sendMyPage); // Enable Serial output and ask WiServer to generate log messages (optional) WiServer.enableVerboseMode(false); } void loop(){ // Run WiServer WiServer.server_task(); delay(10); }
Hi, i’m interested on this project of yours (wifi sms gateway). I’m developing similar device but without the wifi shield. I;m trying to power arduino & Gm862 telit module like yours with just one power source. I see from your schematic, there are 7 resistors. But from the photo, you have more than that. Can you have the list of components used ? or updated schematic ?
Thank you
@Amri
Dear Amri.
Haha, great spotted 🙂
Though the reason why I have more resistors on the board is because I didn’t have the exact values as needed (shown in the schematic). So instead I’ve connected 2 or 3 resistors in series to make the value needed.
The schematic is confirmed to be working, so no need to change or update that.
Thomas
Hi Thomas, what if i want to power the arduino with battery ? let say 7.4v poly battery. Do i need two voltage regulator ? one from the battery to arduino and the second from arduino to gm862 modul ?
Thank
@Amri
Dear Amri.
No, it is not neccesary to use a second voltage regulator. You should just connect the 7.4V battery to the VIN pin of the Arduino.
Then the Arduino will take care of regulating this to 5V, which it requires. Then you should also connect the VIN (7.4V) to the Vin of the voltage regulator for the GM862 module.
Best Regards
Thomas Jespersen
Hi Thomas, thanks for your guidance. Really appreciate your help 🙂
Hi Thomas,
I’m new to electronic. Can you explain why do you put R3, R4, Ground for TX connection ? and what should i use for RX connection (if I want to have this connected) ?
Basically, i want to know why can’t i just connect these two straight away ?
Thank you so much 🙂
@Amri
Dear Amri.
I use these two resistors to form a voltage divider to make a proper voltage for the GSM module.
The voltage coming out of the Arduino is 5V, though the GSM module only supports around 3V. By using this voltage divider I make the 5V signal into a 3V signal!
If you want to use the RX (output from GSM module) you should be able to connect it directly, as the Arduino supports 3V as input treshold.
Best Regards
Thomas Jespersen
Ahhh I c, if i’m planning to use Arduino Fio (which uses 3.3 v input from a battery). I won’t need thoses transistor for RX and TX right ? note: I’m planning to power both arduino fio and the gm862 from a poly battery 3.7v
@Amri
Powering the GM862 directly from the battery would be OK, as the power supply should be between 3.40V and 4.20V.
The Fio will regulate the 3.7V power supply input to 3.3V so yes, you would actually be able to connect it directly to the GM862 module, without having to use any voltage dividers.
Thanks, Thanks!! nice men!