Positionsmeldung mit GPS und SMS (GPS/GSM SIM 808) - Teil 3 - AZ-Delivery

Dans la première partie de la série de blogs, nous avons demandé au lapin de Pâques de cacher les œufs de Pâques avec l'aide du GPS. Dans la deuxième partie, la recherche nous a ensuite mis au défi de déterminer d'abord notre position actuelle, puis de calculer le trajet et la distance jusqu'à la cible. J'espère que tout le monde s'est amusé. 

Avant que le récepteur GPS ne disparaisse dans le tiroir jusqu'à l'année prochaine, nous l'utiliserons pour un système de localisation, car le SIM 808 peut non seulement transmettre la position GPS via son interface COM au micro contrôleur, mais aussi l'envoyer sous forme de SMS via le système GSM intégré. En plus du matériel utilisé jusqu'à présent, nous avons seulement besoin d'une carte sim, qui peut provenir de pratiquement n'importe quel fournisseur sans protection par mot de passe et avec un crédit suffisant. Si possible, prenez une carte qui correspond à votre contrat de téléphonie mobile, car les SMS peuvent être gratuits ou du moins chers dans le même réseau ou chez le même fournisseur.

De quoi avons-nous besoin ? Quant aux deux premières parties :

Numéro Composant
1 Micro contrôleur, par exemple le MC compatible UNO R3
1 LCD, par exemple, le LCD-KeyPad-Shield
1 Module GPS / GSM SIM 808 (cette fois avec carte SIM)
Batterie ou pile rechargeable


Essentiellement, les deux sketches de ce blog sont basés sur la détermination de la position de la partie 1, augmentée de portions des deux exemples de sketches SIM808_SendSMS et SIM808_SMSread qui ont été installés lorsque la bibliothèque DFRobot_sim808.h a été incluse.

Il existe différentes approches pour notre tracker, chacune convenant aux différentes applications. Dans le premier cas, nous considérons le rapport de position régulier après un intervalle de temps fixe, alternativement le changement de la position par une certaine distance pourrait être possible, ainsi notre SIM 808 rapporte la position du camion toutes les heures ou tous les 100 km.  

Dans le deuxième cas, le rapport de position doit être orienté vers l'événement. Cela est tout d'abord possible en utilisant notre micro-contrôleur avec l'aide de capteurs, par exemple pour la position et l'accélération (accident ?) ou la mise en marche/arrêt de l'allumage du véhicule. Ou, deuxièmement, la position doit être envoyée à la demande, c'est-à-dire que nous envoyons un SMS de notre smartphone à la SIM 808, et recevons une réponse en quelques secondes (en supposant une connexion dans chaque cas).

Pour le premier cas, nous complétons le sketch de position avec des parties du sketch d'exemple SIM808_SendSMS. Les parties de SoftwareSerial et l'initialisation du SIM808 sont déjà présentes dans notre sketch de position. Concentrons-nous sur les lignes en gras:


#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
//Mobile phone number,need to change
#define PHONE_NUMBER "187*******39"
//The content of messages sent
#define MESSAGE "hello,world"
//#define PIN_TX 10
//#define PIN_RX 11
//SoftwareSerial mySerial(PIN_TX,PIN_RX);
//DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,
DFRobot_SIM808 sim808(&Serial);

void setup() {
  //mySerial.begin(9600);
  Serial.begin(9600);
  //******** Initialize sim808 module *************
  while(!sim808.init()) {
    delay(1000);
    Serial.print("Sim808 init error\r\n");
  }
  Serial.println("Sim808 init success");
  Serial.println("Start to send message ...");

  //******** define phone number and text **********
  sim808.sendSMS(PHONE_NUMBER,MESSAGE);
}

void loop() {
  //nothing to do
}
 

Nous devons donc entrer le numéro de téléphone PHONE_NUMBER de notre smartphone auquel le message doit être envoyé, définir le MESSAGE (voir aussi 2ème sketch) et copier la ligne avec la méthode sim808.sendSMS dans notre sketch. Les variables previousSMS et SMSinterval permettent de contrôler l'intervalle de temps pour les messages de position SMS réguliers.

