josue_gonzalezm:
Si creo que la solución es mandarla Binario, pues los dos son Float y pues lo mejor seria que todo el tiempo se este enviando
En forma binaria no he visto tutoriales que expliquen cómo se hace, así que lo haré a como mejor pueda.
En AVR (en tu caso ambos Arduino Uno y Mega), un float se almacena en 4 bytes; ya que vamos a trasmitir dos de estos (temperatura y humedad), pues lógicamente tendremos que enviar 8 bytes en cada "paquete" (conjunto de ambos datos).
Sabiendo esto último, tendremos claro que el receptor debe esperar al menos que 8 bytes hayan llegado antes de procesar la información. Este detalle formará parte del código base para el receptor.
El emisor requiere de dos pasos: lectura de sensores (implícitamente también cuenta la parte de almacenar los valores en variables) y transmisión de los 8 bytes. En código, se vería así:
void loop() {
// Paso 1:
float temperatura = // Obtención de la temperatura
float humedad = // Obtención de la humedad
// A partir de aquí aprenderás algo nuevo. Paso 2:
Serial.write((byte*)&temperatura, 4); // Envío de la temperatura, en forma binaria
Serial.write((byte*)&humedad, 4); // Envío de la humedad, en forma binaria
delay(10); // Valor de ensayo y error. Evita llenar el búfer del receptor en caso de que este sea más lento que el emisor; cosa que muy probablemente ocurra ya que el microcontrolador no tiene procesador dedicado a los gráficos.
// Un valor muy alto podría hacer que el flujo de datos deje de ser "constante".
}
El receptor realiza tres pasos: recibir la información, "reconstruir" los valores originales y mostrarlos en pantalla.
void loop() {
if (Serial.available() > 7) { // Este es básicamente el paso 1. Con que la condición se cumpla, ya tenemos los dos datos listos para procesar
// Paso 2:
float temperatura = 0.0;
float humedad = 0.0; // Se inicializan de una vez para que ocupen (reserven) espacio en la memoria. Más adelante se explicará sobre esto.
Serial.readBytes((byte*)&temperatura, 4);
Serial.readBytes((byte*)&humedad, 4); // Por el orden de los datos, se supone que la temperatura es primero, luego la humedad.
// Paso 3: imprimir en pantalla los valores de ese par de variables.
}
// No se requiere de delay porque aquí es el emisor quien determina la frecuencia con que los datos se deben actualizar.
}
Ahora explicaré con detalle esa función que quizá para ti sea una novedad:
Serial.write((byte*)&temperatura, 4);
write y print no son lo mismo (excepto cuando el parámetro es del tipo char o un array de este tipo). Para no contar el "cuento largo", write se utiliza para "escribir" o enviar bytes, mientras que print genera una representación textual de mútiples tipos de datos (no solo bytes).
La parte (byte*)&temperatura quiere decir que el contenido de la variable temperatura será interpretado como un array de byte (de ahí que sea posible descomponerlo en un grupo de bytes).
Los caracteres '*' y '&' pertenecen al famoso tema de los punteros de memoria; en este caso específico se utilizan para que write obtenga los bytes directamente de donde está ubicada (en memoria) la variable.
El número 4 determina la cantidad de bytes por enviar. No podemos valernos de sizeof para determinar el tamaño de un array que se pasa por referencia mediante punteros, esa es la razón de este parámetro.
readBytes cuenta una historia similar, aunque... ¿recuerdas la parte donde dije que las variables tenían que estar inicializadas de antemano? Pues como la función requiere el puntero de la variable, ¿de dónde lo obtendría si no se ha reservado su espacio? No estoy seguro si la falta de inicialización hubiera parado en un error de compilación o de ejecución, pero en cualquier caso el objetivo de esto es evitarnos un dolor de cabeza.
Uff, creo que eso es todo lo que tenía que decir. Ojalá y no se me haya escapado algún detalle 