Add Library
This commit is contained in:
parent
e365b9dbd9
commit
3c47103b39
318 changed files with 56465 additions and 0 deletions
2092
libraries/Adafruit_FONA_Library/Adafruit_FONA.cpp
Normal file
2092
libraries/Adafruit_FONA_Library/Adafruit_FONA.cpp
Normal file
File diff suppressed because it is too large
Load diff
266
libraries/Adafruit_FONA_Library/Adafruit_FONA.h
Normal file
266
libraries/Adafruit_FONA_Library/Adafruit_FONA.h
Normal file
|
@ -0,0 +1,266 @@
|
|||
/***************************************************
|
||||
This is a library for our Adafruit FONA Cellular Module
|
||||
|
||||
Designed specifically to work with the Adafruit FONA
|
||||
----> http://www.adafruit.com/products/1946
|
||||
----> http://www.adafruit.com/products/1963
|
||||
|
||||
These displays use TTL Serial to communicate, 2 pins are required to
|
||||
interface
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
#ifndef ADAFRUIT_FONA_H
|
||||
#define ADAFRUIT_FONA_H
|
||||
|
||||
#include "includes/FONAConfig.h"
|
||||
#include "includes/FONAExtIncludes.h"
|
||||
#include "includes/platform/FONAPlatform.h"
|
||||
|
||||
|
||||
|
||||
#define FONA800L 1
|
||||
#define FONA800H 6
|
||||
|
||||
#define FONA808_V1 2
|
||||
#define FONA808_V2 3
|
||||
|
||||
#define FONA3G_A 4
|
||||
#define FONA3G_E 5
|
||||
|
||||
// Set the preferred SMS storage.
|
||||
// Use "SM" for storage on the SIM.
|
||||
// Use "ME" for internal storage on the FONA chip
|
||||
#define FONA_PREF_SMS_STORAGE "\"SM\""
|
||||
//#define FONA_PREF_SMS_STORAGE "\"ME\""
|
||||
|
||||
#define FONA_HEADSETAUDIO 0
|
||||
#define FONA_EXTAUDIO 1
|
||||
|
||||
#define FONA_STTONE_DIALTONE 1
|
||||
#define FONA_STTONE_BUSY 2
|
||||
#define FONA_STTONE_CONGESTION 3
|
||||
#define FONA_STTONE_PATHACK 4
|
||||
#define FONA_STTONE_DROPPED 5
|
||||
#define FONA_STTONE_ERROR 6
|
||||
#define FONA_STTONE_CALLWAIT 7
|
||||
#define FONA_STTONE_RINGING 8
|
||||
#define FONA_STTONE_BEEP 16
|
||||
#define FONA_STTONE_POSTONE 17
|
||||
#define FONA_STTONE_ERRTONE 18
|
||||
#define FONA_STTONE_INDIANDIALTONE 19
|
||||
#define FONA_STTONE_USADIALTONE 20
|
||||
|
||||
#define FONA_DEFAULT_TIMEOUT_MS 500
|
||||
|
||||
#define FONA_HTTP_GET 0
|
||||
#define FONA_HTTP_POST 1
|
||||
#define FONA_HTTP_HEAD 2
|
||||
|
||||
#define FONA_CALL_READY 0
|
||||
#define FONA_CALL_FAILED 1
|
||||
#define FONA_CALL_UNKNOWN 2
|
||||
#define FONA_CALL_RINGING 3
|
||||
#define FONA_CALL_INPROGRESS 4
|
||||
|
||||
class Adafruit_FONA : public FONAStreamType {
|
||||
public:
|
||||
Adafruit_FONA(int8_t r);
|
||||
boolean begin(FONAStreamType &port);
|
||||
uint8_t type();
|
||||
|
||||
// Stream
|
||||
int available(void);
|
||||
size_t write(uint8_t x);
|
||||
int read(void);
|
||||
int peek(void);
|
||||
void flush();
|
||||
|
||||
// FONA 3G requirements
|
||||
boolean setBaudrate(uint16_t baud);
|
||||
|
||||
// RTC
|
||||
boolean enableRTC(uint8_t i);
|
||||
boolean readRTC(uint8_t *year, uint8_t *month, uint8_t *date, uint8_t *hr, uint8_t *min, uint8_t *sec);
|
||||
|
||||
// Battery and ADC
|
||||
boolean getADCVoltage(uint16_t *v);
|
||||
boolean getBattPercent(uint16_t *p);
|
||||
boolean getBattVoltage(uint16_t *v);
|
||||
|
||||
// SIM query
|
||||
uint8_t unlockSIM(char *pin);
|
||||
uint8_t getSIMCCID(char *ccid);
|
||||
uint8_t getNetworkStatus(void);
|
||||
uint8_t getRSSI(void);
|
||||
|
||||
// IMEI
|
||||
uint8_t getIMEI(char *imei);
|
||||
|
||||
// set Audio output
|
||||
boolean setAudio(uint8_t a);
|
||||
boolean setVolume(uint8_t i);
|
||||
uint8_t getVolume(void);
|
||||
boolean playToolkitTone(uint8_t t, uint16_t len);
|
||||
boolean setMicVolume(uint8_t a, uint8_t level);
|
||||
boolean playDTMF(char tone);
|
||||
|
||||
// FM radio functions.
|
||||
boolean tuneFMradio(uint16_t station);
|
||||
boolean FMradio(boolean onoff, uint8_t a = FONA_HEADSETAUDIO);
|
||||
boolean setFMVolume(uint8_t i);
|
||||
int8_t getFMVolume();
|
||||
int8_t getFMSignalLevel(uint16_t station);
|
||||
|
||||
// SMS handling
|
||||
boolean setSMSInterrupt(uint8_t i);
|
||||
uint8_t getSMSInterrupt(void);
|
||||
int8_t getNumSMS(void);
|
||||
boolean readSMS(uint8_t i, char *smsbuff, uint16_t max, uint16_t *readsize);
|
||||
boolean sendSMS(char *smsaddr, char *smsmsg);
|
||||
boolean deleteSMS(uint8_t i);
|
||||
boolean getSMSSender(uint8_t i, char *sender, int senderlen);
|
||||
boolean sendUSSD(char *ussdmsg, char *ussdbuff, uint16_t maxlen, uint16_t *readlen);
|
||||
|
||||
// Time
|
||||
boolean enableNetworkTimeSync(boolean onoff);
|
||||
boolean enableNTPTimeSync(boolean onoff, FONAFlashStringPtr ntpserver=0);
|
||||
boolean getTime(char *buff, uint16_t maxlen);
|
||||
|
||||
// GPRS handling
|
||||
boolean enableGPRS(boolean onoff);
|
||||
uint8_t GPRSstate(void);
|
||||
boolean getGSMLoc(uint16_t *replycode, char *buff, uint16_t maxlen);
|
||||
boolean getGSMLoc(float *lat, float *lon);
|
||||
void setGPRSNetworkSettings(FONAFlashStringPtr apn, FONAFlashStringPtr username=0, FONAFlashStringPtr password=0);
|
||||
|
||||
// GPS handling
|
||||
boolean enableGPS(boolean onoff);
|
||||
int8_t GPSstatus(void);
|
||||
uint8_t getGPS(uint8_t arg, char *buffer, uint8_t maxbuff);
|
||||
boolean getGPS(float *lat, float *lon, float *speed_kph=0, float *heading=0, float *altitude=0);
|
||||
boolean enableGPSNMEA(uint8_t nmea);
|
||||
|
||||
// TCP raw connections
|
||||
boolean TCPconnect(char *server, uint16_t port);
|
||||
boolean TCPclose(void);
|
||||
boolean TCPconnected(void);
|
||||
boolean TCPsend(char *packet, uint8_t len);
|
||||
uint16_t TCPavailable(void);
|
||||
uint16_t TCPread(uint8_t *buff, uint8_t len);
|
||||
|
||||
// HTTP low level interface (maps directly to SIM800 commands).
|
||||
boolean HTTP_init();
|
||||
boolean HTTP_term();
|
||||
void HTTP_para_start(FONAFlashStringPtr parameter, boolean quoted = true);
|
||||
boolean HTTP_para_end(boolean quoted = true);
|
||||
boolean HTTP_para(FONAFlashStringPtr parameter, const char *value);
|
||||
boolean HTTP_para(FONAFlashStringPtr parameter, FONAFlashStringPtr value);
|
||||
boolean HTTP_para(FONAFlashStringPtr parameter, int32_t value);
|
||||
boolean HTTP_data(uint32_t size, uint32_t maxTime=10000);
|
||||
boolean HTTP_action(uint8_t method, uint16_t *status, uint16_t *datalen, int32_t timeout = 10000);
|
||||
boolean HTTP_readall(uint16_t *datalen);
|
||||
boolean HTTP_ssl(boolean onoff);
|
||||
|
||||
// HTTP high level interface (easier to use, less flexible).
|
||||
boolean HTTP_GET_start(char *url, uint16_t *status, uint16_t *datalen);
|
||||
void HTTP_GET_end(void);
|
||||
boolean HTTP_POST_start(char *url, FONAFlashStringPtr contenttype, const uint8_t *postdata, uint16_t postdatalen, uint16_t *status, uint16_t *datalen);
|
||||
void HTTP_POST_end(void);
|
||||
void setUserAgent(FONAFlashStringPtr useragent);
|
||||
|
||||
// HTTPS
|
||||
void setHTTPSRedirect(boolean onoff);
|
||||
|
||||
// PWM (buzzer)
|
||||
boolean setPWM(uint16_t period, uint8_t duty = 50);
|
||||
|
||||
// Phone calls
|
||||
boolean callPhone(char *phonenum);
|
||||
uint8_t getCallStatus(void);
|
||||
boolean hangUp(void);
|
||||
boolean pickUp(void);
|
||||
boolean callerIdNotification(boolean enable, uint8_t interrupt = 0);
|
||||
boolean incomingCallNumber(char* phonenum);
|
||||
|
||||
// Helper functions to verify responses.
|
||||
boolean expectReply(FONAFlashStringPtr reply, uint16_t timeout = 10000);
|
||||
boolean sendCheckReply(char *send, char *reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
boolean sendCheckReply(FONAFlashStringPtr send, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
boolean sendCheckReply(char* send, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
|
||||
|
||||
protected:
|
||||
int8_t _rstpin;
|
||||
uint8_t _type;
|
||||
|
||||
char replybuffer[255];
|
||||
FONAFlashStringPtr apn;
|
||||
FONAFlashStringPtr apnusername;
|
||||
FONAFlashStringPtr apnpassword;
|
||||
boolean httpsredirect;
|
||||
FONAFlashStringPtr useragent;
|
||||
FONAFlashStringPtr ok_reply;
|
||||
|
||||
// HTTP helpers
|
||||
boolean HTTP_setup(char *url);
|
||||
|
||||
void flushInput();
|
||||
uint16_t readRaw(uint16_t b);
|
||||
uint8_t readline(uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS, boolean multiline = false);
|
||||
uint8_t getReply(char *send, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
uint8_t getReply(FONAFlashStringPtr send, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
uint8_t getReply(FONAFlashStringPtr prefix, char *suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
uint8_t getReply(FONAFlashStringPtr prefix, int32_t suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
uint8_t getReply(FONAFlashStringPtr prefix, int32_t suffix1, int32_t suffix2, uint16_t timeout); // Don't set default value or else function call is ambiguous.
|
||||
uint8_t getReplyQuoted(FONAFlashStringPtr prefix, FONAFlashStringPtr suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
|
||||
boolean sendCheckReply(FONAFlashStringPtr prefix, char *suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
boolean sendCheckReply(FONAFlashStringPtr prefix, int32_t suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
boolean sendCheckReply(FONAFlashStringPtr prefix, int32_t suffix, int32_t suffix2, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
boolean sendCheckReplyQuoted(FONAFlashStringPtr prefix, FONAFlashStringPtr suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
|
||||
|
||||
|
||||
boolean parseReply(FONAFlashStringPtr toreply,
|
||||
uint16_t *v, char divider = ',', uint8_t index=0);
|
||||
boolean parseReply(FONAFlashStringPtr toreply,
|
||||
char *v, char divider = ',', uint8_t index=0);
|
||||
boolean parseReplyQuoted(FONAFlashStringPtr toreply,
|
||||
char *v, int maxlen, char divider, uint8_t index);
|
||||
|
||||
boolean sendParseReply(FONAFlashStringPtr tosend,
|
||||
FONAFlashStringPtr toreply,
|
||||
uint16_t *v, char divider = ',', uint8_t index=0);
|
||||
|
||||
static boolean _incomingCall;
|
||||
static void onIncomingCall();
|
||||
|
||||
FONAStreamType *mySerial;
|
||||
};
|
||||
|
||||
class Adafruit_FONA_3G : public Adafruit_FONA {
|
||||
|
||||
public:
|
||||
Adafruit_FONA_3G (int8_t r) : Adafruit_FONA(r) { _type = FONA3G_A; }
|
||||
|
||||
boolean getBattVoltage(uint16_t *v);
|
||||
boolean playToolkitTone(uint8_t t, uint16_t len);
|
||||
boolean hangUp(void);
|
||||
boolean pickUp(void);
|
||||
boolean enableGPRS(boolean onoff);
|
||||
boolean enableGPS(boolean onoff);
|
||||
|
||||
protected:
|
||||
boolean parseReply(FONAFlashStringPtr toreply,
|
||||
float *f, char divider, uint8_t index);
|
||||
|
||||
boolean sendParseReply(FONAFlashStringPtr tosend,
|
||||
FONAFlashStringPtr toreply,
|
||||
float *f, char divider = ',', uint8_t index=0);
|
||||
};
|
||||
|
||||
#endif
|
29
libraries/Adafruit_FONA_Library/README.md
Normal file
29
libraries/Adafruit_FONA_Library/README.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
# Adafruit FONA Library [](https://travis-ci.org/adafruit/Adafruit_FONA_Library)
|
||||
|
||||
**This library requires Arduino v1.0.6 or higher**
|
||||
|
||||
This is a library for the Adafruit FONA Cellular GSM Breakouts etc
|
||||
|
||||
Designed specifically to work with the Adafruit FONA Breakout
|
||||
* https://www.adafruit.com/products/1946
|
||||
* https://www.adafruit.com/products/1963
|
||||
* http://www.adafruit.com/products/2468
|
||||
* http://www.adafruit.com/products/2542
|
||||
|
||||
These modules use TTL Serial to communicate, 2 pins are required to interface
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
With updates from Samy Kamkar
|
||||
|
||||
To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_FONA
|
||||
Check that the Adafruit_FONA folder contains Adafruit_FONA.cpp and Adafruit_FONA.h
|
||||
|
||||
Place the Adafruit_FONA library folder your *arduinosketchfolder*/libraries/ folder.
|
||||
You may need to create the libraries subfolder if its your first library. Restart the IDE.
|
|
@ -0,0 +1,77 @@
|
|||
/***************************************************
|
||||
This is an example for our Adafruit FONA Cellular Module
|
||||
since the FONA 3G does not do auto-baud very well, this demo
|
||||
fixes the baud rate to 4800 from the default 115200
|
||||
|
||||
Designed specifically to work with the Adafruit FONA 3G
|
||||
----> http://www.adafruit.com/products/2691
|
||||
----> http://www.adafruit.com/products/2687
|
||||
|
||||
These cellular modules use TTL Serial to communicate, 2 pins are
|
||||
required to interface
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
#include "Adafruit_FONA.h"
|
||||
|
||||
#define FONA_RX 2
|
||||
#define FONA_TX 3
|
||||
#define FONA_RST 4
|
||||
|
||||
// this is a large buffer for replies
|
||||
char replybuffer[255];
|
||||
|
||||
// We default to using software serial. If you want to use hardware serial
|
||||
// (because softserial isnt supported) comment out the following three lines
|
||||
// and uncomment the HardwareSerial line
|
||||
#include <SoftwareSerial.h>
|
||||
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
|
||||
SoftwareSerial *fonaSerial = &fonaSS;
|
||||
|
||||
// Hardware serial is also possible!
|
||||
// HardwareSerial *fonaSerial = &Serial1;
|
||||
|
||||
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
|
||||
|
||||
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
|
||||
|
||||
void setup() {
|
||||
while (!Serial);
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("FONA set baudrate"));
|
||||
|
||||
Serial.println(F("First trying 115200 baud"));
|
||||
// start at 115200 baud
|
||||
fonaSerial->begin(115200);
|
||||
fona.begin(*fonaSerial);
|
||||
|
||||
// send the command to reset the baud rate to 4800
|
||||
fona.setBaudrate(4800);
|
||||
|
||||
// restart with 4800 baud
|
||||
fonaSerial->begin(4800);
|
||||
Serial.println(F("Initializing @ 4800 baud..."));
|
||||
|
||||
if (! fona.begin(*fonaSerial)) {
|
||||
Serial.println(F("Couldn't find FONA"));
|
||||
while(1);
|
||||
}
|
||||
Serial.println(F("FONA is OK"));
|
||||
|
||||
// Print module IMEI number.
|
||||
char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
|
||||
uint8_t imeiLen = fona.getIMEI(imei);
|
||||
if (imeiLen > 0) {
|
||||
Serial.print("Module IMEI: "); Serial.println(imei);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void loop() {
|
||||
}
|
|
@ -0,0 +1,143 @@
|
|||
/***************************************************
|
||||
This is an example for our Adafruit FONA Cellular Module
|
||||
|
||||
Designed specifically to work with the Adafruit FONA
|
||||
----> http://www.adafruit.com/products/1946
|
||||
----> http://www.adafruit.com/products/1963
|
||||
----> http://www.adafruit.com/products/2468
|
||||
----> http://www.adafruit.com/products/2542
|
||||
|
||||
These cellular modules use TTL Serial to communicate, 2 pins are
|
||||
required to interface
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/*
|
||||
THIS CODE IS STILL IN PROGRESS!
|
||||
|
||||
Open up the serial console on the Arduino at 115200 baud to interact with FONA
|
||||
|
||||
|
||||
This code will receive an SMS, identify the sender's phone number, and automatically send a response
|
||||
|
||||
*/
|
||||
|
||||
#include "Adafruit_FONA.h"
|
||||
|
||||
#define FONA_RX 2
|
||||
#define FONA_TX 3
|
||||
#define FONA_RST 4
|
||||
|
||||
// this is a large buffer for replies
|
||||
char replybuffer[255];
|
||||
|
||||
// We default to using software serial. If you want to use hardware serial
|
||||
// (because softserial isnt supported) comment out the following three lines
|
||||
// and uncomment the HardwareSerial line
|
||||
#include <SoftwareSerial.h>
|
||||
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
|
||||
SoftwareSerial *fonaSerial = &fonaSS;
|
||||
|
||||
// Hardware serial is also possible!
|
||||
// HardwareSerial *fonaSerial = &Serial1;
|
||||
|
||||
// Use this for FONA 800 and 808s
|
||||
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
|
||||
// Use this one for FONA 3G
|
||||
//Adafruit_FONA_3G fona = Adafruit_FONA_3G(FONA_RST);
|
||||
|
||||
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
|
||||
|
||||
void setup() {
|
||||
while (!Serial);
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("FONA SMS caller ID test"));
|
||||
Serial.println(F("Initializing....(May take 3 seconds)"));
|
||||
|
||||
// make it slow so its easy to read!
|
||||
fonaSerial->begin(4800);
|
||||
if (! fona.begin(*fonaSerial)) {
|
||||
Serial.println(F("Couldn't find FONA"));
|
||||
while(1);
|
||||
}
|
||||
Serial.println(F("FONA is OK"));
|
||||
|
||||
// Print SIM card IMEI number.
|
||||
char imei[16] = {0}; // MUST use a 16 character buffer for IMEI!
|
||||
uint8_t imeiLen = fona.getIMEI(imei);
|
||||
if (imeiLen > 0) {
|
||||
Serial.print("SIM card IMEI: "); Serial.println(imei);
|
||||
}
|
||||
|
||||
fonaSerial->print("AT+CNMI=2,1\r\n"); //set up the FONA to send a +CMTI notification when an SMS is received
|
||||
|
||||
Serial.println("FONA Ready");
|
||||
}
|
||||
|
||||
|
||||
char fonaNotificationBuffer[64]; //for notifications from the FONA
|
||||
char smsBuffer[250];
|
||||
|
||||
void loop() {
|
||||
|
||||
char* bufPtr = fonaNotificationBuffer; //handy buffer pointer
|
||||
|
||||
if (fona.available()) //any data available from the FONA?
|
||||
{
|
||||
int slot = 0; //this will be the slot number of the SMS
|
||||
int charCount = 0;
|
||||
//Read the notification into fonaInBuffer
|
||||
do {
|
||||
*bufPtr = fona.read();
|
||||
Serial.write(*bufPtr);
|
||||
delay(1);
|
||||
} while ((*bufPtr++ != '\n') && (fona.available()) && (++charCount < (sizeof(fonaNotificationBuffer)-1)));
|
||||
|
||||
//Add a terminal NULL to the notification string
|
||||
*bufPtr = 0;
|
||||
|
||||
//Scan the notification string for an SMS received notification.
|
||||
// If it's an SMS message, we'll get the slot number in 'slot'
|
||||
if (1 == sscanf(fonaNotificationBuffer, "+CMTI: " FONA_PREF_SMS_STORAGE ",%d", &slot)) {
|
||||
Serial.print("slot: "); Serial.println(slot);
|
||||
|
||||
char callerIDbuffer[32]; //we'll store the SMS sender number in here
|
||||
|
||||
// Retrieve SMS sender address/phone number.
|
||||
if (! fona.getSMSSender(slot, callerIDbuffer, 31)) {
|
||||
Serial.println("Didn't find SMS message in slot!");
|
||||
}
|
||||
Serial.print(F("FROM: ")); Serial.println(callerIDbuffer);
|
||||
|
||||
// Retrieve SMS value.
|
||||
uint16_t smslen;
|
||||
if (fona.readSMS(slot, smsBuffer, 250, &smslen)) { // pass in buffer and max len!
|
||||
Serial.println(smsBuffer);
|
||||
}
|
||||
|
||||
//Send back an automatic response
|
||||
Serial.println("Sending reponse...");
|
||||
if (!fona.sendSMS(callerIDbuffer, "Hey, I got your text!")) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Sent!"));
|
||||
}
|
||||
|
||||
// delete the original msg after it is processed
|
||||
// otherwise, we will fill up all the slots
|
||||
// and then we won't be able to receive SMS anymore
|
||||
if (fona.deleteSMS(slot)) {
|
||||
Serial.println(F("OK!"));
|
||||
} else {
|
||||
Serial.print(F("Couldn't delete SMS in slot ")); Serial.println(slot);
|
||||
fona.print(F("AT+CMGD=?\r\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
886
libraries/Adafruit_FONA_Library/examples/FONAtest/FONAtest.ino
Normal file
886
libraries/Adafruit_FONA_Library/examples/FONAtest/FONAtest.ino
Normal file
|
@ -0,0 +1,886 @@
|
|||
/***************************************************
|
||||
This is an example for our Adafruit FONA Cellular Module
|
||||
|
||||
Designed specifically to work with the Adafruit FONA
|
||||
----> http://www.adafruit.com/products/1946
|
||||
----> http://www.adafruit.com/products/1963
|
||||
----> http://www.adafruit.com/products/2468
|
||||
----> http://www.adafruit.com/products/2542
|
||||
|
||||
These cellular modules use TTL Serial to communicate, 2 pins are
|
||||
required to interface
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/*
|
||||
THIS CODE IS STILL IN PROGRESS!
|
||||
|
||||
Open up the serial console on the Arduino at 115200 baud to interact with FONA
|
||||
|
||||
Note that if you need to set a GPRS APN, username, and password scroll down to
|
||||
the commented section below at the end of the setup() function.
|
||||
*/
|
||||
#include "Adafruit_FONA.h"
|
||||
|
||||
#define FONA_RX 2
|
||||
#define FONA_TX 3
|
||||
#define FONA_RST 4
|
||||
|
||||
// this is a large buffer for replies
|
||||
char replybuffer[255];
|
||||
|
||||
// We default to using software serial. If you want to use hardware serial
|
||||
// (because softserial isnt supported) comment out the following three lines
|
||||
// and uncomment the HardwareSerial line
|
||||
#include <SoftwareSerial.h>
|
||||
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
|
||||
SoftwareSerial *fonaSerial = &fonaSS;
|
||||
|
||||
// Hardware serial is also possible!
|
||||
// HardwareSerial *fonaSerial = &Serial1;
|
||||
|
||||
// Use this for FONA 800 and 808s
|
||||
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
|
||||
// Use this one for FONA 3G
|
||||
//Adafruit_FONA_3G fona = Adafruit_FONA_3G(FONA_RST);
|
||||
|
||||
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
|
||||
|
||||
uint8_t type;
|
||||
|
||||
void setup() {
|
||||
while (!Serial);
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("FONA basic test"));
|
||||
Serial.println(F("Initializing....(May take 3 seconds)"));
|
||||
|
||||
fonaSerial->begin(4800);
|
||||
if (! fona.begin(*fonaSerial)) {
|
||||
Serial.println(F("Couldn't find FONA"));
|
||||
while (1);
|
||||
}
|
||||
type = fona.type();
|
||||
Serial.println(F("FONA is OK"));
|
||||
Serial.print(F("Found "));
|
||||
switch (type) {
|
||||
case FONA800L:
|
||||
Serial.println(F("FONA 800L")); break;
|
||||
case FONA800H:
|
||||
Serial.println(F("FONA 800H")); break;
|
||||
case FONA808_V1:
|
||||
Serial.println(F("FONA 808 (v1)")); break;
|
||||
case FONA808_V2:
|
||||
Serial.println(F("FONA 808 (v2)")); break;
|
||||
case FONA3G_A:
|
||||
Serial.println(F("FONA 3G (American)")); break;
|
||||
case FONA3G_E:
|
||||
Serial.println(F("FONA 3G (European)")); break;
|
||||
default:
|
||||
Serial.println(F("???")); break;
|
||||
}
|
||||
|
||||
// Print module IMEI number.
|
||||
char imei[16] = {0}; // MUST use a 16 character buffer for IMEI!
|
||||
uint8_t imeiLen = fona.getIMEI(imei);
|
||||
if (imeiLen > 0) {
|
||||
Serial.print("Module IMEI: "); Serial.println(imei);
|
||||
}
|
||||
|
||||
// Optionally configure a GPRS APN, username, and password.
|
||||
// You might need to do this to access your network's GPRS/data
|
||||
// network. Contact your provider for the exact APN, username,
|
||||
// and password values. Username and password are optional and
|
||||
// can be removed, but APN is required.
|
||||
//fona.setGPRSNetworkSettings(F("your APN"), F("your username"), F("your password"));
|
||||
|
||||
// Optionally configure HTTP gets to follow redirects over SSL.
|
||||
// Default is not to follow SSL redirects, however if you uncomment
|
||||
// the following line then redirects over SSL will be followed.
|
||||
//fona.setHTTPSRedirect(true);
|
||||
|
||||
printMenu();
|
||||
}
|
||||
|
||||
void printMenu(void) {
|
||||
Serial.println(F("-------------------------------------"));
|
||||
Serial.println(F("[?] Print this menu"));
|
||||
Serial.println(F("[a] read the ADC 2.8V max (FONA800 & 808)"));
|
||||
Serial.println(F("[b] read the Battery V and % charged"));
|
||||
Serial.println(F("[C] read the SIM CCID"));
|
||||
Serial.println(F("[U] Unlock SIM with PIN code"));
|
||||
Serial.println(F("[i] read RSSI"));
|
||||
Serial.println(F("[n] get Network status"));
|
||||
Serial.println(F("[v] set audio Volume"));
|
||||
Serial.println(F("[V] get Volume"));
|
||||
Serial.println(F("[H] set Headphone audio (FONA800 & 808)"));
|
||||
Serial.println(F("[e] set External audio (FONA800 & 808)"));
|
||||
Serial.println(F("[T] play audio Tone"));
|
||||
Serial.println(F("[P] PWM/Buzzer out (FONA800 & 808)"));
|
||||
|
||||
// FM (SIM800 only!)
|
||||
Serial.println(F("[f] tune FM radio (FONA800)"));
|
||||
Serial.println(F("[F] turn off FM (FONA800)"));
|
||||
Serial.println(F("[m] set FM volume (FONA800)"));
|
||||
Serial.println(F("[M] get FM volume (FONA800)"));
|
||||
Serial.println(F("[q] get FM station signal level (FONA800)"));
|
||||
|
||||
// Phone
|
||||
Serial.println(F("[c] make phone Call"));
|
||||
Serial.println(F("[A] get call status"));
|
||||
Serial.println(F("[h] Hang up phone"));
|
||||
Serial.println(F("[p] Pick up phone"));
|
||||
|
||||
// SMS
|
||||
Serial.println(F("[N] Number of SMSs"));
|
||||
Serial.println(F("[r] Read SMS #"));
|
||||
Serial.println(F("[R] Read All SMS"));
|
||||
Serial.println(F("[d] Delete SMS #"));
|
||||
Serial.println(F("[s] Send SMS"));
|
||||
Serial.println(F("[u] Send USSD"));
|
||||
|
||||
// Time
|
||||
Serial.println(F("[y] Enable network time sync (FONA 800 & 808)"));
|
||||
Serial.println(F("[Y] Enable NTP time sync (GPRS FONA 800 & 808)"));
|
||||
Serial.println(F("[t] Get network time"));
|
||||
|
||||
// GPRS
|
||||
Serial.println(F("[G] Enable GPRS"));
|
||||
Serial.println(F("[g] Disable GPRS"));
|
||||
Serial.println(F("[l] Query GSMLOC (GPRS)"));
|
||||
Serial.println(F("[w] Read webpage (GPRS)"));
|
||||
Serial.println(F("[W] Post to website (GPRS)"));
|
||||
|
||||
// GPS
|
||||
if ((type == FONA3G_A) || (type == FONA3G_E) || (type == FONA808_V1) || (type == FONA808_V2)) {
|
||||
Serial.println(F("[O] Turn GPS on (FONA 808 & 3G)"));
|
||||
Serial.println(F("[o] Turn GPS off (FONA 808 & 3G)"));
|
||||
Serial.println(F("[L] Query GPS location (FONA 808 & 3G)"));
|
||||
if (type == FONA808_V1) {
|
||||
Serial.println(F("[x] GPS fix status (FONA808 v1 only)"));
|
||||
}
|
||||
Serial.println(F("[E] Raw NMEA out (FONA808)"));
|
||||
}
|
||||
|
||||
Serial.println(F("[S] create Serial passthru tunnel"));
|
||||
Serial.println(F("-------------------------------------"));
|
||||
Serial.println(F(""));
|
||||
|
||||
}
|
||||
void loop() {
|
||||
Serial.print(F("FONA> "));
|
||||
while (! Serial.available() ) {
|
||||
if (fona.available()) {
|
||||
Serial.write(fona.read());
|
||||
}
|
||||
}
|
||||
|
||||
char command = Serial.read();
|
||||
Serial.println(command);
|
||||
|
||||
|
||||
switch (command) {
|
||||
case '?': {
|
||||
printMenu();
|
||||
break;
|
||||
}
|
||||
|
||||
case 'a': {
|
||||
// read the ADC
|
||||
uint16_t adc;
|
||||
if (! fona.getADCVoltage(&adc)) {
|
||||
Serial.println(F("Failed to read ADC"));
|
||||
} else {
|
||||
Serial.print(F("ADC = ")); Serial.print(adc); Serial.println(F(" mV"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'b': {
|
||||
// read the battery voltage and percentage
|
||||
uint16_t vbat;
|
||||
if (! fona.getBattVoltage(&vbat)) {
|
||||
Serial.println(F("Failed to read Batt"));
|
||||
} else {
|
||||
Serial.print(F("VBat = ")); Serial.print(vbat); Serial.println(F(" mV"));
|
||||
}
|
||||
|
||||
|
||||
if (! fona.getBattPercent(&vbat)) {
|
||||
Serial.println(F("Failed to read Batt"));
|
||||
} else {
|
||||
Serial.print(F("VPct = ")); Serial.print(vbat); Serial.println(F("%"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'U': {
|
||||
// Unlock the SIM with a PIN code
|
||||
char PIN[5];
|
||||
flushSerial();
|
||||
Serial.println(F("Enter 4-digit PIN"));
|
||||
readline(PIN, 3);
|
||||
Serial.println(PIN);
|
||||
Serial.print(F("Unlocking SIM card: "));
|
||||
if (! fona.unlockSIM(PIN)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'C': {
|
||||
// read the CCID
|
||||
fona.getSIMCCID(replybuffer); // make sure replybuffer is at least 21 bytes!
|
||||
Serial.print(F("SIM CCID = ")); Serial.println(replybuffer);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'i': {
|
||||
// read the RSSI
|
||||
uint8_t n = fona.getRSSI();
|
||||
int8_t r;
|
||||
|
||||
Serial.print(F("RSSI = ")); Serial.print(n); Serial.print(": ");
|
||||
if (n == 0) r = -115;
|
||||
if (n == 1) r = -111;
|
||||
if (n == 31) r = -52;
|
||||
if ((n >= 2) && (n <= 30)) {
|
||||
r = map(n, 2, 30, -110, -54);
|
||||
}
|
||||
Serial.print(r); Serial.println(F(" dBm"));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'n': {
|
||||
// read the network/cellular status
|
||||
uint8_t n = fona.getNetworkStatus();
|
||||
Serial.print(F("Network status "));
|
||||
Serial.print(n);
|
||||
Serial.print(F(": "));
|
||||
if (n == 0) Serial.println(F("Not registered"));
|
||||
if (n == 1) Serial.println(F("Registered (home)"));
|
||||
if (n == 2) Serial.println(F("Not registered (searching)"));
|
||||
if (n == 3) Serial.println(F("Denied"));
|
||||
if (n == 4) Serial.println(F("Unknown"));
|
||||
if (n == 5) Serial.println(F("Registered roaming"));
|
||||
break;
|
||||
}
|
||||
|
||||
/*** Audio ***/
|
||||
case 'v': {
|
||||
// set volume
|
||||
flushSerial();
|
||||
if ( (type == FONA3G_A) || (type == FONA3G_E) ) {
|
||||
Serial.print(F("Set Vol [0-8] "));
|
||||
} else {
|
||||
Serial.print(F("Set Vol % [0-100] "));
|
||||
}
|
||||
uint8_t vol = readnumber();
|
||||
Serial.println();
|
||||
if (! fona.setVolume(vol)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'V': {
|
||||
uint8_t v = fona.getVolume();
|
||||
Serial.print(v);
|
||||
if ( (type == FONA3G_A) || (type == FONA3G_E) ) {
|
||||
Serial.println(" / 8");
|
||||
} else {
|
||||
Serial.println("%");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'H': {
|
||||
// Set Headphone output
|
||||
if (! fona.setAudio(FONA_HEADSETAUDIO)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
fona.setMicVolume(FONA_HEADSETAUDIO, 15);
|
||||
break;
|
||||
}
|
||||
case 'e': {
|
||||
// Set External output
|
||||
if (! fona.setAudio(FONA_EXTAUDIO)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
|
||||
fona.setMicVolume(FONA_EXTAUDIO, 10);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'T': {
|
||||
// play tone
|
||||
flushSerial();
|
||||
Serial.print(F("Play tone #"));
|
||||
uint8_t kittone = readnumber();
|
||||
Serial.println();
|
||||
// play for 1 second (1000 ms)
|
||||
if (! fona.playToolkitTone(kittone, 1000)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*** FM Radio ***/
|
||||
|
||||
case 'f': {
|
||||
// get freq
|
||||
flushSerial();
|
||||
Serial.print(F("FM Freq (eg 1011 == 101.1 MHz): "));
|
||||
uint16_t station = readnumber();
|
||||
Serial.println();
|
||||
// FM radio ON using headset
|
||||
if (fona.FMradio(true, FONA_HEADSETAUDIO)) {
|
||||
Serial.println(F("Opened"));
|
||||
}
|
||||
if (! fona.tuneFMradio(station)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Tuned"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'F': {
|
||||
// FM radio off
|
||||
if (! fona.FMradio(false)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'm': {
|
||||
// Set FM volume.
|
||||
flushSerial();
|
||||
Serial.print(F("Set FM Vol [0-6]:"));
|
||||
uint8_t vol = readnumber();
|
||||
Serial.println();
|
||||
if (!fona.setFMVolume(vol)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'M': {
|
||||
// Get FM volume.
|
||||
uint8_t fmvol = fona.getFMVolume();
|
||||
if (fmvol < 0) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.print(F("FM volume: "));
|
||||
Serial.println(fmvol, DEC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'q': {
|
||||
// Get FM station signal level (in decibels).
|
||||
flushSerial();
|
||||
Serial.print(F("FM Freq (eg 1011 == 101.1 MHz): "));
|
||||
uint16_t station = readnumber();
|
||||
Serial.println();
|
||||
int8_t level = fona.getFMSignalLevel(station);
|
||||
if (level < 0) {
|
||||
Serial.println(F("Failed! Make sure FM radio is on (tuned to station)."));
|
||||
} else {
|
||||
Serial.print(F("Signal level (dB): "));
|
||||
Serial.println(level, DEC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*** PWM ***/
|
||||
|
||||
case 'P': {
|
||||
// PWM Buzzer output @ 2KHz max
|
||||
flushSerial();
|
||||
Serial.print(F("PWM Freq, 0 = Off, (1-2000): "));
|
||||
uint16_t freq = readnumber();
|
||||
Serial.println();
|
||||
if (! fona.setPWM(freq)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*** Call ***/
|
||||
case 'c': {
|
||||
// call a phone!
|
||||
char number[30];
|
||||
flushSerial();
|
||||
Serial.print(F("Call #"));
|
||||
readline(number, 30);
|
||||
Serial.println();
|
||||
Serial.print(F("Calling ")); Serial.println(number);
|
||||
if (!fona.callPhone(number)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Sent!"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 'A': {
|
||||
// get call status
|
||||
int8_t callstat = fona.getCallStatus();
|
||||
switch (callstat) {
|
||||
case 0: Serial.println(F("Ready")); break;
|
||||
case 1: Serial.println(F("Could not get status")); break;
|
||||
case 3: Serial.println(F("Ringing (incoming)")); break;
|
||||
case 4: Serial.println(F("Ringing/in progress (outgoing)")); break;
|
||||
default: Serial.println(F("Unknown")); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'h': {
|
||||
// hang up!
|
||||
if (! fona.hangUp()) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'p': {
|
||||
// pick up!
|
||||
if (! fona.pickUp()) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*** SMS ***/
|
||||
|
||||
case 'N': {
|
||||
// read the number of SMS's!
|
||||
int8_t smsnum = fona.getNumSMS();
|
||||
if (smsnum < 0) {
|
||||
Serial.println(F("Could not read # SMS"));
|
||||
} else {
|
||||
Serial.print(smsnum);
|
||||
Serial.println(F(" SMS's on SIM card!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'r': {
|
||||
// read an SMS
|
||||
flushSerial();
|
||||
Serial.print(F("Read #"));
|
||||
uint8_t smsn = readnumber();
|
||||
Serial.print(F("\n\rReading SMS #")); Serial.println(smsn);
|
||||
|
||||
// Retrieve SMS sender address/phone number.
|
||||
if (! fona.getSMSSender(smsn, replybuffer, 250)) {
|
||||
Serial.println("Failed!");
|
||||
break;
|
||||
}
|
||||
Serial.print(F("FROM: ")); Serial.println(replybuffer);
|
||||
|
||||
// Retrieve SMS value.
|
||||
uint16_t smslen;
|
||||
if (! fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
|
||||
Serial.println("Failed!");
|
||||
break;
|
||||
}
|
||||
Serial.print(F("***** SMS #")); Serial.print(smsn);
|
||||
Serial.print(" ("); Serial.print(smslen); Serial.println(F(") bytes *****"));
|
||||
Serial.println(replybuffer);
|
||||
Serial.println(F("*****"));
|
||||
|
||||
break;
|
||||
}
|
||||
case 'R': {
|
||||
// read all SMS
|
||||
int8_t smsnum = fona.getNumSMS();
|
||||
uint16_t smslen;
|
||||
int8_t smsn;
|
||||
|
||||
if ( (type == FONA3G_A) || (type == FONA3G_E) ) {
|
||||
smsn = 0; // zero indexed
|
||||
smsnum--;
|
||||
} else {
|
||||
smsn = 1; // 1 indexed
|
||||
}
|
||||
|
||||
for ( ; smsn <= smsnum; smsn++) {
|
||||
Serial.print(F("\n\rReading SMS #")); Serial.println(smsn);
|
||||
if (!fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
|
||||
Serial.println(F("Failed!"));
|
||||
break;
|
||||
}
|
||||
// if the length is zero, its a special case where the index number is higher
|
||||
// so increase the max we'll look at!
|
||||
if (smslen == 0) {
|
||||
Serial.println(F("[empty slot]"));
|
||||
smsnum++;
|
||||
continue;
|
||||
}
|
||||
|
||||
Serial.print(F("***** SMS #")); Serial.print(smsn);
|
||||
Serial.print(" ("); Serial.print(smslen); Serial.println(F(") bytes *****"));
|
||||
Serial.println(replybuffer);
|
||||
Serial.println(F("*****"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'd': {
|
||||
// delete an SMS
|
||||
flushSerial();
|
||||
Serial.print(F("Delete #"));
|
||||
uint8_t smsn = readnumber();
|
||||
|
||||
Serial.print(F("\n\rDeleting SMS #")); Serial.println(smsn);
|
||||
if (fona.deleteSMS(smsn)) {
|
||||
Serial.println(F("OK!"));
|
||||
} else {
|
||||
Serial.println(F("Couldn't delete"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 's': {
|
||||
// send an SMS!
|
||||
char sendto[21], message[141];
|
||||
flushSerial();
|
||||
Serial.print(F("Send to #"));
|
||||
readline(sendto, 20);
|
||||
Serial.println(sendto);
|
||||
Serial.print(F("Type out one-line message (140 char): "));
|
||||
readline(message, 140);
|
||||
Serial.println(message);
|
||||
if (!fona.sendSMS(sendto, message)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Sent!"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'u': {
|
||||
// send a USSD!
|
||||
char message[141];
|
||||
flushSerial();
|
||||
Serial.print(F("Type out one-line message (140 char): "));
|
||||
readline(message, 140);
|
||||
Serial.println(message);
|
||||
|
||||
uint16_t ussdlen;
|
||||
if (!fona.sendUSSD(message, replybuffer, 250, &ussdlen)) { // pass in buffer and max len!
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Sent!"));
|
||||
Serial.print(F("***** USSD Reply"));
|
||||
Serial.print(" ("); Serial.print(ussdlen); Serial.println(F(") bytes *****"));
|
||||
Serial.println(replybuffer);
|
||||
Serial.println(F("*****"));
|
||||
}
|
||||
}
|
||||
|
||||
/*** Time ***/
|
||||
|
||||
case 'y': {
|
||||
// enable network time sync
|
||||
if (!fona.enableNetworkTimeSync(true))
|
||||
Serial.println(F("Failed to enable"));
|
||||
break;
|
||||
}
|
||||
|
||||
case 'Y': {
|
||||
// enable NTP time sync
|
||||
if (!fona.enableNTPTimeSync(true, F("pool.ntp.org")))
|
||||
Serial.println(F("Failed to enable"));
|
||||
break;
|
||||
}
|
||||
|
||||
case 't': {
|
||||
// read the time
|
||||
char buffer[23];
|
||||
|
||||
fona.getTime(buffer, 23); // make sure replybuffer is at least 23 bytes!
|
||||
Serial.print(F("Time = ")); Serial.println(buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*********************************** GPS (SIM808 only) */
|
||||
|
||||
case 'o': {
|
||||
// turn GPS off
|
||||
if (!fona.enableGPS(false))
|
||||
Serial.println(F("Failed to turn off"));
|
||||
break;
|
||||
}
|
||||
case 'O': {
|
||||
// turn GPS on
|
||||
if (!fona.enableGPS(true))
|
||||
Serial.println(F("Failed to turn on"));
|
||||
break;
|
||||
}
|
||||
case 'x': {
|
||||
int8_t stat;
|
||||
// check GPS fix
|
||||
stat = fona.GPSstatus();
|
||||
if (stat < 0)
|
||||
Serial.println(F("Failed to query"));
|
||||
if (stat == 0) Serial.println(F("GPS off"));
|
||||
if (stat == 1) Serial.println(F("No fix"));
|
||||
if (stat == 2) Serial.println(F("2D fix"));
|
||||
if (stat == 3) Serial.println(F("3D fix"));
|
||||
break;
|
||||
}
|
||||
|
||||
case 'L': {
|
||||
// check for GPS location
|
||||
char gpsdata[120];
|
||||
fona.getGPS(0, gpsdata, 120);
|
||||
if (type == FONA808_V1)
|
||||
Serial.println(F("Reply in format: mode,longitude,latitude,altitude,utctime(yyyymmddHHMMSS),ttff,satellites,speed,course"));
|
||||
else
|
||||
Serial.println(F("Reply in format: mode,fixstatus,utctime(yyyymmddHHMMSS),latitude,longitude,altitude,speed,course,fixmode,reserved1,HDOP,PDOP,VDOP,reserved2,view_satellites,used_satellites,reserved3,C/N0max,HPA,VPA"));
|
||||
Serial.println(gpsdata);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'E': {
|
||||
flushSerial();
|
||||
if (type == FONA808_V1) {
|
||||
Serial.print(F("GPS NMEA output sentences (0 = off, 34 = RMC+GGA, 255 = all)"));
|
||||
} else {
|
||||
Serial.print(F("On (1) or Off (0)? "));
|
||||
}
|
||||
uint8_t nmeaout = readnumber();
|
||||
|
||||
// turn on NMEA output
|
||||
fona.enableGPSNMEA(nmeaout);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/*********************************** GPRS */
|
||||
|
||||
case 'g': {
|
||||
// turn GPRS off
|
||||
if (!fona.enableGPRS(false))
|
||||
Serial.println(F("Failed to turn off"));
|
||||
break;
|
||||
}
|
||||
case 'G': {
|
||||
// turn GPRS on
|
||||
if (!fona.enableGPRS(true))
|
||||
Serial.println(F("Failed to turn on"));
|
||||
break;
|
||||
}
|
||||
case 'l': {
|
||||
// check for GSMLOC (requires GPRS)
|
||||
uint16_t returncode;
|
||||
|
||||
if (!fona.getGSMLoc(&returncode, replybuffer, 250))
|
||||
Serial.println(F("Failed!"));
|
||||
if (returncode == 0) {
|
||||
Serial.println(replybuffer);
|
||||
} else {
|
||||
Serial.print(F("Fail code #")); Serial.println(returncode);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 'w': {
|
||||
// read website URL
|
||||
uint16_t statuscode;
|
||||
int16_t length;
|
||||
char url[80];
|
||||
|
||||
flushSerial();
|
||||
Serial.println(F("NOTE: in beta! Use small webpages to read!"));
|
||||
Serial.println(F("URL to read (e.g. wifitest.adafruit.com/testwifi/index.html):"));
|
||||
Serial.print(F("http://")); readline(url, 79);
|
||||
Serial.println(url);
|
||||
|
||||
Serial.println(F("****"));
|
||||
if (!fona.HTTP_GET_start(url, &statuscode, (uint16_t *)&length)) {
|
||||
Serial.println("Failed!");
|
||||
break;
|
||||
}
|
||||
while (length > 0) {
|
||||
while (fona.available()) {
|
||||
char c = fona.read();
|
||||
|
||||
// Serial.write is too slow, we'll write directly to Serial register!
|
||||
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
|
||||
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
|
||||
UDR0 = c;
|
||||
#else
|
||||
Serial.write(c);
|
||||
#endif
|
||||
length--;
|
||||
if (! length) break;
|
||||
}
|
||||
}
|
||||
Serial.println(F("\n****"));
|
||||
fona.HTTP_GET_end();
|
||||
break;
|
||||
}
|
||||
|
||||
case 'W': {
|
||||
// Post data to website
|
||||
uint16_t statuscode;
|
||||
int16_t length;
|
||||
char url[80];
|
||||
char data[80];
|
||||
|
||||
flushSerial();
|
||||
Serial.println(F("NOTE: in beta! Use simple websites to post!"));
|
||||
Serial.println(F("URL to post (e.g. httpbin.org/post):"));
|
||||
Serial.print(F("http://")); readline(url, 79);
|
||||
Serial.println(url);
|
||||
Serial.println(F("Data to post (e.g. \"foo\" or \"{\"simple\":\"json\"}\"):"));
|
||||
readline(data, 79);
|
||||
Serial.println(data);
|
||||
|
||||
Serial.println(F("****"));
|
||||
if (!fona.HTTP_POST_start(url, F("text/plain"), (uint8_t *) data, strlen(data), &statuscode, (uint16_t *)&length)) {
|
||||
Serial.println("Failed!");
|
||||
break;
|
||||
}
|
||||
while (length > 0) {
|
||||
while (fona.available()) {
|
||||
char c = fona.read();
|
||||
|
||||
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
|
||||
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
|
||||
UDR0 = c;
|
||||
#else
|
||||
Serial.write(c);
|
||||
#endif
|
||||
|
||||
length--;
|
||||
if (! length) break;
|
||||
}
|
||||
}
|
||||
Serial.println(F("\n****"));
|
||||
fona.HTTP_POST_end();
|
||||
break;
|
||||
}
|
||||
/*****************************************/
|
||||
|
||||
case 'S': {
|
||||
Serial.println(F("Creating SERIAL TUBE"));
|
||||
while (1) {
|
||||
while (Serial.available()) {
|
||||
delay(1);
|
||||
fona.write(Serial.read());
|
||||
}
|
||||
if (fona.available()) {
|
||||
Serial.write(fona.read());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
Serial.println(F("Unknown command"));
|
||||
printMenu();
|
||||
break;
|
||||
}
|
||||
}
|
||||
// flush input
|
||||
flushSerial();
|
||||
while (fona.available()) {
|
||||
Serial.write(fona.read());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void flushSerial() {
|
||||
while (Serial.available())
|
||||
Serial.read();
|
||||
}
|
||||
|
||||
char readBlocking() {
|
||||
while (!Serial.available());
|
||||
return Serial.read();
|
||||
}
|
||||
uint16_t readnumber() {
|
||||
uint16_t x = 0;
|
||||
char c;
|
||||
while (! isdigit(c = readBlocking())) {
|
||||
//Serial.print(c);
|
||||
}
|
||||
Serial.print(c);
|
||||
x = c - '0';
|
||||
while (isdigit(c = readBlocking())) {
|
||||
Serial.print(c);
|
||||
x *= 10;
|
||||
x += c - '0';
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
|
||||
uint16_t buffidx = 0;
|
||||
boolean timeoutvalid = true;
|
||||
if (timeout == 0) timeoutvalid = false;
|
||||
|
||||
while (true) {
|
||||
if (buffidx > maxbuff) {
|
||||
//Serial.println(F("SPACE"));
|
||||
break;
|
||||
}
|
||||
|
||||
while (Serial.available()) {
|
||||
char c = Serial.read();
|
||||
|
||||
//Serial.print(c, HEX); Serial.print("#"); Serial.println(c);
|
||||
|
||||
if (c == '\r') continue;
|
||||
if (c == 0xA) {
|
||||
if (buffidx == 0) // the first 0x0A is ignored
|
||||
continue;
|
||||
|
||||
timeout = 0; // the second 0x0A is the end of the line
|
||||
timeoutvalid = true;
|
||||
break;
|
||||
}
|
||||
buff[buffidx] = c;
|
||||
buffidx++;
|
||||
}
|
||||
|
||||
if (timeoutvalid && timeout == 0) {
|
||||
//Serial.println(F("TIMEOUT"));
|
||||
break;
|
||||
}
|
||||
delay(1);
|
||||
}
|
||||
buff[buffidx] = 0; // null term
|
||||
return buffidx;
|
||||
}
|
BIN
libraries/Adafruit_FONA_Library/examples/FONAtest_KEY_mod.zip
Normal file
BIN
libraries/Adafruit_FONA_Library/examples/FONAtest_KEY_mod.zip
Normal file
Binary file not shown.
|
@ -0,0 +1,909 @@
|
|||
/***************************************************
|
||||
This is an example for our Adafruit FONA Cellular Module
|
||||
|
||||
Designed specifically to work with the Adafruit FONA
|
||||
----> http://www.adafruit.com/products/1946
|
||||
----> http://www.adafruit.com/products/1963
|
||||
----> http://www.adafruit.com/products/2468
|
||||
----> http://www.adafruit.com/products/2542
|
||||
|
||||
These cellular modules use TTL Serial to communicate, 2 pins are
|
||||
required to interface
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/*
|
||||
THIS CODE IS STILL IN PROGRESS!
|
||||
|
||||
Open up the serial console on the Arduino at 115200 baud to interact with FONA
|
||||
|
||||
Note that if you need to set a GPRS APN, username, and password scroll down to
|
||||
the commented section below at the end of the setup() function.
|
||||
*/
|
||||
#include "Adafruit_FONA.h"
|
||||
|
||||
#define FONA_RX 2
|
||||
#define FONA_TX 3
|
||||
#define FONA_RST 4
|
||||
#define FONA_KEY 8
|
||||
|
||||
// this is a large buffer for replies
|
||||
char replybuffer[255];
|
||||
|
||||
// We default to using software serial. If you want to use hardware serial
|
||||
// (because softserial isnt supported) comment out the following three lines
|
||||
// and uncomment the HardwareSerial line
|
||||
#include <SoftwareSerial.h>
|
||||
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
|
||||
SoftwareSerial *fonaSerial = &fonaSS;
|
||||
|
||||
// Hardware serial is also possible!
|
||||
// HardwareSerial *fonaSerial = &Serial1;
|
||||
|
||||
// Use this for FONA 800 and 808s
|
||||
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
|
||||
// Use this one for FONA 3G
|
||||
//Adafruit_FONA_3G fona = Adafruit_FONA_3G(FONA_RST);
|
||||
|
||||
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
|
||||
|
||||
uint8_t type;
|
||||
|
||||
void setup() {
|
||||
while (!Serial);
|
||||
|
||||
pinMode(FONA_KEY, OUTPUT);
|
||||
digitalWrite(FONA_KEY, HIGH);
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("FONA basic test"));
|
||||
Serial.println(F("Initializing....(May take 3 seconds)"));
|
||||
|
||||
fonaSerial->begin(4800);
|
||||
if (! fona.begin(*fonaSerial)) {
|
||||
Serial.println(F("Couldn't find FONA"));
|
||||
while (1);
|
||||
}
|
||||
type = fona.type();
|
||||
Serial.println(F("FONA is OK"));
|
||||
Serial.print(F("Found "));
|
||||
switch (type) {
|
||||
case FONA800L:
|
||||
Serial.println(F("FONA 800L")); break;
|
||||
case FONA800H:
|
||||
Serial.println(F("FONA 800H")); break;
|
||||
case FONA808_V1:
|
||||
Serial.println(F("FONA 808 (v1)")); break;
|
||||
case FONA808_V2:
|
||||
Serial.println(F("FONA 808 (v2)")); break;
|
||||
case FONA3G_A:
|
||||
Serial.println(F("FONA 3G (American)")); break;
|
||||
case FONA3G_E:
|
||||
Serial.println(F("FONA 3G (European)")); break;
|
||||
default:
|
||||
Serial.println(F("???")); break;
|
||||
}
|
||||
|
||||
// Print module IMEI number.
|
||||
char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
|
||||
uint8_t imeiLen = fona.getIMEI(imei);
|
||||
if (imeiLen > 0) {
|
||||
Serial.print("Module IMEI: "); Serial.println(imei);
|
||||
}
|
||||
|
||||
// Optionally configure a GPRS APN, username, and password.
|
||||
// You might need to do this to access your network's GPRS/data
|
||||
// network. Contact your provider for the exact APN, username,
|
||||
// and password values. Username and password are optional and
|
||||
// can be removed, but APN is required.
|
||||
//fona.setGPRSNetworkSettings(F("your APN"), F("your username"), F("your password"));
|
||||
|
||||
// Optionally configure HTTP gets to follow redirects over SSL.
|
||||
// Default is not to follow SSL redirects, however if you uncomment
|
||||
// the following line then redirects over SSL will be followed.
|
||||
//fona.setHTTPSRedirect(true);
|
||||
|
||||
printMenu();
|
||||
}
|
||||
|
||||
void printMenu(void) {
|
||||
Serial.println(F("-------------------------------------"));
|
||||
Serial.println(F("[?] Print this menu"));
|
||||
Serial.println(F("[a] read the ADC 2.8V max (FONA800 & 808)"));
|
||||
Serial.println(F("[b] read the Battery V and % charged"));
|
||||
Serial.println(F("[C] read the SIM CCID"));
|
||||
Serial.println(F("[U] Unlock SIM with PIN code"));
|
||||
Serial.println(F("[i] read RSSI"));
|
||||
Serial.println(F("[n] get Network status"));
|
||||
Serial.println(F("[v] set audio Volume"));
|
||||
Serial.println(F("[V] get Volume"));
|
||||
Serial.println(F("[H] set Headphone audio (FONA800 & 808)"));
|
||||
Serial.println(F("[e] set External audio (FONA800 & 808)"));
|
||||
Serial.println(F("[T] play audio Tone"));
|
||||
Serial.println(F("[P] PWM/Buzzer out (FONA800 & 808)"));
|
||||
Serial.println(F("[Z] power off with Key"));
|
||||
Serial.println(F("[z] power on with Key"));
|
||||
|
||||
// FM (SIM800 only!)
|
||||
Serial.println(F("[f] tune FM radio (FONA800)"));
|
||||
Serial.println(F("[F] turn off FM (FONA800)"));
|
||||
Serial.println(F("[m] set FM volume (FONA800)"));
|
||||
Serial.println(F("[M] get FM volume (FONA800)"));
|
||||
Serial.println(F("[q] get FM station signal level (FONA800)"));
|
||||
|
||||
// Phone
|
||||
Serial.println(F("[c] make phone Call"));
|
||||
Serial.println(F("[A] get call status"));
|
||||
Serial.println(F("[h] Hang up phone"));
|
||||
Serial.println(F("[p] Pick up phone"));
|
||||
|
||||
// SMS
|
||||
Serial.println(F("[N] Number of SMSs"));
|
||||
Serial.println(F("[r] Read SMS #"));
|
||||
Serial.println(F("[R] Read All SMS"));
|
||||
Serial.println(F("[d] Delete SMS #"));
|
||||
Serial.println(F("[s] Send SMS"));
|
||||
Serial.println(F("[u] Send USSD"));
|
||||
|
||||
// Time
|
||||
Serial.println(F("[y] Enable network time sync (FONA 800 & 808)"));
|
||||
Serial.println(F("[Y] Enable NTP time sync (GPRS FONA 800 & 808)"));
|
||||
Serial.println(F("[t] Get network time"));
|
||||
|
||||
// GPRS
|
||||
Serial.println(F("[G] Enable GPRS"));
|
||||
Serial.println(F("[g] Disable GPRS"));
|
||||
Serial.println(F("[l] Query GSMLOC (GPRS)"));
|
||||
Serial.println(F("[w] Read webpage (GPRS)"));
|
||||
Serial.println(F("[W] Post to website (GPRS)"));
|
||||
|
||||
// GPS
|
||||
if ((type == FONA3G_A) || (type == FONA3G_E) || (type == FONA808_V1) || (type == FONA808_V2)) {
|
||||
Serial.println(F("[O] Turn GPS on (FONA 808 & 3G)"));
|
||||
Serial.println(F("[o] Turn GPS off (FONA 808 & 3G)"));
|
||||
Serial.println(F("[L] Query GPS location (FONA 808 & 3G)"));
|
||||
if (type == FONA808_V1) {
|
||||
Serial.println(F("[x] GPS fix status (FONA808 v1 only)"));
|
||||
}
|
||||
Serial.println(F("[E] Raw NMEA out (FONA808)"));
|
||||
}
|
||||
|
||||
Serial.println(F("[S] create Serial passthru tunnel"));
|
||||
Serial.println(F("-------------------------------------"));
|
||||
Serial.println(F(""));
|
||||
|
||||
}
|
||||
void loop() {
|
||||
Serial.print(F("FONA> "));
|
||||
while (! Serial.available() ) {
|
||||
if (fona.available()) {
|
||||
Serial.write(fona.read());
|
||||
}
|
||||
}
|
||||
|
||||
char command = Serial.read();
|
||||
Serial.println(command);
|
||||
|
||||
|
||||
switch (command) {
|
||||
case '?': {
|
||||
printMenu();
|
||||
break;
|
||||
}
|
||||
|
||||
case 'Z': {
|
||||
digitalWrite(FONA_KEY, LOW);
|
||||
delay(2000);
|
||||
digitalWrite(FONA_KEY, HIGH);
|
||||
delay(3000);
|
||||
break;
|
||||
}
|
||||
case 'z': {
|
||||
digitalWrite(FONA_KEY, LOW);
|
||||
delay(2000);
|
||||
digitalWrite(FONA_KEY, HIGH);
|
||||
delay(3000);
|
||||
if (! fona.begin(*fonaSerial)) {
|
||||
Serial.println(F("Couldn't find FONA"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'a': {
|
||||
// read the ADC
|
||||
uint16_t adc;
|
||||
if (! fona.getADCVoltage(&adc)) {
|
||||
Serial.println(F("Failed to read ADC"));
|
||||
} else {
|
||||
Serial.print(F("ADC = ")); Serial.print(adc); Serial.println(F(" mV"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'b': {
|
||||
// read the battery voltage and percentage
|
||||
uint16_t vbat;
|
||||
if (! fona.getBattVoltage(&vbat)) {
|
||||
Serial.println(F("Failed to read Batt"));
|
||||
} else {
|
||||
Serial.print(F("VBat = ")); Serial.print(vbat); Serial.println(F(" mV"));
|
||||
}
|
||||
|
||||
|
||||
if (! fona.getBattPercent(&vbat)) {
|
||||
Serial.println(F("Failed to read Batt"));
|
||||
} else {
|
||||
Serial.print(F("VPct = ")); Serial.print(vbat); Serial.println(F("%"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'U': {
|
||||
// Unlock the SIM with a PIN code
|
||||
char PIN[5];
|
||||
flushSerial();
|
||||
Serial.println(F("Enter 4-digit PIN"));
|
||||
readline(PIN, 3);
|
||||
Serial.println(PIN);
|
||||
Serial.print(F("Unlocking SIM card: "));
|
||||
if (! fona.unlockSIM(PIN)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'C': {
|
||||
// read the CCID
|
||||
fona.getSIMCCID(replybuffer); // make sure replybuffer is at least 21 bytes!
|
||||
Serial.print(F("SIM CCID = ")); Serial.println(replybuffer);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'i': {
|
||||
// read the RSSI
|
||||
uint8_t n = fona.getRSSI();
|
||||
int8_t r;
|
||||
|
||||
Serial.print(F("RSSI = ")); Serial.print(n); Serial.print(": ");
|
||||
if (n == 0) r = -115;
|
||||
if (n == 1) r = -111;
|
||||
if (n == 31) r = -52;
|
||||
if ((n >= 2) && (n <= 30)) {
|
||||
r = map(n, 2, 30, -110, -54);
|
||||
}
|
||||
Serial.print(r); Serial.println(F(" dBm"));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'n': {
|
||||
// read the network/cellular status
|
||||
uint8_t n = fona.getNetworkStatus();
|
||||
Serial.print(F("Network status "));
|
||||
Serial.print(n);
|
||||
Serial.print(F(": "));
|
||||
if (n == 0) Serial.println(F("Not registered"));
|
||||
if (n == 1) Serial.println(F("Registered (home)"));
|
||||
if (n == 2) Serial.println(F("Not registered (searching)"));
|
||||
if (n == 3) Serial.println(F("Denied"));
|
||||
if (n == 4) Serial.println(F("Unknown"));
|
||||
if (n == 5) Serial.println(F("Registered roaming"));
|
||||
break;
|
||||
}
|
||||
|
||||
/*** Audio ***/
|
||||
case 'v': {
|
||||
// set volume
|
||||
flushSerial();
|
||||
if ( (type == FONA3G_A) || (type == FONA3G_E) ) {
|
||||
Serial.print(F("Set Vol [0-8] "));
|
||||
} else {
|
||||
Serial.print(F("Set Vol % [0-100] "));
|
||||
}
|
||||
uint8_t vol = readnumber();
|
||||
Serial.println();
|
||||
if (! fona.setVolume(vol)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'V': {
|
||||
uint8_t v = fona.getVolume();
|
||||
Serial.print(v);
|
||||
if ( (type == FONA3G_A) || (type == FONA3G_E) ) {
|
||||
Serial.println(" / 8");
|
||||
} else {
|
||||
Serial.println("%");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'H': {
|
||||
// Set Headphone output
|
||||
if (! fona.setAudio(FONA_HEADSETAUDIO)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
fona.setMicVolume(FONA_HEADSETAUDIO, 15);
|
||||
break;
|
||||
}
|
||||
case 'e': {
|
||||
// Set External output
|
||||
if (! fona.setAudio(FONA_EXTAUDIO)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
|
||||
fona.setMicVolume(FONA_EXTAUDIO, 10);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'T': {
|
||||
// play tone
|
||||
flushSerial();
|
||||
Serial.print(F("Play tone #"));
|
||||
uint8_t kittone = readnumber();
|
||||
Serial.println();
|
||||
// play for 1 second (1000 ms)
|
||||
if (! fona.playToolkitTone(kittone, 1000)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*** FM Radio ***/
|
||||
|
||||
case 'f': {
|
||||
// get freq
|
||||
flushSerial();
|
||||
Serial.print(F("FM Freq (eg 1011 == 101.1 MHz): "));
|
||||
uint16_t station = readnumber();
|
||||
Serial.println();
|
||||
// FM radio ON using headset
|
||||
if (fona.FMradio(true, FONA_HEADSETAUDIO)) {
|
||||
Serial.println(F("Opened"));
|
||||
}
|
||||
if (! fona.tuneFMradio(station)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Tuned"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'F': {
|
||||
// FM radio off
|
||||
if (! fona.FMradio(false)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'm': {
|
||||
// Set FM volume.
|
||||
flushSerial();
|
||||
Serial.print(F("Set FM Vol [0-6]:"));
|
||||
uint8_t vol = readnumber();
|
||||
Serial.println();
|
||||
if (!fona.setFMVolume(vol)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'M': {
|
||||
// Get FM volume.
|
||||
uint8_t fmvol = fona.getFMVolume();
|
||||
if (fmvol < 0) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.print(F("FM volume: "));
|
||||
Serial.println(fmvol, DEC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'q': {
|
||||
// Get FM station signal level (in decibels).
|
||||
flushSerial();
|
||||
Serial.print(F("FM Freq (eg 1011 == 101.1 MHz): "));
|
||||
uint16_t station = readnumber();
|
||||
Serial.println();
|
||||
int8_t level = fona.getFMSignalLevel(station);
|
||||
if (level < 0) {
|
||||
Serial.println(F("Failed! Make sure FM radio is on (tuned to station)."));
|
||||
} else {
|
||||
Serial.print(F("Signal level (dB): "));
|
||||
Serial.println(level, DEC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*** PWM ***/
|
||||
|
||||
case 'P': {
|
||||
// PWM Buzzer output @ 2KHz max
|
||||
flushSerial();
|
||||
Serial.print(F("PWM Freq, 0 = Off, (1-2000): "));
|
||||
uint16_t freq = readnumber();
|
||||
Serial.println();
|
||||
if (! fona.setPWM(freq)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*** Call ***/
|
||||
case 'c': {
|
||||
// call a phone!
|
||||
char number[30];
|
||||
flushSerial();
|
||||
Serial.print(F("Call #"));
|
||||
readline(number, 30);
|
||||
Serial.println();
|
||||
Serial.print(F("Calling ")); Serial.println(number);
|
||||
if (!fona.callPhone(number)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Sent!"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 'A': {
|
||||
// get call status
|
||||
int8_t callstat = fona.getCallStatus();
|
||||
switch (callstat) {
|
||||
case 0: Serial.println(F("Ready")); break;
|
||||
case 1: Serial.println(F("Could not get status")); break;
|
||||
case 3: Serial.println(F("Ringing (incoming)")); break;
|
||||
case 4: Serial.println(F("Ringing/in progress (outgoing)")); break;
|
||||
default: Serial.println(F("Unknown")); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'h': {
|
||||
// hang up!
|
||||
if (! fona.hangUp()) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'p': {
|
||||
// pick up!
|
||||
if (! fona.pickUp()) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("OK!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*** SMS ***/
|
||||
|
||||
case 'N': {
|
||||
// read the number of SMS's!
|
||||
int8_t smsnum = fona.getNumSMS();
|
||||
if (smsnum < 0) {
|
||||
Serial.println(F("Could not read # SMS"));
|
||||
} else {
|
||||
Serial.print(smsnum);
|
||||
Serial.println(F(" SMS's on SIM card!"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'r': {
|
||||
// read an SMS
|
||||
flushSerial();
|
||||
Serial.print(F("Read #"));
|
||||
uint8_t smsn = readnumber();
|
||||
Serial.print(F("\n\rReading SMS #")); Serial.println(smsn);
|
||||
|
||||
// Retrieve SMS sender address/phone number.
|
||||
if (! fona.getSMSSender(smsn, replybuffer, 250)) {
|
||||
Serial.println("Failed!");
|
||||
break;
|
||||
}
|
||||
Serial.print(F("FROM: ")); Serial.println(replybuffer);
|
||||
|
||||
// Retrieve SMS value.
|
||||
uint16_t smslen;
|
||||
if (! fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
|
||||
Serial.println("Failed!");
|
||||
break;
|
||||
}
|
||||
Serial.print(F("***** SMS #")); Serial.print(smsn);
|
||||
Serial.print(" ("); Serial.print(smslen); Serial.println(F(") bytes *****"));
|
||||
Serial.println(replybuffer);
|
||||
Serial.println(F("*****"));
|
||||
|
||||
break;
|
||||
}
|
||||
case 'R': {
|
||||
// read all SMS
|
||||
int8_t smsnum = fona.getNumSMS();
|
||||
uint16_t smslen;
|
||||
int8_t smsn;
|
||||
|
||||
if ( (type == FONA3G_A) || (type == FONA3G_E) ) {
|
||||
smsn = 0; // zero indexed
|
||||
smsnum--;
|
||||
} else {
|
||||
smsn = 1; // 1 indexed
|
||||
}
|
||||
|
||||
for ( ; smsn <= smsnum; smsn++) {
|
||||
Serial.print(F("\n\rReading SMS #")); Serial.println(smsn);
|
||||
if (!fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
|
||||
Serial.println(F("Failed!"));
|
||||
break;
|
||||
}
|
||||
// if the length is zero, its a special case where the index number is higher
|
||||
// so increase the max we'll look at!
|
||||
if (smslen == 0) {
|
||||
Serial.println(F("[empty slot]"));
|
||||
smsnum++;
|
||||
continue;
|
||||
}
|
||||
|
||||
Serial.print(F("***** SMS #")); Serial.print(smsn);
|
||||
Serial.print(" ("); Serial.print(smslen); Serial.println(F(") bytes *****"));
|
||||
Serial.println(replybuffer);
|
||||
Serial.println(F("*****"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'd': {
|
||||
// delete an SMS
|
||||
flushSerial();
|
||||
Serial.print(F("Delete #"));
|
||||
uint8_t smsn = readnumber();
|
||||
|
||||
Serial.print(F("\n\rDeleting SMS #")); Serial.println(smsn);
|
||||
if (fona.deleteSMS(smsn)) {
|
||||
Serial.println(F("OK!"));
|
||||
} else {
|
||||
Serial.println(F("Couldn't delete"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 's': {
|
||||
// send an SMS!
|
||||
char sendto[21], message[141];
|
||||
flushSerial();
|
||||
Serial.print(F("Send to #"));
|
||||
readline(sendto, 20);
|
||||
Serial.println(sendto);
|
||||
Serial.print(F("Type out one-line message (140 char): "));
|
||||
readline(message, 140);
|
||||
Serial.println(message);
|
||||
if (!fona.sendSMS(sendto, message)) {
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Sent!"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'u': {
|
||||
// send a USSD!
|
||||
char message[141];
|
||||
flushSerial();
|
||||
Serial.print(F("Type out one-line message (140 char): "));
|
||||
readline(message, 140);
|
||||
Serial.println(message);
|
||||
|
||||
uint16_t ussdlen;
|
||||
if (!fona.sendUSSD(message, replybuffer, 250, &ussdlen)) { // pass in buffer and max len!
|
||||
Serial.println(F("Failed"));
|
||||
} else {
|
||||
Serial.println(F("Sent!"));
|
||||
Serial.print(F("***** USSD Reply"));
|
||||
Serial.print(" ("); Serial.print(ussdlen); Serial.println(F(") bytes *****"));
|
||||
Serial.println(replybuffer);
|
||||
Serial.println(F("*****"));
|
||||
}
|
||||
}
|
||||
|
||||
/*** Time ***/
|
||||
|
||||
case 'y': {
|
||||
// enable network time sync
|
||||
if (!fona.enableNetworkTimeSync(true))
|
||||
Serial.println(F("Failed to enable"));
|
||||
break;
|
||||
}
|
||||
|
||||
case 'Y': {
|
||||
// enable NTP time sync
|
||||
if (!fona.enableNTPTimeSync(true, F("pool.ntp.org")))
|
||||
Serial.println(F("Failed to enable"));
|
||||
break;
|
||||
}
|
||||
|
||||
case 't': {
|
||||
// read the time
|
||||
char buffer[23];
|
||||
|
||||
fona.getTime(buffer, 23); // make sure replybuffer is at least 23 bytes!
|
||||
Serial.print(F("Time = ")); Serial.println(buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*********************************** GPS (SIM808 only) */
|
||||
|
||||
case 'o': {
|
||||
// turn GPS off
|
||||
if (!fona.enableGPS(false))
|
||||
Serial.println(F("Failed to turn off"));
|
||||
break;
|
||||
}
|
||||
case 'O': {
|
||||
// turn GPS on
|
||||
if (!fona.enableGPS(true))
|
||||
Serial.println(F("Failed to turn on"));
|
||||
break;
|
||||
}
|
||||
case 'x': {
|
||||
int8_t stat;
|
||||
// check GPS fix
|
||||
stat = fona.GPSstatus();
|
||||
if (stat < 0)
|
||||
Serial.println(F("Failed to query"));
|
||||
if (stat == 0) Serial.println(F("GPS off"));
|
||||
if (stat == 1) Serial.println(F("No fix"));
|
||||
if (stat == 2) Serial.println(F("2D fix"));
|
||||
if (stat == 3) Serial.println(F("3D fix"));
|
||||
break;
|
||||
}
|
||||
|
||||
case 'L': {
|
||||
// check for GPS location
|
||||
char gpsdata[120];
|
||||
fona.getGPS(0, gpsdata, 120);
|
||||
if (type == FONA808_V1)
|
||||
Serial.println(F("Reply in format: mode,longitude,latitude,altitude,utctime(yyyymmddHHMMSS),ttff,satellites,speed,course"));
|
||||
else
|
||||
Serial.println(F("Reply in format: mode,fixstatus,utctime(yyyymmddHHMMSS),latitude,longitude,altitude,speed,course,fixmode,reserved1,HDOP,PDOP,VDOP,reserved2,view_satellites,used_satellites,reserved3,C/N0max,HPA,VPA"));
|
||||
Serial.println(gpsdata);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'E': {
|
||||
flushSerial();
|
||||
if (type == FONA808_V1) {
|
||||
Serial.print(F("GPS NMEA output sentences (0 = off, 34 = RMC+GGA, 255 = all)"));
|
||||
} else {
|
||||
Serial.print(F("On (1) or Off (0)? "));
|
||||
}
|
||||
uint8_t nmeaout = readnumber();
|
||||
|
||||
// turn on NMEA output
|
||||
fona.enableGPSNMEA(nmeaout);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/*********************************** GPRS */
|
||||
|
||||
case 'g': {
|
||||
// turn GPRS off
|
||||
if (!fona.enableGPRS(false))
|
||||
Serial.println(F("Failed to turn off"));
|
||||
break;
|
||||
}
|
||||
case 'G': {
|
||||
// turn GPRS on
|
||||
if (!fona.enableGPRS(true))
|
||||
Serial.println(F("Failed to turn on"));
|
||||
break;
|
||||
}
|
||||
case 'l': {
|
||||
// check for GSMLOC (requires GPRS)
|
||||
uint16_t returncode;
|
||||
|
||||
if (!fona.getGSMLoc(&returncode, replybuffer, 250))
|
||||
Serial.println(F("Failed!"));
|
||||
if (returncode == 0) {
|
||||
Serial.println(replybuffer);
|
||||
} else {
|
||||
Serial.print(F("Fail code #")); Serial.println(returncode);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 'w': {
|
||||
// read website URL
|
||||
uint16_t statuscode;
|
||||
int16_t length;
|
||||
char url[80];
|
||||
|
||||
flushSerial();
|
||||
Serial.println(F("NOTE: in beta! Use small webpages to read!"));
|
||||
Serial.println(F("URL to read (e.g. www.adafruit.com/testwifi/index.html):"));
|
||||
Serial.print(F("http://")); readline(url, 79);
|
||||
Serial.println(url);
|
||||
|
||||
Serial.println(F("****"));
|
||||
if (!fona.HTTP_GET_start(url, &statuscode, (uint16_t *)&length)) {
|
||||
Serial.println("Failed!");
|
||||
break;
|
||||
}
|
||||
while (length > 0) {
|
||||
while (fona.available()) {
|
||||
char c = fona.read();
|
||||
|
||||
// Serial.write is too slow, we'll write directly to Serial register!
|
||||
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
|
||||
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
|
||||
UDR0 = c;
|
||||
#else
|
||||
Serial.write(c);
|
||||
#endif
|
||||
length--;
|
||||
if (! length) break;
|
||||
}
|
||||
}
|
||||
Serial.println(F("\n****"));
|
||||
fona.HTTP_GET_end();
|
||||
break;
|
||||
}
|
||||
|
||||
case 'W': {
|
||||
// Post data to website
|
||||
uint16_t statuscode;
|
||||
int16_t length;
|
||||
char url[80];
|
||||
char data[80];
|
||||
|
||||
flushSerial();
|
||||
Serial.println(F("NOTE: in beta! Use simple websites to post!"));
|
||||
Serial.println(F("URL to post (e.g. httpbin.org/post):"));
|
||||
Serial.print(F("http://")); readline(url, 79);
|
||||
Serial.println(url);
|
||||
Serial.println(F("Data to post (e.g. \"foo\" or \"{\"simple\":\"json\"}\"):"));
|
||||
readline(data, 79);
|
||||
Serial.println(data);
|
||||
|
||||
Serial.println(F("****"));
|
||||
if (!fona.HTTP_POST_start(url, F("text/plain"), (uint8_t *) data, strlen(data), &statuscode, (uint16_t *)&length)) {
|
||||
Serial.println("Failed!");
|
||||
break;
|
||||
}
|
||||
while (length > 0) {
|
||||
while (fona.available()) {
|
||||
char c = fona.read();
|
||||
|
||||
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
|
||||
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
|
||||
UDR0 = c;
|
||||
#else
|
||||
Serial.write(c);
|
||||
#endif
|
||||
|
||||
length--;
|
||||
if (! length) break;
|
||||
}
|
||||
}
|
||||
Serial.println(F("\n****"));
|
||||
fona.HTTP_POST_end();
|
||||
break;
|
||||
}
|
||||
/*****************************************/
|
||||
|
||||
case 'S': {
|
||||
Serial.println(F("Creating SERIAL TUBE"));
|
||||
while (1) {
|
||||
while (Serial.available()) {
|
||||
delay(1);
|
||||
fona.write(Serial.read());
|
||||
}
|
||||
if (fona.available()) {
|
||||
Serial.write(fona.read());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
Serial.println(F("Unknown command"));
|
||||
printMenu();
|
||||
break;
|
||||
}
|
||||
}
|
||||
// flush input
|
||||
flushSerial();
|
||||
while (fona.available()) {
|
||||
Serial.write(fona.read());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void flushSerial() {
|
||||
while (Serial.available())
|
||||
Serial.read();
|
||||
}
|
||||
|
||||
char readBlocking() {
|
||||
while (!Serial.available());
|
||||
return Serial.read();
|
||||
}
|
||||
uint16_t readnumber() {
|
||||
uint16_t x = 0;
|
||||
char c;
|
||||
while (! isdigit(c = readBlocking())) {
|
||||
//Serial.print(c);
|
||||
}
|
||||
Serial.print(c);
|
||||
x = c - '0';
|
||||
while (isdigit(c = readBlocking())) {
|
||||
Serial.print(c);
|
||||
x *= 10;
|
||||
x += c - '0';
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
|
||||
uint16_t buffidx = 0;
|
||||
boolean timeoutvalid = true;
|
||||
if (timeout == 0) timeoutvalid = false;
|
||||
|
||||
while (true) {
|
||||
if (buffidx > maxbuff) {
|
||||
//Serial.println(F("SPACE"));
|
||||
break;
|
||||
}
|
||||
|
||||
while (Serial.available()) {
|
||||
char c = Serial.read();
|
||||
|
||||
//Serial.print(c, HEX); Serial.print("#"); Serial.println(c);
|
||||
|
||||
if (c == '\r') continue;
|
||||
if (c == 0xA) {
|
||||
if (buffidx == 0) // the first 0x0A is ignored
|
||||
continue;
|
||||
|
||||
timeout = 0; // the second 0x0A is the end of the line
|
||||
timeoutvalid = true;
|
||||
break;
|
||||
}
|
||||
buff[buffidx] = c;
|
||||
buffidx++;
|
||||
}
|
||||
|
||||
if (timeoutvalid && timeout == 0) {
|
||||
//Serial.println(F("TIMEOUT"));
|
||||
break;
|
||||
}
|
||||
delay(1);
|
||||
}
|
||||
buff[buffidx] = 0; // null term
|
||||
return buffidx;
|
||||
}
|
112
libraries/Adafruit_FONA_Library/examples/GPS/GPS.ino
Normal file
112
libraries/Adafruit_FONA_Library/examples/GPS/GPS.ino
Normal file
|
@ -0,0 +1,112 @@
|
|||
/**
|
||||
* ___ ___ _ _ _ ___ __ ___ ___ ___ ___
|
||||
* | __/ _ \| \| | /_\ ( _ )/ \( _ ) / __| _ \/ __|
|
||||
* | _| (_) | .` |/ _ \ / _ \ () / _ \ | (_ | _/\__ \
|
||||
* |_| \___/|_|\_/_/ \_\ \___/\__/\___/ \___|_| |___/
|
||||
*
|
||||
* This example is meant to work with the Adafruit
|
||||
* FONA 808 or 3G Shield or Breakout
|
||||
*
|
||||
* Copyright: 2015 Adafruit
|
||||
* Author: Todd Treece
|
||||
* Licence: MIT
|
||||
*
|
||||
*/
|
||||
#include "Adafruit_FONA.h"
|
||||
|
||||
// standard pins for the shield, adjust as necessary
|
||||
#define FONA_RX 2
|
||||
#define FONA_TX 3
|
||||
#define FONA_RST 4
|
||||
|
||||
// We default to using software serial. If you want to use hardware serial
|
||||
// (because softserial isnt supported) comment out the following three lines
|
||||
// and uncomment the HardwareSerial line
|
||||
#include <SoftwareSerial.h>
|
||||
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
|
||||
SoftwareSerial *fonaSerial = &fonaSS;
|
||||
|
||||
// Hardware serial is also possible!
|
||||
// HardwareSerial *fonaSerial = &Serial1;
|
||||
|
||||
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
|
||||
|
||||
// Have a FONA 3G? use this object type instead
|
||||
//Adafruit_FONA_3G fona = Adafruit_FONA_3G(FONA_RST);
|
||||
|
||||
|
||||
void setup() {
|
||||
|
||||
while (! Serial);
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Adafruit FONA 808 & 3G GPS demo"));
|
||||
Serial.println(F("Initializing FONA... (May take a few seconds)"));
|
||||
|
||||
fonaSerial->begin(4800);
|
||||
if (! fona.begin(*fonaSerial)) {
|
||||
Serial.println(F("Couldn't find FONA"));
|
||||
while(1);
|
||||
}
|
||||
Serial.println(F("FONA is OK"));
|
||||
// Try to enable GPRS
|
||||
|
||||
|
||||
Serial.println(F("Enabling GPS..."));
|
||||
fona.enableGPS(true);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
delay(2000);
|
||||
|
||||
float latitude, longitude, speed_kph, heading, speed_mph, altitude;
|
||||
|
||||
// if you ask for an altitude reading, getGPS will return false if there isn't a 3D fix
|
||||
boolean gps_success = fona.getGPS(&latitude, &longitude, &speed_kph, &heading, &altitude);
|
||||
|
||||
if (gps_success) {
|
||||
|
||||
Serial.print("GPS lat:");
|
||||
Serial.println(latitude, 6);
|
||||
Serial.print("GPS long:");
|
||||
Serial.println(longitude, 6);
|
||||
Serial.print("GPS speed KPH:");
|
||||
Serial.println(speed_kph);
|
||||
Serial.print("GPS speed MPH:");
|
||||
speed_mph = speed_kph * 0.621371192;
|
||||
Serial.println(speed_mph);
|
||||
Serial.print("GPS heading:");
|
||||
Serial.println(heading);
|
||||
Serial.print("GPS altitude:");
|
||||
Serial.println(altitude);
|
||||
|
||||
} else {
|
||||
Serial.println("Waiting for FONA GPS 3D fix...");
|
||||
}
|
||||
|
||||
// Fona 3G doesnt have GPRSlocation :/
|
||||
if ((fona.type() == FONA3G_A) || (fona.type() == FONA3G_E))
|
||||
return;
|
||||
// Check for network, then GPRS
|
||||
Serial.println(F("Checking for Cell network..."));
|
||||
if (fona.getNetworkStatus() == 1) {
|
||||
// network & GPRS? Great! Print out the GSM location to compare
|
||||
boolean gsmloc_success = fona.getGSMLoc(&latitude, &longitude);
|
||||
|
||||
if (gsmloc_success) {
|
||||
Serial.print("GSMLoc lat:");
|
||||
Serial.println(latitude, 6);
|
||||
Serial.print("GSMLoc long:");
|
||||
Serial.println(longitude, 6);
|
||||
} else {
|
||||
Serial.println("GSM location failed...");
|
||||
Serial.println(F("Disabling GPRS"));
|
||||
fona.enableGPRS(false);
|
||||
Serial.println(F("Enabling GPRS"));
|
||||
if (!fona.enableGPRS(true)) {
|
||||
Serial.println(F("Failed to turn GPRS on"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
// FONA Incoming Call Number Example
|
||||
// Listens for a call and displays the phone number of the caller (if available).
|
||||
// Use this example to add phone call detection to your own FONA sketch.
|
||||
#include "Adafruit_FONA.h"
|
||||
|
||||
// Pins which are connected to the FONA.
|
||||
// Note that this is different from FONAtest!
|
||||
#define FONA_RX 3
|
||||
#define FONA_TX 4
|
||||
#define FONA_RST 5
|
||||
|
||||
// Note you need to map interrupt number to pin number
|
||||
// for your board. On an Uno & Mega interrupt 0 is
|
||||
// digital pin 2, and on a Leonardo interrupt 0 is
|
||||
// digital pin 3. See this page for a complete table:
|
||||
// http://arduino.cc/en/Reference/attachInterrupt
|
||||
// Make sure this interrupt pin is connected to FONA RI!
|
||||
#define FONA_RI_INTERRUPT 0
|
||||
|
||||
// We default to using software serial. If you want to use hardware serial
|
||||
// (because softserial isnt supported) comment out the following three lines
|
||||
// and uncomment the HardwareSerial line
|
||||
#include <SoftwareSerial.h>
|
||||
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
|
||||
SoftwareSerial *fonaSerial = &fonaSS;
|
||||
|
||||
// Hardware serial is also possible!
|
||||
// HardwareSerial *fonaSerial = &Serial1;
|
||||
|
||||
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("FONA incoming call example"));
|
||||
Serial.println(F("Initializing....(May take 3 seconds)"));
|
||||
|
||||
fonaSerial->begin(4800);
|
||||
if (! fona.begin(*fonaSerial)) {
|
||||
Serial.println(F("Couldn't find FONA"));
|
||||
while(1);
|
||||
}
|
||||
Serial.println(F("FONA is OK"));
|
||||
|
||||
// Enable incoming call notification.
|
||||
if(fona.callerIdNotification(true, FONA_RI_INTERRUPT)) {
|
||||
Serial.println(F("Caller id notification enabled."));
|
||||
}
|
||||
else {
|
||||
Serial.println(F("Caller id notification disabled"));
|
||||
}
|
||||
}
|
||||
|
||||
void loop(){
|
||||
// Create a small string buffer to hold incoming call number.
|
||||
char phone[32] = {0};
|
||||
// Check for an incoming call. Will return true if a call is incoming.
|
||||
if(fona.incomingCallNumber(phone)){
|
||||
Serial.println(F("RING!"));
|
||||
Serial.print(F("Phone Number: "));
|
||||
Serial.println(phone);
|
||||
}
|
||||
}
|
34
libraries/Adafruit_FONA_Library/includes/FONAConfig.h
Normal file
34
libraries/Adafruit_FONA_Library/includes/FONAConfig.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* FONAConfig.h -- compile-time configuration
|
||||
* This is part of the library for the Adafruit FONA Cellular Module
|
||||
*
|
||||
* Designed specifically to work with the Adafruit FONA
|
||||
* ----> https://www.adafruit.com/products/1946
|
||||
* ----> https://www.adafruit.com/products/1963
|
||||
* ----> http://www.adafruit.com/products/2468
|
||||
* ----> http://www.adafruit.com/products/2542
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Written by Pat Deegan, http://flyingcarsandstuff.com, for inclusion in
|
||||
* the Adafruit_FONA_Library and released under the
|
||||
* BSD license, all text above must be included in any redistribution.
|
||||
*
|
||||
* Created on: Jan 16, 2016
|
||||
* Author: Pat Deegan
|
||||
*/
|
||||
|
||||
#ifndef ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_FONACONFIG_H_
|
||||
#define ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_FONACONFIG_H_
|
||||
|
||||
/* ADAFRUIT_FONA_DEBUG
|
||||
* When defined, will cause extensive debug output on the
|
||||
* DebugStream set in the appropriate platform/ header.
|
||||
*/
|
||||
|
||||
#define ADAFRUIT_FONA_DEBUG
|
||||
|
||||
|
||||
#endif /* ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_FONACONFIG_H_ */
|
33
libraries/Adafruit_FONA_Library/includes/FONAExtIncludes.h
Normal file
33
libraries/Adafruit_FONA_Library/includes/FONAExtIncludes.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* FONAExtIncludes.h -- system-wide includes
|
||||
* This is part of the library for the Adafruit FONA Cellular Module
|
||||
*
|
||||
* Designed specifically to work with the Adafruit FONA
|
||||
* ----> https://www.adafruit.com/products/1946
|
||||
* ----> https://www.adafruit.com/products/1963
|
||||
* ----> http://www.adafruit.com/products/2468
|
||||
* ----> http://www.adafruit.com/products/2542
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Written by Pat Deegan, http://flyingcarsandstuff.com, for inclusion in
|
||||
* the Adafruit_FONA_Library and released under the
|
||||
* BSD license, all text above must be included in any redistribution.
|
||||
*
|
||||
* Created on: Jan 16, 2016
|
||||
* Author: Pat Deegan
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_FONAEXTINCLUDES_H_
|
||||
#define ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_FONAEXTINCLUDES_H_
|
||||
|
||||
|
||||
#include "FONAConfig.h"
|
||||
// include any system-wide includes required here
|
||||
|
||||
|
||||
|
||||
#endif /* ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_FONAEXTINCLUDES_H_ */
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* FONAPlatStd.h -- standard AVR/Arduino platform.
|
||||
*
|
||||
* This is part of the library for the Adafruit FONA Cellular Module
|
||||
*
|
||||
* Designed specifically to work with the Adafruit FONA
|
||||
* ----> https://www.adafruit.com/products/1946
|
||||
* ----> https://www.adafruit.com/products/1963
|
||||
* ----> http://www.adafruit.com/products/2468
|
||||
* ----> http://www.adafruit.com/products/2542
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Written by Pat Deegan, http://flyingcarsandstuff.com, for inclusion in
|
||||
* the Adafruit_FONA_Library and released under the
|
||||
* BSD license, all text above must be included in any redistribution.
|
||||
*
|
||||
* Created on: Jan 16, 2016
|
||||
* Author: Pat Deegan
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_PLATFORM_FONAPLATSTD_H_
|
||||
#define ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_PLATFORM_FONAPLATSTD_H_
|
||||
|
||||
#include "../FONAConfig.h"
|
||||
|
||||
|
||||
#if (ARDUINO >= 100)
|
||||
#include "Arduino.h"
|
||||
#if !defined(__SAM3X8E__) && !defined(ARDUINO_ARCH_SAMD) // Arduino Due doesn't support #include <SoftwareSerial.h>
|
||||
#endif
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#include <NewSoftSerial.h>
|
||||
#endif
|
||||
|
||||
#if (defined(__AVR__))
|
||||
#include <avr/pgmspace.h>
|
||||
#elif (defined(ESP8266))
|
||||
#include <pgmspace.h>
|
||||
#endif
|
||||
|
||||
// DebugStream sets the Stream output to use
|
||||
// for debug (only applies when ADAFRUIT_FONA_DEBUG
|
||||
// is defined in config)
|
||||
#define DebugStream Serial
|
||||
|
||||
#ifdef ADAFRUIT_FONA_DEBUG
|
||||
// need to do some debugging...
|
||||
#define DEBUG_PRINT(...) DebugStream.print(__VA_ARGS__)
|
||||
#define DEBUG_PRINTLN(...) DebugStream.println(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
// a few typedefs to keep things portable
|
||||
typedef Stream FONAStreamType;
|
||||
typedef const __FlashStringHelper * FONAFlashStringPtr;
|
||||
|
||||
#define prog_char char PROGMEM
|
||||
|
||||
#define prog_char_strcmp(a, b) strcmp_P((a), (b))
|
||||
// define prog_char_strncmp(a, b, c) strncmp_P((a), (b), (c))
|
||||
#define prog_char_strstr(a, b) strstr_P((a), (b))
|
||||
#define prog_char_strlen(a) strlen_P((a))
|
||||
#define prog_char_strcpy(to, fromprogmem) strcpy_P((to), (fromprogmem))
|
||||
//define prog_char_strncpy(to, from, len) strncpy_P((to), (fromprogmem), (len))
|
||||
|
||||
#endif /* ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_PLATFORM_FONAPLATSTD_H_ */
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* FONAPlatform.h -- platform definitions includes.
|
||||
*
|
||||
* This is part of the library for the Adafruit FONA Cellular Module
|
||||
*
|
||||
* Designed specifically to work with the Adafruit FONA
|
||||
* ----> https://www.adafruit.com/products/1946
|
||||
* ----> https://www.adafruit.com/products/1963
|
||||
* ----> http://www.adafruit.com/products/2468
|
||||
* ----> http://www.adafruit.com/products/2542
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Written by Pat Deegan, http://flyingcarsandstuff.com, for inclusion in
|
||||
* the Adafruit_FONA_Library and released under the
|
||||
* BSD license, all text above must be included in any redistribution.
|
||||
*
|
||||
* Created on: Jan 16, 2016
|
||||
* Author: Pat Deegan
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_PLATFORM_FONAPLATFORM_H_
|
||||
#define ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_PLATFORM_FONAPLATFORM_H_
|
||||
|
||||
#include "../FONAConfig.h"
|
||||
|
||||
// only "standard" config supported in this release -- namely AVR-based arduino type affairs
|
||||
#include "FONAPlatStd.h"
|
||||
|
||||
|
||||
|
||||
#ifndef DEBUG_PRINT
|
||||
// debug is disabled
|
||||
|
||||
#define DEBUG_PRINT(...)
|
||||
#define DEBUG_PRINTLN(...)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef prog_char_strcmp
|
||||
#define prog_char_strcmp(a, b) strcmp((a), (b))
|
||||
#endif
|
||||
|
||||
#ifndef prog_char_strstr
|
||||
#define prog_char_strstr(a, b) strstr((a), (b))
|
||||
#endif
|
||||
|
||||
#ifndef prog_char_strlen
|
||||
#define prog_char_strlen(a) strlen((a))
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef prog_char_strcpy
|
||||
#define prog_char_strcpy(to, fromprogmem) strcpy((to), (fromprogmem))
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* ADAFRUIT_FONA_LIBRARY_SRC_INCLUDES_PLATFORM_FONAPLATFORM_H_ */
|
9
libraries/Adafruit_FONA_Library/library.properties
Normal file
9
libraries/Adafruit_FONA_Library/library.properties
Normal file
|
@ -0,0 +1,9 @@
|
|||
name=Adafruit FONA Library
|
||||
version=1.3.5
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=Arduino library for the Adafruit FONA
|
||||
paragraph=Arduino library for the Adafruit FONA
|
||||
category=Communication
|
||||
url=https://github.com/adafruit/Adafruit_FONA
|
||||
architectures=*
|
Loading…
Add table
Add a link
Reference in a new issue