Télécharger l'esquisse:


/*****************************************************************************
GPS mit LCD-Anzeige
basierend auf Bibliothek DFRobot_sim808 und Beispiel SIM808_GetGPS von jason.ling@dfrobot.com
Angepasst für UNO, Nano und kompatible MCUs und LCD1602 Keypad Shield
Offset für MEZ = 1 Stunde, ggf. anpassen für MESZ --> Offset=2
Uhrzeit und Tag werden kurz nach Mitternacht angepasst, jedoch Monat und Jahr nicht.

Anschlüsse:
TX des GPS verbinden mit A3 = GPIO 17 des LCD Keypad
RX des GPS verbinden mit A4 = GPIO 18 des LCD Keypad

Die Umlaute der Texte wurden durch die Escape-Sequenzen ersetzt.
lcd.print("\xE1"); // gibt ein ä aus
lcd.print("\xEF"); // gibt ein ö aus
lcd.print("\xF5"); // gibt ein ü aus
lcd.print("\xE2"); // gibt ein ß aus
lcd.print("\xDF"); // gibt ein ° aus
lcd.print("\x22"); // gibt ein " aus
lcd.print("\xE4"); // gibt ein µ aus
lcd.print("\xF4"); // gibt ein Ω aus
*****************************************************************************/
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#define PIN_TX 17
#define PIN_RX 18

//Mobile phone number, need to change
#define PHONE_NUMBER "0049_yourPhoneNumber"
char MESSAGE[160] = "";

SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial); //Connect RX,TX,PWR
//DFRobot_SIM808 sim808(&Serial);

// LCD has no I2C-Adapter, data transfer with Pins D4 to D7
#include <LiquidCrystal.h>
//LCD pin to Arduino
//const int pin_BL = 15;
const int pin_EN = 9;
const int pin_RS = 8;
const int pin_D4 = 4;
const int pin_D5 = 5;
const int pin_D6 = 6;
const int pin_D7 = 7;

LiquidCrystal lcd( pin_RS, pin_EN, pin_D4, pin_D5, pin_D6, pin_D7);

// Offset for Time, here UTC zu MEZ / MESZ
// Summertime MESZ: 2, Wintertime MEZ: 1
#define Offset 1

// unterbrechungsfreie Zeitsteuerung
unsigned long previousMillis = 0;
const long interval = 1000;
unsigned long previousSMS = 0;
const long SMSinterval = 300000;

// Buttons
int buttonInput = -1;
int buttonSelect = 0;

int YEAR = 2021;
int MONTH = 0;
int DAY = 0;
int DAYLCL = 0;
int HOUR = 0;
int HOURLCL = 0;
int MINUTE = 0;
int SECOND = 0;
float LAT = 0.0;
int LATDD = 0;
float LATMMmmmm = 0.0;
int LATMM = 0;
int LATDDWP = 0;
float LATMMmmmmWP = 0.0;
float LATSSs = 0.0;
float LON = 0.0;
int LONDDD = 0;
float LONMMmmmm = 0.0;
int LONMM = 0;
int LONDDWP = 0;
float LONMMmmmmWP = 0.0;
float LONSSs = 0.0;

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);
  lcd.begin(16,2); // initialize the lcd
  lcd.clear();
  lcd.setCursor(0,0); //Zählung beginnt bei Null, erst Zeichen, dann Zeile
  lcd.print("AZ-Delivery.com");
  lcd.setCursor(0,1); // 0=Erstes Zeichen, 1=zweite Zeile

//******** Initialize sim808 module *************
  while(!sim808.init()) {
    delay(1000);
    Serial.print("Sim808 init error\r\n");
  }

  //************* Turn on the GPS power************
  if( sim808.attachGPS())
    Serial.println("Open the GPS power success");
  else
    Serial.println("Open the GPS power failure");
}

