Created
October 12, 2019 18:16
-
-
Save nr23730/ac619a17ad14c8336ceac888988b902a to your computer and use it in GitHub Desktop.
MLO-GPT-M1S.ino mit Reconnect nach Verbindungsverlust
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
#include <ModuleSerialCore.h> | |
#include <ModuleSerialGprs.h> | |
#include <ModuleSerialGps.h> | |
#define SIM_APN "web.vodafone.de" | |
#define SIM_APN_USERNAME "" | |
#define SIM_APN_PASSWORD "" | |
String MLO_USERNAME = "Organisation"; | |
String MLO_TID = "tid"; | |
#define PIN_RX 2 | |
#define PIN_TX 3 | |
#define PIN_START_SIM808 9 | |
#define LED 13 | |
#define PIN_STATUS_GPRS 4 | |
#define PIN_STATUS_GPS 5 | |
#define PIN_STATUS_SEND 6 | |
float radius_of_earth = 6378.1; // km | |
const float REF_VOLTAGE = 3.7; | |
unsigned long previousMillis = 0; | |
const long INTERVALL_SEND = 60000; | |
const bool OnlineDebugMode = true; | |
const bool SerialDebugMode = true; | |
const bool DistanceCheck = false; | |
float last_lat = 0; | |
float last_long = 0; | |
ModuleSerialCore core(PIN_RX, PIN_TX); // Begin a SoftwareSerial connection on rx and tx pins. | |
ModuleSerialGprs gprs(&core); // Pass a reference to the core. | |
ModuleSerialGps gps(&core); // Pass a reference to the core. | |
double distance_in_m(float start_lat, float start_long, float end_lat, float end_long) { | |
// / 180 / PI converts degrees to radians | |
start_lat/= 180 / PI; | |
start_long/= 180 / PI; | |
end_lat/= 180 / PI; | |
end_long/= 180 / PI; | |
// haversine formula - based on implementation at http://www.movable-type.co.uk/scripts/latlong.html | |
float a = pow(sin((end_lat-start_lat)/2), 2) + cos(start_lat) * cos(end_lat) * pow(sin((end_long-start_long)/2), 2); | |
float answer = radius_of_earth * 2 * atan2(sqrt(a), sqrt(1-a)); | |
answer = answer * 1000; | |
return double(answer); | |
} | |
void setup() | |
{ | |
Serial.begin(9600); | |
while (!Serial); | |
Serial.println(F("Initializing...")); | |
pinMode(PIN_STATUS_GPRS, OUTPUT); | |
pinMode(PIN_STATUS_GPS, OUTPUT); | |
pinMode(PIN_STATUS_SEND, OUTPUT); | |
pinMode(PIN_START_SIM808, OUTPUT); | |
pinMode(LED, OUTPUT); | |
digitalWrite(PIN_STATUS_GPRS, LOW); | |
digitalWrite(PIN_STATUS_GPS, LOW); | |
digitalWrite(PIN_STATUS_SEND, LOW); | |
digitalWrite(PIN_START_SIM808, LOW); | |
digitalWrite(LED, HIGH); | |
digitalWrite(PIN_STATUS_SEND, HIGH); | |
digitalWrite(PIN_START_SIM808, HIGH); | |
delay(3000); | |
digitalWrite(PIN_START_SIM808, LOW); | |
digitalWrite(PIN_STATUS_SEND, LOW); | |
digitalWrite(LED, LOW); | |
bool notConnected = true; | |
while (notConnected) | |
{ | |
core.debug(&Serial); // Pass a reference to HardwareSerial if you want debugging printed to the Serial Monitor. | |
if (core.begin(4800) == MODULE_READY && gprs.enable(SIM_APN, SIM_APN_USERNAME, SIM_APN_PASSWORD) == GPRS_ENABLED) | |
{ | |
notConnected = false; | |
} | |
else | |
{ | |
Serial.println(F("Failed to connect.")); | |
delay(1000); | |
} | |
} | |
digitalWrite(PIN_STATUS_GPRS, HIGH); | |
notConnected = true; | |
while (notConnected) | |
{ | |
if ( gps.enable() == GPS_ENABLED) | |
{ | |
notConnected = false; | |
Serial.println(F("Connected to GPS")); | |
} | |
else | |
{ | |
Serial.println(F("Failed to connect.")); | |
delay(1000); | |
} | |
} | |
digitalWrite(PIN_STATUS_GPS, HIGH); | |
} | |
bool CanSend(float Distance) { | |
bool SendPosition = false; | |
if ( Distance > 15 ) { | |
SendPosition = true; | |
} | |
if ( DistanceCheck == false ) { | |
SendPosition = true; | |
} | |
return SendPosition; | |
} | |
void SendPosition(float posLat, float posLong, int SatCount ) { | |
posLat = convertDegMinToDecDeg(posLat); | |
posLong = convertDegMinToDecDeg(posLong); | |
if ( posLat != 0.0 && posLong != 0.0 ) { | |
double d = distance_in_m(posLat, posLong, last_lat, last_long); | |
float Distance = (float)d; | |
if ( CanSend(Distance) == true ) { | |
String StringUrl = "http://api.mobile-lagekarte.de/InsertData.php?id="+String(MLO_TID)+"&lat="+String(posLat, 6)+"&long="+String(posLong, 6)+"&orga="+String(MLO_USERNAME);//+"&dis="+String(Distance);//+"&v="+VoltageString | |
char *url = StringUrl.c_str(); | |
gprs.openHttpConnection(); | |
ModuleSerialGprs::HttpResponse httpResponse = gprs.sendHttpRequest(HTTP_GET, url, 6000); // Method, url and timeout in milliseconds. | |
if (httpResponse.statusCode == 200) | |
{ | |
Serial.println(F("Request success!")); | |
char response[500] = ""; | |
int length = httpResponse.contentLength + 50 > 500 ? 450 : httpResponse.contentLength; // Read the first 450 characters of the response. | |
gprs.readHttpResponse(length, response, 500); | |
Serial.println(response); | |
last_lat = posLat; | |
last_long = posLong; | |
} | |
else | |
{ | |
Serial.println(F("Request failed.")); | |
} | |
gprs.closeHttpConnection(); | |
} | |
else | |
{ | |
Serial.println("Distance too small, no api call"); | |
} | |
} | |
else | |
{ | |
if ( OnlineDebugMode ) { | |
String Message = "";//"GPS:NoPosition,GPSInfo:SatCount:" + String(SatCount) + ""; | |
//LogTransponderMessage( Message ); | |
} | |
} | |
} | |
void LogTransponderMessage( String Message ) { | |
String StringUrl = ""; | |
StringUrl += "http://k-medien.net/api/LogTransponderMessage?id=at1&orga=Matze&message=test"; | |
StringUrl += Message; | |
char *url = StringUrl.c_str(); | |
gprs.openHttpConnection(); | |
ModuleSerialGprs::HttpResponse httpResponse = gprs.sendHttpRequest(HTTP_GET, url, 6000); // Method, url and timeout in milliseconds. | |
if (httpResponse.statusCode == 200) | |
{ | |
Serial.println(F("Request success!")); | |
char response[500] = ""; | |
int length = httpResponse.contentLength + 50 > 500 ? 450 : httpResponse.contentLength; // Read the first 450 characters of the response. | |
gprs.readHttpResponse(length, response, 500); | |
Serial.println(response); | |
} | |
else | |
{ | |
Serial.println(F("Request failed.")); | |
} | |
gprs.closeHttpConnection(); | |
} | |
double convertDegMinToDecDeg (float degMin) { | |
double min = 0.0; | |
double decDeg = 0.0; | |
//get the minutes, fmod() requires double | |
min = fmod((double)degMin, 100.0); | |
//rebuild coordinates in decimal degrees | |
degMin = (int) ( degMin / 100 ); | |
decDeg = degMin + ( min / 60 ); | |
return decDeg; | |
} | |
void loop() | |
{ | |
unsigned long currentMillis = millis(); | |
if (currentMillis - previousMillis >= INTERVALL_SEND) | |
{ | |
previousMillis = currentMillis; | |
if (core.isReady() == MODULE_FAIL || gprs.isReady() == GPRS_FAIL) | |
{ | |
setup(); | |
return; | |
} | |
ModuleSerialGps::GpsData gpsData = gps.currentGpsData(); | |
Serial.println(F("\nCurrent GPS data: ")); | |
Serial.print("GPS: lat="); | |
Serial.print(gpsData.lat); | |
Serial.print(" / lng="); | |
Serial.print(gpsData.lng); | |
Serial.print(" / sat="); | |
Serial.println(gpsData.sat); | |
digitalWrite(PIN_STATUS_SEND, HIGH); | |
SendPosition(gpsData.lng, gpsData.lat, gpsData.sat ); | |
digitalWrite(PIN_STATUS_SEND, LOW); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment