-
Notifications
You must be signed in to change notification settings - Fork 56
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added SendLocationFromSMS_Use_TinyGPS example #118
- Loading branch information
Showing
3 changed files
with
493 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
250 changes: 250 additions & 0 deletions
250
examples/SendLocationFromSMS_Use_TinyGPS/SendLocationFromSMS_Use_TinyGPS.ino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,250 @@ | ||
/** | ||
* @file SendLocationFromSMS_Use_TinyGPS.ino | ||
* @author Lewis He (lewishe@outlook.com) | ||
* @license MIT | ||
* @copyright Copyright (c) 2024 Shenzhen Xin Yuan Electronic Technology Co., Ltd | ||
* @date 2024-08-30 | ||
* @note SIM7670G does not support SMS and voice functions | ||
*/ | ||
|
||
#include "utilities.h" | ||
|
||
|
||
// Define the serial console for debug prints, if needed | ||
#define TINY_GSM_DEBUG SerialMon | ||
|
||
// Set serial for debug console (to the Serial Monitor, default speed 115200) | ||
#define SerialMon Serial | ||
|
||
// See all AT commands, if wanted | ||
// #define DUMP_AT_COMMANDS | ||
|
||
|
||
#include <TinyGsmClient.h> | ||
|
||
#ifdef DUMP_AT_COMMANDS // if enabled it requires the streamDebugger lib | ||
#include <StreamDebugger.h> | ||
StreamDebugger debugger(SerialAT, SerialMon); | ||
TinyGsm modem(debugger); | ||
#else | ||
TinyGsm modem(SerialAT); | ||
#endif | ||
|
||
|
||
#include <TinyGPSPlus.h> | ||
TinyGPSPlus gps; | ||
|
||
uint32_t last_check = 0; | ||
|
||
// It depends on the operator whether to set up an APN. If some operators do not set up an APN, | ||
// they will be rejected when registering for the network. You need to ask the local operator for the specific APN. | ||
// APNs from other operators are welcome to submit PRs for filling. | ||
// #define NETWORK_APN "CHN-CT" //CHN-CT: China Telecom | ||
|
||
|
||
#define SMS_TARGET "+86xxxxxxxxxx" //Change the number you want to send sms message | ||
|
||
|
||
|
||
void light_sleep(uint32_t ms) | ||
{ | ||
esp_sleep_enable_timer_wakeup(ms * 1000); | ||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); | ||
esp_light_sleep_start(); | ||
} | ||
|
||
void deep_sleep(uint32_t ms) | ||
{ | ||
esp_sleep_enable_timer_wakeup(ms * 1000); | ||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); | ||
esp_deep_sleep_start(); | ||
} | ||
|
||
void smartDelay(unsigned long ms) | ||
{ | ||
int ch = 0; | ||
unsigned long start = millis(); | ||
do { | ||
while (SerialAT.available()) { | ||
ch = SerialAT.read(); | ||
Serial.write(ch); | ||
gps.encode(ch); | ||
} | ||
} while (millis() - start < ms); | ||
} | ||
|
||
|
||
|
||
bool loopGPS() | ||
{ | ||
smartDelay(1000); | ||
|
||
if ((gps.charsProcessed() < 50) && ((millis() - last_check) > 10000UL)) { | ||
Serial.println("ERROR:GPS NO DATA!"); delay(1000); | ||
} | ||
|
||
if (gps.date.isValid() && gps.location.isValid() && gps.time.isValid()) { | ||
if (gps.date.year() > 2000) { | ||
|
||
Serial.println("The location was obtained successfully, and GPS positioning was turned off."); | ||
/* | ||
* After obtaining the geographic location, | ||
* turn off NMEA sentence output, otherwise it will affect AT interaction | ||
* */ | ||
modem.disableNMEA(); | ||
|
||
// Turn Off GPS | ||
modem.disableGPS(); | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
|
||
void setup() | ||
{ | ||
Serial.begin(115200); | ||
// Turn on DC boost to power on the modem | ||
#ifdef BOARD_POWERON_PIN | ||
pinMode(BOARD_POWERON_PIN, OUTPUT); | ||
digitalWrite(BOARD_POWERON_PIN, HIGH); | ||
#endif | ||
|
||
// Set modem reset pin ,reset modem | ||
pinMode(MODEM_RESET_PIN, OUTPUT); | ||
digitalWrite(MODEM_RESET_PIN, !MODEM_RESET_LEVEL); delay(100); | ||
digitalWrite(MODEM_RESET_PIN, MODEM_RESET_LEVEL); delay(2600); | ||
digitalWrite(MODEM_RESET_PIN, !MODEM_RESET_LEVEL); | ||
|
||
// Turn on modem | ||
pinMode(BOARD_PWRKEY_PIN, OUTPUT); | ||
digitalWrite(BOARD_PWRKEY_PIN, LOW); | ||
delay(100); | ||
digitalWrite(BOARD_PWRKEY_PIN, HIGH); | ||
delay(1000); | ||
digitalWrite(BOARD_PWRKEY_PIN, LOW); | ||
|
||
// Set ring pin input | ||
pinMode(MODEM_RING_PIN, INPUT_PULLUP); | ||
|
||
// Set modem baud | ||
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX_PIN, MODEM_TX_PIN); | ||
|
||
Serial.println("Start modem..."); | ||
delay(3000); | ||
|
||
while (!modem.testAT()) { | ||
delay(10); | ||
} | ||
|
||
|
||
#ifdef NETWORK_APN | ||
Serial.printf("Set network apn : %s\n", NETWORK_APN); | ||
modem.sendAT(GF("+CGDCONT=1,\"IP\",\""), NETWORK_APN, "\""); | ||
if (modem.waitResponse() != 1) { | ||
Serial.println("Set network apn error !"); | ||
} | ||
#endif | ||
|
||
// Check network registration status and network signal status | ||
int16_t sq ; | ||
Serial.print("Wait for the modem to register with the network."); | ||
RegStatus status = REG_NO_RESULT; | ||
while (status == REG_NO_RESULT || status == REG_SEARCHING || status == REG_UNREGISTERED) { | ||
status = modem.getRegistrationStatus(); | ||
switch (status) { | ||
case REG_UNREGISTERED: | ||
case REG_SEARCHING: | ||
sq = modem.getSignalQuality(); | ||
Serial.printf("[%lu] Signal Quality:%d\n", millis() / 1000, sq); | ||
delay(1000); | ||
break; | ||
case REG_DENIED: | ||
Serial.println("Network registration was rejected, please check if the APN is correct"); | ||
return ; | ||
case REG_OK_HOME: | ||
Serial.println("Online registration successful"); | ||
break; | ||
case REG_OK_ROAMING: | ||
Serial.println("Network registration successful, currently in roaming mode"); | ||
break; | ||
default: | ||
Serial.printf("Registration Status:%d\n", status); | ||
delay(1000); | ||
break; | ||
} | ||
} | ||
Serial.println(); | ||
|
||
Serial.printf("Registration Status:%d\n", status); | ||
delay(1000); | ||
|
||
|
||
|
||
Serial.println("Enabling GPS/GNSS/GLONASS"); | ||
while (!modem.enableGPS(MODEM_GPS_ENABLE_GPIO)) { | ||
Serial.print("."); | ||
} | ||
Serial.println(); | ||
Serial.println("GPS Enabled"); | ||
|
||
|
||
/* | ||
* Enable GPS OUTPUT NMEA parse from TinyGPS Library | ||
* * */ | ||
modem.setGPSBaud(115200); | ||
modem.setGPSMode(3); //GPS + BD | ||
modem.configNMEASentence(1, 1, 1, 1, 1, 1); | ||
modem.setGPSOutputRate(1); | ||
modem.enableNMEA(); | ||
|
||
last_check = millis(); | ||
} | ||
|
||
|
||
void loop() | ||
{ | ||
if (loopGPS() == true) { | ||
|
||
Serial.printf("The location was obtained successfully and sent to the %s number.\n", SMS_TARGET); | ||
|
||
double lon2 = gps.location.lng(); | ||
double lat2 = gps.location.lat(); | ||
uint16_t year2 = gps.date.year(); | ||
uint8_t month2 = gps.date.month(); | ||
uint8_t day2 = gps.date.day(); | ||
uint8_t hour2 = gps.time.hour(); | ||
uint8_t min2 = gps.time.minute(); | ||
uint8_t sec2 = gps.time.second(); | ||
double speed = gps.speed.value(); | ||
|
||
String msg_str = "Longitude:" + String(lon2, 6) + " "; | ||
msg_str += "Latitude:" + String(lat2, 6) + "\n"; | ||
msg_str += "UTC Date:" + String(year2) + "/"; | ||
msg_str += String(month2) + "/"; | ||
msg_str += String(day2) + " \n"; | ||
msg_str += "UTC Time:" + String(hour2) + ":"; | ||
msg_str += String(min2) + ":"; | ||
msg_str += String(sec2); | ||
msg_str += "\n"; | ||
msg_str += "Speed:"; | ||
msg_str += String(speed); | ||
msg_str += "Km/H\n"; | ||
|
||
Serial.print("MESSAGE:"); Serial.println(msg_str); | ||
|
||
bool res = modem.sendSMS(SMS_TARGET, msg_str); | ||
Serial.print("Send sms message "); | ||
Serial.println(res ? "OK" : "fail"); | ||
|
||
// Wait print done | ||
delay(3000); | ||
|
||
// Deep sleep, wake up every 60 seconds for positioning | ||
deep_sleep(60 * 1000); //60 Second | ||
} | ||
|
||
// Light sleep, reducing the allowed power consumption | ||
light_sleep(5000); | ||
} |
Oops, something went wrong.