void loop() {
  buttonInput = Button();
  switch (buttonInput) {
    case 0: Serial.println("0");buttonSelect=0; break;
    case 1: Serial.println("1");buttonSelect=1; break;
    case 2: Serial.println("2");buttonSelect=2; break;
    case 3: Serial.println("3");buttonSelect=3; break;
    case 4: Serial.println("4");buttonSelect=4; break;
    default: break;
  }



if (millis() - previousMillis >= interval) {
    //************** Get GPS data *******************
    if (sim808.getGPS()) {
    YEAR = 2021;
    MONTH = sim808.GPSdata.month;
    DAY = sim808.GPSdata.day;
    DAYLCL = DAY;
    HOUR = sim808.GPSdata.hour;
    HOURLCL = HOUR + Offset;
    MINUTE = sim808.GPSdata.minute;
    SECOND = sim808.GPSdata.second;
    if (HOURLCL>24) {
      HOURLCL = HOURLCL-24;
      DAYLCL = DAYLCL + 1; }
    Serial.print(sim808.GPSdata.year);
    Serial.print("/");
    Serial.print(MONTH);
    Serial.print("/");
    Serial.print(DAY);
    Serial.print(" ");
    Serial.print(HOUR);
    Serial.print(":");
    Serial.print(MINUTE);
    Serial.print(":");
    Serial.println(SECOND);
    LAT = sim808.GPSdata.lat;
    LATDD = int(LAT);
    LATMMmmmm = (LAT - LATDD)*100;
    LATMM = int(LATMMmmmm);
    LATSSs = (LATMMmmmm - LATMM)*60;
    LON = sim808.GPSdata.lon;
    LONDDD = int(LON);
    LONMMmmmm = (LON - LONDDD)*100;
    LONMM = int(LONMMmmmm);
    LONSSs = (LONMMmmmm - LONMM)*60;
    Serial.print("latitude: ");
    Serial.print(LATDD);
    Serial.print("°");
    Serial.print(LATMMmmmm,4);
    Serial.println("'N");
    Serial.print("longitude: ");
    if (LON<100.0) Serial.print("0");
    if (LON<10.0) Serial.print("0");
    Serial.print(LONDDD);
    Serial.print("°");
    Serial.print(LONMMmmmm,4);
    Serial.println("'E");
    //The content of messages sent
    sprintf(MESSAGE, "SIM 808 %02d.%02d.%4d,%02d:%02d,%02d.%02d.%02d N,%03d.%02d.%02d E",DAY,MONTH,YEAR,HOUR,MINUTE,LATDD,LATMM,int(LATSSs),LONDDD,LONMM,int(LATSSs));

    //******** define phone number and text **********

    if (millis()-previousSMS>SMSinterval) {
      Serial.print("uncomment for SMS");
      // sim808.sendSMS(PHONE_NUMBER,MESSAGE);
      previousSMS = millis();
    }
    else {
      Serial.println(MESSAGE);
    }

    if (buttonSelect==0) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(LATDD);
      lcd.print("\xDF");
      int LATMM = int(LATMMmmmm);
      float LATSSs = (LATMMmmmm-LATMM)*60;
      lcd.print(LATMM);
      lcd.print("'");
      lcd.print(LATSSs,1);
      lcd.print("\x22\ N");
      lcd.setCursor(0,1);
      if (LON<100.0) lcd.print("0");
      if (LON<10.0) lcd.print("0");
      lcd.print(LONDDD);
      lcd.print("\xDF");
      int LONMM = int(LONMMmmmm);
      float LONSSs = (LONMMmmmm-LONMM)*60;
      if (LONMM<10) lcd.print("0");
      lcd.print(LONMM);
      lcd.print("'");
      if (LONSSs<10.0) lcd.print("0");
      lcd.print(LONSSs,1);
      lcd.print("\x22\ E"); }

    else if (buttonSelect==1) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("EUR: ");
      if (DAYLCL<10) lcd.print("0");
      lcd.print(DAYLCL);
      lcd.print(".");
      if (MONTH<10) lcd.print("0");
      lcd.print(MONTH);
      lcd.print(".");
      lcd.print(sim808.GPSdata.year);
      lcd.setCursor(5,1);
      if (HOURLCL<10) lcd.print("0");
      lcd.print(HOURLCL);
      lcd.print(":");
      if (MINUTE<10) lcd.print("0");
      lcd.print(MINUTE);
      lcd.print(":");
      if (SECOND<10) lcd.print("0");
      lcd.print(SECOND);
    }
    else if (buttonSelect==2) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("UTC: ");
      lcd.print(sim808.GPSdata.year);
      lcd.print("/");
      if (MONTH<10) lcd.print("0");
      lcd.print(MONTH);
      lcd.print("/");
      if (DAY<10) lcd.print("0");
      lcd.print(DAY);
      lcd.setCursor(5,1);
      if (HOUR<10) lcd.print("0");
      lcd.print(HOUR);
      lcd.print(":");
      if (MINUTE<10) lcd.print("0");
      lcd.print(MINUTE);
      lcd.print(":");
      if (SECOND<10) lcd.print("0");
      lcd.print(SECOND);
    }
    else if (buttonSelect==3) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(LATDD);
      lcd.print("\xDF");
      lcd.print(LATMMmmmm,4);
      lcd.print("' N");
      lcd.setCursor(0,1);
      if (LON<100.0) lcd.print("0");
      if (LON<10.0) lcd.print("0");
      lcd.print(LONDDD);
      lcd.print("\xDF");
      if (LONMMmmmm<10.0) lcd.print("0");
      lcd.print(LONMMmmmm,4);
      lcd.print("' E"); }
      else if (buttonSelect==4) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("AZ-Delivery.com"); }
      //
      // //************* Turn off the GPS power ************
      // sim808.detachGPS();
      previousMillis = millis();
    }
  }
}


