Buenas tardes a todos
Mi proyecto consiste en enviar datos de un “esclavo” que se mueve, a un “master” que también se mueve, y utilizando un algoritmo, saber a qué distancia y en qué dirección está el esclavo respecto al master.
Para ello, la configuración es la siguiente:
Esclavo……….Un GPS, un emisor RF 433, y un Arduino
Receptor…….Un GPS, un receptor RF433 y un Arduino
La primera parte, transmitir los datos del esclavo al receptor master y leerlos como variables, ya lo he conseguido, pese a que la recepción es muy lenta. Debajo os pongo los códigos.
En el emisor, GPS va a los pines 3 y 4 y el emisor al pin 12, La emisión es bastante rápida, pero al ir alternando la etapa RF el envío de cadenas de caracteres, que es lo único que envía, primero manda latitud y luego longitud. El monitor serial responde perfecto.
En el receptor, las cadenas llegan con poco retraso, si hay un error no la escribe y escribe la siguiente. Hasta ahí va más o menos rápido.
Por todo ello hay que transformar las cadenas a números y luego según el rango de los números asignar la cadena a la latitud o longitud según sea. Ahí empieza el problema, para conseguir una pareja de variables (latitud) longitud actualizada necesito 2 minutos para arranque y actualiza cada 15 segundos más o menos. Lentísimo.
Hay posibilidad de que el corra más rápido??
#include <VirtualWire.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3; // pines del gps bee a 3,5v
static const uint32_t GPSBaud = 9600;
double alfa;
double bravo;
double charlie;
double delta;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
// emisor transmite por el pin 12 y se conecta a 5v
void setup()
{
//Iniciamos el Serial y la comunicacion por radio
Serial.begin(9600);
ss.begin(GPSBaud);
Serial.println("Radio encendida");
vw_setup(2000); Serial.println(F("latitud longitud alfa bravo"));
}
void loop()
{
//funcion que define datos sacados de gps y atribucion de datos a variables alfa y bravo
printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
charlie =(gps.location.lat());
delta = (gps.location.lng());
//con esto evitamos que haya puntos o signos negativos en las cadenas a transmitir
alfa = charlie * 1000000; bravo = (delta+60)*1000000;
Serial.print(" "); Serial.print(charlie,6); Serial.print(" "); Serial.print(delta,6); Serial.print(" "); Serial.print(alfa,0); Serial.print(" "); Serial.print(bravo,0);
smartDelay(1000);
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial.println(F("No GPS data received: check wiring"));
Serial.println();
//Funcion para enviar los mensajes alfa y bravo
{
//cadena para latitud
String Alfa=String(alfa,0); // lo paso a un String con 6 decimales
int longitudALFA=Alfa.length()+1; // calculo la longitud del String y lo paso a un entero
char msg[longitudALFA]; // declaro una nueva matriz de caracteres
Alfa.toCharArray(msg,longitudALFA); // le paso un array de caracteres de longitud de la cadena
vw_send((uint8_t *)msg, strlen(msg)); // se pasan los valores al sensor
vw_wait_tx(); //Se hace la transmisión de datos
delay(200);
//cadena para longitud
String Bravo=String(bravo,0); // lo paso a un String con 0 decimales
int longitudBRAVO=Bravo.length()+1; // calculo la longitud del String y lo paso a un entero
//char msg[longitudBRAVO]; // declaro una nueva matriz de caracteres
Bravo.toCharArray(msg,longitudALFA); // le paso un array de caracteres de longitud de la cadena
vw_send((uint8_t *)msg, strlen(msg)); // se pasan los valores al sensor
vw_wait_tx(); //Se hace la transmisión de datos
delay(1000); //Se espera un segundo
}
//Serial.println(*msg); //Muestra el mensaje por Serial
}
//ESTO NI LO TOCO, QUE ES PARA QUE FUNCIONE EL GPS
// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
static void printFloat(float val, bool valid, int len, int prec)
{
if (!valid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(' ');
}
smartDelay(0);
}
static void printInt(unsigned long val, bool valid, int len)
{
char sz[32] = "*****************";
if (valid)
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz[i] = ' ';
if (len > 0)
sz[len-1] = ' ';
Serial.print(sz);
smartDelay(0);
}
static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
if (!d.isValid())
{
Serial.print(F("********** "));
}
else
{
char sz[32];
sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
Serial.print(sz);
}
if (!t.isValid())
{
Serial.print(F("******** "));
}
else
{
char sz[32];
sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
Serial.print(sz);
}
printInt(d.age(), d.isValid(), 5);
smartDelay(0);
}
static void printStr(const char *str, int len)
{
int slen = strlen(str);
for (int i=0; i<len; ++i)
Serial.print(i<slen ? str[i] : ' ');
smartDelay(0);
}
#include <VirtualWire.h>
#include <stdlib.h>
#include <stdio.h>
float alfa=0;
double charlie=0;
double Lat=0;
double lnt=0;
int divisor=1000000;
double LatDividido;
double LongDividido;
double DiferenciaLongDividido;
double LATMOB;
double LONMOB;
void setup()
{
Serial.begin(9600); //Se inicia la comunicación serial
vw_set_ptt_inverted(true);
vw_setup(2000); //Tiempo de espera
vw_set_rx_pin(11); //Pin donde se conecta el Arduino
vw_rx_start(); //Se inicia la recepción de datos
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN]; //Tamaño del mensaje
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) //Se verifica si hay //mensaje disponible para ser leido
{
int i;
char *matrizAlfa;
String cadenaAlfa;
for (i = 0; i < buflen; i++) //Se leen todos los caracteres
{
Serial.write(buf[i]); //Se guarda la información en una //matriz
cadenaAlfa.concat((char)buf[i]); // Se concatena a la cadena de caracteres
}
cadenaAlfa.toCharArray(matrizAlfa,cadenaAlfa.length()+1);
//alfa= strtod(matrizAlfa,NULL);
//Serial.println(); //Se imprime el mensaje en el monitor //serial
//alfa=atof(matrizAlfa);
alfa=cadenaAlfa.toFloat();
charlie=(alfa+0);
//Serial.println(alfa,0);
//Serial.print("Charlie: ");
//Serial.println(charlie);
// discrimina cual de ellos es longitud y cual latitud
if (charlie <45000000)
{(Lat = charlie);
Serial.print('\n');
//Serial.print("LAT: ");
//Serial.print(Lat);
//Serial.print('\n');
LatDividido=Lat*(0.000001);
//Serial.print("LatDividido: "); Serial.print(LatDividido);
}
else
{(lnt = charlie);
Serial.print('\n');
//Serial.print("lnt: ");
//Serial.print(lnt);
//Serial.print('\n');
LongDividido=lnt*(0.000001);
//Serial.print("Longitud Dividido: "); Serial.print(LongDividido);
DiferenciaLongDividido=LongDividido-60;
//Serial.print('\n\n');
//Serial.print("Diferencia de longitud: "); Serial.print(DiferenciaLongDividido);
}
LATMOB=LatDividido;
Serial.print('\n');
Serial.print("LATMOB: "); Serial.print(LATMOB,6);
LONMOB=DiferenciaLongDividido;
Serial.print('\n');
Serial.print("LONMOB: "); Serial.print(LONMOB,6);
Serial.print('\n');
}
}
Como veis, el objeto de todo este zarrio, es conseguir en el receptor dos variables :
double LATMOB y double LONMOB, con las que despues trabajaré.
Hay veces que funciona bien aun con retardos, y otras que le cuesta mucho sacar LATMOB, no se por qué; esta cadena la refresca dos veces de cada diez aproximadamente, cuando el porcentaje de error al recibirlas es mas o menos parecido