Paso 2: Software explicó
El código para el Arduino es bastante simple. Utilizando un par de bibliotecas, el GPS y GPRS Shield se convierten en fáciles de usar objetos. Esto ahorra mucho tiempo analizar cadenas GPS y componer cadenas largas de AT + comando para el módem. Aquí está el código sin ninguna pelusa. Luego lea en un desglose de lo que los hace.
#include <TinyGPS++.h> #include <GPRS_Shield_Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> TinyGPSPlus gps; GPRS gsm(7,8,9600); int messageIndex = 0; char message[160]; char phone[16]; char datetime[24]; char latitude[12]; char longitude[12]; void setup() { Serial.begin(9600); pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(100); digitalWrite(9,HIGH); delay(500); digitalWrite(9,LOW); delay(100); pinMode(13, OUTPUT); digitalWrite(13,LOW);} void loop() { while (Serial.available() > 0) { gps.encode(Serial.read());} messageIndex = gsm.isSMSunread(); if (messageIndex > 0) { gsm.readSMS(messageIndex, message, 160, phone, datetime); gsm.deleteSMS(messageIndex); if (String(message) == "xyzzy") { if (gps.location.isValid()) { strcpy(message, "http://www.bing.com/maps?"); strcat(message, "lvl=17&style=r&sp=point."); dtostrf(gps.location.lat(), 1, 6, latitude); strcat(message,latitude); strcat(message,"_"); dtostrf(gps.location.lng(), 1, 6, longitude); strcat(message,longitude); strcat(message,"_Golf+Cart_"); strcat(message,datetime);} else { strcpy(message, "I'm sorry, Dave, I'm afraid I can't do that.");} gsm.sendSMS(phone,message);}}}
Si no sabes cómo agregar una biblioteca para su herramienta de programación de Arduino, la mejor documentación puede encontrarse en la página de Arduino en http://www.arduino.cc/en/guide/libraries#toc4
La biblioteca TinyGPS ++ puede encontrarse en http://arduiniana.org/libraries/tinygpsplus/.
La biblioteca de GPRS Shield puede encontrarse en https://github.com/Seeed-Studio/GPRS_SIM900.
Asegœrese de que los cables de datos GPS se quitan de la Arduino antes de subir tu bosquejo. Después de cargado el programa, apague y vuelva a colocar los cables de datos GPS.
En aras de ahorrar memoria, no declaro cada pin como una variable con un nombre de fantasia, pero poner los valores directamente en el código. Si desea utilizar clavijas diferentes para su dispositivo GPRS, por ejemplo, cambiaría las clavijas en el punto en el código donde se crea el objeto GPRS. Aquí está el juego por el juego.
En primer lugar, declaramos nuestras bibliotecas y variables globales:
#include <TinyGPS++.h>#include <APRS_Shield_Arduino.h>#include <Wire.h>#include <SoftwareSerial.h>
A continuación, crear una instancia de tinygps ++ llamado 'gps'.
TinyGPSPlus gps;
A continuación, cree un objeto GPRS llamado 'gsm' en el puerto serial del software en las patillas 7 y 8 a 9600 bps
GPRS gsm(7,8,9600);
Por último, declarar todos los índices y cadenas
int messageIndex = 0; char message[160]; char phone[16]; char datetime[24]; char latitude[12]; char longitude[12];
El bucle de configuración es bastante escaso, principalmente al inicializar el puerto serial del hardware para el GPS y luego girando en el escudo GSM por momentáneamente pulsando pin 9. Espero que recordó a la soldadura de la almohadilla del puente. Por último, desactivar el LED a bordo en el pin 13 para guardar jugo y potencialmente utilizar para indicar una falla en algún momento en el futuro.
void setup() { Serial.begin(9600); pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(100); digitalWrite(9,HIGH); delay(500); digitalWrite(9,LOW); delay(100); pinMode(13, OUTPUT); digitalWrite(13,LOW);}
El loop() es bastante directa. Usando la biblioteca TinyGPS ++ ahorra un merecido de la codificación, manejo todos los datos GPS análisis con sólo dos líneas de código.
void loop() { while (Serial.available() > 0) { gps.encode(Serial.read());}
Después de eso, hacemos un llamamiento a la biblioteca de GPRS_SIM9000 a tomar todo el trabajo de comprobación de mensajes no leídos, leyendo y borrando la primera nos encontramos con cuatro líneas de código. La función readSMS() también cargas hasta nuestras variables globales para su uso posterior. Si hay más de un mensaje en espera, cada uno se obtener analiza en iteraciones posteriores del loop().
messageIndex = gsm.isSMSunread(); if (messageIndex > 0) { gsm.readSMS(messageIndex, message, 160, phone, datetime); gsm.deleteSMS(messageIndex);
Con el mensaje analizado y globales cargado, el texto entrante se compara con una cadena específica, continuando solo a una coincidencia exacta de la palabra mágica. Sin un partido, volver a la parte superior del lazo y empezar a cargar otra vez el objeto GPS con nuevos datos. Cambiar el texto dentro de las comillas Si desea utilizar otra palabra.
if (String(message) == "xyzzy") {
Si hay un partido, hacemos otra línea solo llamar a nuestro objeto GPS para determinar si tenemos una buena solución en nuestra posición.
if (gps.location.isValid()) {
Si así, respondemos con una URL a Bing maps. Prefieren utilizar Google, pero yo no he decidido cómo colocar un alfiler en el mapa con sólo una dirección URL. De todas formas, crear la URL sea el código más feo en el lazo. Tiene que haber algún tipo de malabarismo para obtener el número de precisión doble devuelto del objeto GPS en una cadena, por lo tanto, la función dtostrf() . Entonces es fuerza bruta sólo concatenación de cadenas.
La función strcpy() establezca la variable de mensaje al principio de la URL, luego strcat() continúa añadir bits a la misma variable de mensaje hasta que hemos terminado. Este es el bloque para cambiar si desea utilizar un servicio de asignación diferentes o formato su respuesta de manera diferente.
strcpy(message, "http://www.bing.com/maps?"); strcat(message, "lvl=17&style=r&sp=point."); dtostrf(gps.location.lat(), 1, 6, latitude); strcat(message,latitude); strcat(message,"_"); dtostrf(gps.location.lng(), 1, 6, longitude); strcat(message,longitude);
El texto entre comillas es la etiqueta que aparecerá en el objeto de mapa. Debe tener el subrayado circundante y utilizar el carácter "+" en lugar de los espacios. La siguiente línea añade la fecha y hora de la solicitud inicial.
strcat(message,"_Golf+Cart_"); strcat(message,datetime);}
Si no tenemos una solución, establecer el contenido de la variable de mensaje a otra cosa y enviarlo por el mismo número que hace la solicitud y cerrar todas las llaves.
else { strcpy(message, "I'm sorry, Dave, I'm afraid I can't do that.");} gsm.sendSMS(phone,message);}}}
Eso es todo. Volver a la cima del loop() y empezar.
Espero que esto explica el código bien bastante que alguien nuevo en el Arduinosphere puede comprender y modificar a sus necesidades. A continuación, instalación...