int Button() {
  int A0;
  // all buttons are connected to A0 via voltage divider
  // Values of ADC are between 0 and 1023
  // if necessary, values must be changed slightly
  A0 = analogRead(0); //
  if (A0 < 60) {
    return 0;
  }
  else if (A0 >= 60 && A0 < 250) {
    return 1;
  }
  else if (A0 >= 250 && A0 < 450){
    return 2;
  }
  else if (A0 >= 450 && A0 < 700){
    return 3;
  }
  else if (A0 >= 700 && A0 < 900){
    return 4;
  }
  else {
    return -1;
  }
} //end Button()

Dans le deuxième cas, nous devons mettre le SIM 808 en mode réception. Pour cela, nous utilisons les parties en gras de l'exemple de sketch SIM808_SMSread :


#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;
char phone[16];
char datetime[24];
//#define PIN_TX 10
//#define PIN_RX 11
//SoftwareSerial mySerial(PIN_TX,PIN_RX);
//DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,
DFRobot_SIM808 sim808(&Serial);

void setup() {
  //mySerial.begin(9600);
  Serial.begin(9600);
  //******** Initialize sim808 module *************
  while(!sim808.init()) {
    Serial.print("Sim808 init error\r\n");
    delay(1000);
  }
  delay(3000);
  Serial.println("Init Success, please send SMS message to me!");
}

void loop() {
  //*********** Detecting unread SMS ************************
  messageIndex = sim808.isSMSunread();
  Serial.print("messageIndex: ");
  Serial.println(messageIndex);

  //*********** At least, there is one UNREAD SMS ***********
  if (messageIndex > 0) {
    sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);

    //******In order not to full SIM Memory, is better to delete it*******
    sim808.deleteSMS(messageIndex);
    Serial.print("From number: ");
    Serial.println(phone);
    Serial.print("Datetime: ");
    Serial.println(datetime);
    Serial.print("Recieved Message: ");
    Serial.println(message);
  }
}

Contrairement à la première esquisse, nous n'envoyons pas le message de position à un numéro prédéfini, mais au numéro de téléphone, à partir duquel un SMS (message arbitraire) a été reçu comme déclencheur.

Petite déception : j'ai bien sûr essayé d'envoyer un code à quatre chiffres et d'en vérifier l'exactitude avant le SMS de réponse, mais comme indiqué dans le premier article de la série, la bibliothèque est très sensible au facteur temps et la requête supplémentaire if a fait avorter la transmission de la position GPS. Peut-être que vous pouvez le faire marcher ?

