diff --git a/README.md b/README.md index b94e332..20f14f5 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,99 @@ -## Library Sim800L Module for Arduino UNO -The Purpose of This library is to use the module in the most easy way and transparent. -Website: [Sim800L library](https://github.com/VittorioEsposito/Sim800L-revised) +Sim800L Arduino Library revised +===== -Original version by: [Cristian Steib] (https://github.com/cristiansteib) +The SIM800L Arduino Library is a simple and easy-to-use library for the SIM800L module, allowing for quick and efficient communication with the module using the Arduino platform. -Go to arduino IDE Sketch >> Import Library >> add library... Select the folder Sim800L-revised +Features +--- -OR +* Simplifies the initialization and configuration of the SIM800L module +* Provides a set of easy-to-use functions for sending and receiving SMS messages +* Supports making and receiving phone calls +* Includes example sketches to demonstrate the library's capabilities -Place the Sim800L library folder your ArduinoSketchFolder/libraries/ folder. -You may need to create the libraries subfolder if its your first library. Restart the IDE. +Installation +--- -## connections & pinouts (DEFAULT) -Arduino Uno | Sim800L | Notes --------------|-------------|------------ -+5v| (3.8v)~(4.4v)!| Power supply input -10 RX_PIN | TX | -11 TX_PIN | RX | -2 RESET_PIN | RST| Reset Pin -GND | GND | +You can install the Sim800L Arduino Library in the Arduino IDE by going to Sketch > Include Library > Manage Libraries, searching for "Sim800L" and clicking on the "install" button. +Alternatively, you can download the library files from the GitHub repository and install it by going to Sketch > Include Library > Add .ZIP Library and selecting the downloaded files. -* If it returns true there is an error +Usage +--- -## Methods and functions +To use the library, simply include the library in your sketch and create an instance of the SIM800L class. The library provides a set of functions for sending and receiving SMS messages, making and receiving phone calls, and more. + +For example, to send an SMS message, you can use the following code: +``` +#include + +Sim800L Sim800L(10, 11); // RX_PIN and TX_PIN + +void setup(){ + Sim800L.begin(4800); + Sim800L.sendSms("+1234567890","Hello world!"); +} + +void loop(){ + //do nothing +} +``` + + + +Collaboration +--- + +This is an open-source project and I'm currently looking for more collaborators to help grow and improve it. If you're interested, feel free to submit your pull request to the GitHub repository. + + +Connecting the SIM800L to the Arduino +--- + +Before you can use the Sim800L Arduino Library, you need to physically connect the SIM800L module to your Arduino board. + +1. Connect the SIM800L's GND pin to the GND pin on the Arduino board +2. Connect the SIM800L's VCC pin to the 3.3V pin on the Arduino board +3. Connect the SIM800L's RX pin to the TX pin on the Arduino board (default is pin 11) +4. Connect the SIM800L's TX pin to the RX pin on the Arduino board (default is pin 10) +5. Connect the SIM800L's RST pin to the RESET pin on the Arduino board (default is pin 2) + +It is important to note that the SIM800L module requires a stable power supply of at least 2A, it is strongly recommended to use an external power supply to power the SIM800L module. +The SIM800L's VCC pin should be connected to the 3.3V pin on the Arduino board. Connecting it to the 5V pin may damage the module as it operates on 3.3V voltage level. It is important to ensure the voltage level is compatible with the module's specifications to avoid any damage. + + +Function List +--- + +Here is a list of functions that can be called on an instance of the SIM800L class: Name|Return|Notes :-------|:-------:|:-----------------------------------------------:| -begin()|None|Initialize the library -begin(number)|None|Initialize the library with user's baud rate +begin()|None|Initialize the module with a defalt baud rate +begin(number)|None|Initialize the module with a custom baud rate reset()|None|Reset the module, and wait to Sms Ready. -setSleepMode(bool)|bool|enable or disable sleep mode * -getSleepMode()|bool|return sleep mode status * -setFunctionalityMode(number)|bool|set functionality mode * -getFunctionalityMode()|bool|return functionality mode status * -setPIN(String)|bool|enable user to set a pin code * +setSleepMode(bool)|bool|enable or disable sleep mode. If it returns true, there is an error. +getSleepMode()|bool|return sleep mode status. If it returns true, there is an error. +setFunctionalityMode(number)|bool|set functionality mode. If it returns true, there is an error. +getFunctionalityMode()|bool|return functionality mode status. If it returns true, there is an error. +setPIN(String)|bool|enable user to set a pin code. If it returns true, there is an error. getProductInfo()|String|return product identification information getOperatorsList()|String|return the list of operators getOperator()|String|return the currently selected operator -calculateLocation()|bool|calculate gsm position * +calculateLocation()|bool|calculate gsm position. If it returns true, there is an error. getLocationCode()|String|return the location code getLongitude()|String|return longitude getLatitude()|String|return latitude -sendSms(number,text)|bool|both parameters must be Strings. * +sendSms(number,text)|bool|both parameters must be Strings. If it returns true, there is an error. readSms(index)|String|index is the position of the sms in the prefered memory storage getNumberSms(index)|String|returns the number of the sms. -delAllSms()|bool|Delete all sms * +delAllSms()|bool|Delete all sms. If it returns true, there is an error. signalQuality()|String|return info about signal quality -answerCall()|bool| * +answerCall()|bool| If it returns true, there is an error. callNumber(number)|None| -hangoffCall()|bool| * +hangoffCall()|bool| If it returns true, there is an error. getCallStatus()|uint8_t|Return the call status, 0=ready,2=Unknown(),3=Ringing,4=Call in progress setPhoneFunctionality()|None|Set at to full functionality activateBearerProfile()|None| @@ -60,3 +102,16 @@ RTCtime(int *day,int *month, int *year,int *hour,int *minute, int *second)|None| dateNet()|String|Return date time GSM updateRtc(utc)|bool|Return if the rtc was update with date time GSM. ____________________________________________________________________________________ + + + +License +--- + +The Sim800L Arduino Library revised by Vittorio Esposito is open-source software and is licensed under the GPL-3.0 license. + + +Credits +--- + +Original version of the library by: [Cristian Steib] (https://github.com/cristiansteib) diff --git a/Sim800L.cpp b/Sim800L.cpp index 7879730..3f7d46a 100644 --- a/Sim800L.cpp +++ b/Sim800L.cpp @@ -201,7 +201,6 @@ uint8_t Sim800L::getFunctionalityMode() return _functionalityMode; } - bool Sim800L::setPIN(String pin) { String command; @@ -480,6 +479,7 @@ bool Sim800L::sendSms(char* number,char* text) _buffer=_readSerial(); this->SoftwareSerial::print((char)26); _buffer=_readSerial(60000); + // Serial.println(_buffer); //expect CMGS:xxx , where xxx is a number,for the sending sms. if ((_buffer.indexOf("ER")) != -1) { return true; @@ -493,6 +493,44 @@ bool Sim800L::sendSms(char* number,char* text) } +bool Sim800L::prepareForSmsReceive() +{ + // Configure SMS in text mode + this->SoftwareSerial::print(F("AT+CMGF=1\r")); + _buffer=_readSerial(); + //Serial.print(_buffer); + if((_buffer.indexOf("OK")) == -1) + { + return false; + } + this->SoftwareSerial::print(F("AT+CNMI=2,1,0,0,0\r")); + _buffer=_readSerial(); + //Serial.print(_buffer); + if((_buffer.indexOf("OK")) == -1) + { + return false; + } + return true; +} + +const uint8_t Sim800L::checkForSMS() +{ + _buffer = _readSerial(100); + if(_buffer.length() == 0) + { + return 0; + } + _buffer += _readSerial(1000); + // Serial.println(_buffer); + // +CMTI: "SM",1 + if(_buffer.indexOf("CMTI") == -1) + { + return 0; + } + return _buffer.substring(_buffer.indexOf(',')+1).toInt(); +} + + String Sim800L::getNumberSms(uint8_t index) { _buffer=readSms(index); @@ -513,25 +551,27 @@ String Sim800L::getNumberSms(uint8_t index) String Sim800L::readSms(uint8_t index) { - // Can take up to 5 seconds - this->SoftwareSerial::print (F("AT+CMGF=1\r")); + if(( _readSerial(5000).indexOf("ER")) != -1) + { + return ""; + } - if (( _readSerial(5000).indexOf("ER")) ==-1) + this->SoftwareSerial::print (F("AT+CMGR=")); + this->SoftwareSerial::print (index); + this->SoftwareSerial::print ("\r"); + _buffer=_readSerial(); + //Serial.println(_buffer); + if (_buffer.indexOf("CMGR") == -1) { - this->SoftwareSerial::print (F("AT+CMGR=")); - this->SoftwareSerial::print (index); - this->SoftwareSerial::print ("\r"); - _buffer=_readSerial(); - if (_buffer.indexOf("CMGR:")!=-1) - { - return _buffer; - } - else return ""; + return ""; } - else - return ""; + + _buffer = _readSerial(10000); + byte first = _buffer.indexOf('\n', 2) + 1; + byte second = _buffer.indexOf('\n', first); + return _buffer.substring(first, second); } diff --git a/Sim800L.h b/Sim800L.h index 214fda0..56a02e1 100644 --- a/Sim800L.h +++ b/Sim800L.h @@ -74,7 +74,6 @@ #define DEFAULT_BAUD_RATE 9600 #define TIME_OUT_READ_SERIAL 5000 - class Sim800L : public SoftwareSerial { private: @@ -91,7 +90,6 @@ class Sim800L : public SoftwareSerial String _readSerial(); String _readSerial(uint32_t timeout); - public: uint8_t RX_PIN; @@ -130,6 +128,8 @@ class Sim800L : public SoftwareSerial bool hangoffCall(); uint8_t getCallStatus(); + const uint8_t checkForSMS(); + bool prepareForSmsReceive(); bool sendSms(char* number,char* text); String readSms(uint8_t index); String getNumberSms(uint8_t index); @@ -140,6 +140,7 @@ class Sim800L : public SoftwareSerial void setPhoneFunctionality(); void activateBearerProfile(); void deactivateBearerProfile(); + bool setMode(); void RTCtime(int *day,int *month, int *year,int *hour,int *minute, int *second); String dateNet(); diff --git a/examples/readSms/readSms.ino b/examples/readSms/readSms.ino index d02efda..fbffd9e 100644 --- a/examples/readSms/readSms.ino +++ b/examples/readSms/readSms.ino @@ -71,20 +71,28 @@ Sim800L GSM(RX, TX); * Sim800L GSM(RX, TX, RESET); * Sim800L GSM(RX, TX, RESET, LED); */ - -String text; // to save the text of the sms -uint8_t index; // to indicate the message to read. - + +/* + * NOTICE: + * FOR THIS TO WORK YOU HAVE TO INCREASE RX BUFFER SIZE + * Open SoftwareSerial.h and change _SS_MAX_RX_BUFF to 256 + * + */ void setup() { - Serial.begin(9600); - GSM.begin(4800); - index = 1; - text = GSM.readSms(index); - Serial.println(text); - + Serial.begin(9600); + GSM.begin(4800); + GSM.delAllSms(); // this is optional + while(!GSM.prepareForSmsReceive()) + { + delay(1000); + } } void loop() { - //do nothing -} + byte index = GSM.checkForSMS(); + if(index != 0) + { + Serial.println(GSM.readSms(index)); + } +} diff --git a/library.properties b/library.properties index 6c9a17c..d4fcc68 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=Sim800L Library Revised -version=1.1.6 +version=1.1.9 author=Vittorio Esposito maintainer=Vittorio Esposito sentence=Arduino library for Sim800L paragraph=Arduino library for Sim800L category=Communication -url=https://github.com/VittorioEsposito/Sim800L-Arduino-Library-revised +url=https://github.com/vittorioexp/Sim800L-Arduino-Library-revised architectures=*