La ligne 163 m'a pris le plus de temps : composer le texte MESSAGE :

sprintf (message, "sim 808% 02d.% 02d.% 4d,% 02d:% 02d,% 02d.% 02d.% 02d n,% 03d.% ​​02d E", jour, mois, année, heure , Minute, LADD, LAMM, INT (LATSSS), Londdd, Lonmm, Int (LATSSSS));

Télécharger l'esquisse:

 /****************************************************************************
GPS mit LCD-Anzeige
basierend auf Bibliothek DFRobot_sim808 und Beispiel SIM808_GetGPS von jason.ling@dfrobot.com
Angepasst für UNO, Nano und kompatible MCUs und LCD1602 Keypad Shield
Offset für MEZ = 1 Stunde, ggf. anpassen für MESZ --> Offset=2
Uhrzeit und Tag werden kurz nach Mitternacht angepasst, jedoch Monat und Jahr nicht.

Anschlüsse:
TX des GPS verbinden mit A3 = GPIO 17 des LCD Keypad
RX des GPS verbinden mit A4 = GPIO 18 des LCD Keypad

Die Umlaute der Texte wurden durch die Escape-Sequenzen ersetzt.
lcd.print("\xE1"); // gibt ein ä aus
lcd.print("\xEF"); // gibt ein ö aus
lcd.print("\xF5"); // gibt ein ü aus
lcd.print("\xE2"); // gibt ein ß aus
lcd.print("\xDF"); // gibt ein ° aus
lcd.print("\x22"); // gibt ein " aus
lcd.print("\xE4"); // gibt ein µ aus
lcd.print("\xF4"); // gibt ein Ω aus
*****************************************************************************/
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#define PIN_TX 17
#define PIN_RX 18

#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH]; // incoming message
char MESSAGE[MESSAGE_LENGTH] = ""; // outgoing message
int messageIndex = 0;

char phone[16];
char datetime[24];

SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial); //Connect RX,TX,PWR
//DFRobot_SIM808 sim808(&Serial);

// LCD has no I2C-Adapter, data transfer with Pins D4 to D7
#include <LiquidCrystal.h>
//LCD pin to Arduino
//const int pin_BL = 15;
const int pin_EN = 9;
const int pin_RS = 8;
const int pin_D4 = 4;
const int pin_D5 = 5;
const int pin_D6 = 6;
const int pin_D7 = 7;

LiquidCrystal lcd( pin_RS, pin_EN, pin_D4, pin_D5, pin_D6, pin_D7);

// Offset for Time, here UTC zu MEZ / MESZ
// Summertime MESZ: 2, Wintertime MEZ: 1
#define Offset 1

// unterbrechungsfreie Zeitsteuerung
unsigned long previousMillis = 0;
const long interval = 1000;
unsigned long previousSMS = 0;
const long SMSinterval = 300000;

// Buttons
int buttonInput = -1;
int buttonSelect = 0;

int YEAR = 2021;
int MONTH = 0;
int DAY = 0;
int DAYLCL = 0;
int HOUR = 0;
int HOURLCL = 0;
int MINUTE = 0;
int SECOND = 0;
float LAT = 0.0;
int LATDD = 0;
float LATMMmmmm = 0.0;
int LATMM = 0;
int LATDDWP = 0;
float LATMMmmmmWP = 0.0;
float LATSSs = 0.0;
float LON = 0.0;
int LONDDD = 0;
float LONMMmmmm = 0.0;
int LONMM = 0;
int LONDDWP = 0;
float LONMMmmmmWP = 0.0;
float LONSSs = 0.0;



void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);
  lcd.begin(16,2); // initialize the lcd
  lcd.clear();
  lcd.setCursor(0,0); //Zählung beginnt bei Null, erst Zeichen, dann Zeile
  lcd.print("AZ-Delivery.com");
  lcd.setCursor(0,1); // 0=Erstes Zeichen, 1=zweite Zeile

  //******** Initialize sim808 module *************
  while(!sim808.init()) {
    delay(1000);
    Serial.print("Sim808 init error\r\n");
  }

  //************* Turn on the GPS power************
  if( sim808.attachGPS())
    Serial.println("Open the GPS power success");
  else
    Serial.println("Open the GPS power failure");
} //end setup()

void loop() {
  buttonInput = Button();
  switch (buttonInput) {
    case 0: Serial.println("0");buttonSelect=0; break;
    case 1: Serial.println("1");buttonSelect=1; break;
    case 2: Serial.println("2");buttonSelect=2; break;
    case 3: Serial.println("3");buttonSelect=3; break;
    case 4: Serial.println("4");buttonSelect=4; break;
    default: break;
  }

if (millis() - previousMillis >= interval) {
  //************** Get GPS data *******************
  if (sim808.getGPS()) {
    YEAR = 2021;
    MONTH = sim808.GPSdata.month;
    DAY = sim808.GPSdata.day;
    DAYLCL = DAY;
    HOUR = sim808.GPSdata.hour;
    HOURLCL = HOUR + Offset;
    MINUTE = sim808.GPSdata.minute;
    SECOND = sim808.GPSdata.second;
    if (HOURLCL>24) {
      HOURLCL = HOURLCL-24;
      DAYLCL = DAYLCL + 1; }
    Serial.print(sim808.GPSdata.year);
    Serial.print("/");
    Serial.print(MONTH);
    Serial.print("/");
    Serial.print(DAY);
    Serial.print(" ");
    Serial.print(HOUR);
    Serial.print(":");
    Serial.print(MINUTE);
    Serial.print(":");
    Serial.println(SECOND);
    LAT = sim808.GPSdata.lat;
    LATDD = int(LAT);
    LATMMmmmm = (LAT - LATDD)*100;
    LATMM = int(LATMMmmmm);
    LATSSs = (LATMMmmmm - LATMM)*60;
    LON = sim808.GPSdata.lon;
    LONDDD = int(LON);
    LONMMmmmm = (LON - LONDDD)*100;
    LONMM = int(LONMMmmmm);
    LONSSs = (LONMMmmmm - LONMM)*60;
    Serial.print("latitude: ");
    Serial.print(LATDD);
    Serial.print("°");
    Serial.print(LATMMmmmm,4);
    Serial.println("'N");
    Serial.print("longitude: ");
    if (LON<100.0) Serial.print("0");
    if (LON<10.0) Serial.print("0");
    Serial.print(LONDDD);
    Serial.print("°");
    Serial.print(LONMMmmmm,4);
    Serial.println("'E");
    //The content of messages sent
    sprintf(MESSAGE, "SIM 808 %02d.%02d.%4d,%02d:%02d,%02d.%02d.%02d N,%03d.%02d.%02d E",DAY,MONTH,YEAR,HOUR,MINUTE,LATDD,LATMM,int(LATSSs),LONDDD,LONMM,int(LATSSs));

    //******** define phone number and text **********
    //*********** Detecting unread SMS ************************
    messageIndex = sim808.isSMSunread();
    Serial.print("messageIndex: ");
    Serial.println(messageIndex);

    //*********** At least, there is one UNREAD SMS ***********
    if (messageIndex > 0) {
    sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);

    //**** *In order not to full SIM Memory, is better to delete it*******
    sim808.deleteSMS(messageIndex);
    Serial.print("From number: ");
    Serial.println(phone);
    Serial.print("Datetime: ");
    Serial.println(datetime);
    Serial.print("Received Message: ");
    Serial.println(message);

    sim808.sendSMS(phone,MESSAGE);
  }


if (buttonSelect==0) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(LATDD);
      lcd.print("\xDF");
      int LATMM = int(LATMMmmmm);
      float LATSSs = (LATMMmmmm-LATMM)*60;
      lcd.print(LATMM);
      lcd.print("'");
      lcd.print(LATSSs,1);
      lcd.print("\x22\ N");
      lcd.setCursor(0,1);
      if (LON<100.0) lcd.print("0");
      if (LON<10.0) lcd.print("0");
      lcd.print(LONDDD);
      lcd.print("\xDF");
      int LONMM = int(LONMMmmmm);
      float LONSSs = (LONMMmmmm-LONMM)*60;
      if (LONMM<10) lcd.print("0");
      lcd.print(LONMM);
      lcd.print("'");
      if (LONSSs<10.0) lcd.print("0");
      lcd.print(LONSSs,1);
      lcd.print("\x22\ E"); }

    else if (buttonSelect==1) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("EUR: ");
      if (DAYLCL<10) lcd.print("0");
      lcd.print(DAYLCL);
      lcd.print(".");
      if (MONTH<10) lcd.print("0");
      lcd.print(MONTH);
      lcd.print(".");
      lcd.print(sim808.GPSdata.year);
      lcd.setCursor(5,1);
      if (HOURLCL<10) lcd.print("0");
      lcd.print(HOURLCL);
      lcd.print(":");
      if (MINUTE<10) lcd.print("0");
      lcd.print(MINUTE);
      lcd.print(":");
      if (SECOND<10) lcd.print("0");
      lcd.print(SECOND);
    }
    else if (buttonSelect==2) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("UTC: ");
      lcd.print(sim808.GPSdata.year);
      lcd.print("/");
      if (MONTH<10) lcd.print("0");
      lcd.print(MONTH);
      lcd.print("/");
      if (DAY<10) lcd.print("0");
      lcd.print(DAY);
      lcd.setCursor(5,1);
      if (HOUR<10) lcd.print("0");
      lcd.print(HOUR);
      lcd.print(":");
      if (MINUTE<10) lcd.print("0");
      lcd.print(MINUTE);
      lcd.print(":");
      if (SECOND<10) lcd.print("0");
      lcd.print(SECOND);
    }
    else if (buttonSelect==3) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(LATDD);
      lcd.print("\xDF");
      lcd.print(LATMMmmmm,4);
      lcd.print("' N");
      lcd.setCursor(0,1);
      if (LON<100.0) lcd.print("0");
      if (LON<10.0) lcd.print("0");
      lcd.print(LONDDD);
      lcd.print("\xDF");
      if (LONMMmmmm<10.0) lcd.print("0");
      lcd.print(LONMMmmmm,4);
      lcd.print("' E"); }
    else if (buttonSelect==4) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("AZ-Delivery.com"); }
  //
// //************* Turn off the GPS power ************
// sim808.detachGPS();
    previousMillis = millis();
    }
  }
} // end loop()

int Button() {
  int A0;
  // all buttons are connected to A0 via voltage divider
  // Values of ADC are between 0 and 1023
  // if necessary, values must be changed slightly
  A0 = analogRead(0); //
  if (A0 < 60) {
    return 0;
  }
  else if (A0 >= 60 && A0 < 250) {
    return 1;
  }
  else if (A0 >= 250 && A0 < 450){
    return 2;
  }
  else if (A0 >= 450 && A0 < 700){
     return 3;
  }
  else if (A0 >= 700 && A0 < 900){
    return 4;
  }
  else {
    return -1;
  }
} //end Button()

Nous continuerons à essayer de corriger les erreurs dans la bibliothèque DFRobot_sim808.h, les fonctions manquantes pour le parcours et la distance et les faiblesses de la requête de position. Le résultat reste à voir.

En attendant, amusez-vous bien avec cet excellent module GPS/GSM et bonne chance pour le personnaliser selon vos besoins personnels.

AmateurfunkFür arduinoProjekte für fortgeschrittene

1 commentaire

Roland Bauer

Roland Bauer

kleiner Beitrag zu “Schwächen bei der Positionsabfrage”, zum testen.
Grüße aus Österreich

/*
GSM-SIM80x & GPS-NEO-6M Standortabfrage, Darstellung mit Google Maps

NEO 6M NEO Arduino 5VIN +5V GND GND TXD 3 RXD 4 SIM80l Banggoot SIM Arduino 5VIN Extern +5V ~1A (Arduino hat zuwenig Leistung) GND GND VDO +5V (UART) TXD 7 (UART) RXD 8 (UART) GND GND (UART) RST 02112021

*/
#include <TinyGPS++.h>
#include
#include

// **** GPS
static const int RXPin = 4; // RXPin auf Arduino 4
static const int TXPin = 3; // TXPin auf Arduino 3
SoftwareSerial GPSSerial(RXPin, TXPin);
TinyGPSPlus gps;
float Lat = 0;
float Lng = 0;

// **** GSM
#define PHONE_NUMBER “06765514555” // Mobile phone number Admin
#define PIN_TX 7
#define PIN_RX 8
SoftwareSerial GSMSerial(PIN_TX, PIN_RX);
DFRobot_SIM808 sim808(&GSMSerial); // Connect RX,TX

// Variable empfang
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;
String Werte = “Messwerte”; // Befehl “sende Messwerte”
String incoming; // Variable store incoming SMS
char phone16;
char datetime24;

//int SEND = 13; // LED SMS Senden
String strStandort;
char *Standort; // Char beide Messwerte

void setup() {
//pinMode(SEND, OUTPUT);
//digitalWrite(SEND, LOW);
Serial.begin(9600);
GPSSerial.begin(9600);
Serial.println(“Start GPS”);
delay(1000);
GSMSerial.begin(9600);
//******** Initialize sim808 *************
while (!sim808.init()) {
delay(1000);
Serial.println(“Sim808 init error\r\n”);
}
delay(5000);
Serial.println(“Sim808 init success”);
Serial.println(“Start to send message …”);
//digitalWrite(SEND, HIGH);
sim808.sendSMS(PHONE_NUMBER, “GSM-GPS ready”);
//digitalWrite(SEND, LOW);
Serial.println(“kann SMS empfangen”);
}

void loop() {
GPSSerial.listen();
// Serial.println(“GPS-Abfrage”);
while (GPSSerial.available() > 0) {
gps.encode(GPSSerial.read());
if (gps.location.isUpdated()) {
Lat = gps.location.lat();
Lng = gps.location.lng();
Serial.print("Latitude= “);
Serial.println(Lat, 6);
Serial.print(”Longitude= ");
Serial.println(Lng, 6);

GSMSerial.listen(); { // Serial.println(“GSM-Abfrage”); //*********** Detecting unread SMS ************************ messageIndex = sim808.isSMSunread(); Serial.print("messageIndex: "); Serial.println(messageIndex); // Abfrage UNREAD SMS if (messageIndex > 0) { sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime); incoming = message; Serial.print("From number: "); Serial.println(phone); // Rufnummer der Anfrage Serial.print("Datetime: "); Serial.println(datetime); Serial.print("Recieved Message: "); Serial.println(message); sim808.deleteSMS(messageIndex); // SIM Memory loeschen if (incoming == Werte) { Messwerte(); } if (incoming != Werte) { Fehlersend(); } } } } }

}

void Messwerte() {
// Anpassen Ausgabe der Messwerte
String strStandort = (“http://maps.google.com/maps?&z=15&mrt=yp&t=k&q=” + String(Lat, 6) + “,” + String(Lng, 6));
Serial.print("strStandort= "); // fuer Test
Serial.println(strStandort); // fuer Test

// Umwandlung String zu Char mit variabler Laenge int strStandort_len = strStandort.length() + 1; char charStandort[strStandort_len]; strStandort.toCharArray(charStandort, strStandort_len); Serial.print("charStandort= "); // fuer Test Serial.println(charStandort); // fuer Test Standort = charStandort; SMSdatensend();

}

void Fehlersend()
{
Serial.println(“starte Fehler message …”);
//digitalWrite(SEND, HIGH);
sim808.sendSMS(phone, “Fehler! SMS Empfangsdaten”); //Fehlermeldung an sms-Anfrage
Serial.println(“kann SMS empfangen”);
//digitalWrite(SEND, LOW);
}

void SMSdatensend() {
//digitalWrite(SEND, HIGH);
Serial.println(“start to send Standort”);
sim808.sendSMS(phone, Standort); //Messwerte an sms-Anfrage
//digitalWrite(SEND, LOW);
Serial.println(“kann SMS empfangen”);
}

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery