Comunicación puerto serie

Hola a todos!
Soy muy novato en esto y espero no hacer una pregunta demasiado absurda pero por más que lo intento, no consigo que esto me funcione. Os explico mi problema...

Tengo un Arduino uno con 5 sensores analógicos. Por otro lado tengo un Arduino NANO con un LCD donde quiero mostrar los valores. Estos datos se deben refrescar una vez por segundo mas o menos.
La comunicación entre ellos es via Bluetooth.
Mi problema es que no se como enviar los datos por que si hago por ejemplo:

Serial.print(VALOR1);
delay(10);
Serial.print(VALOR2);
delay(10);
Serial.print(VALOR3);
delay(10);
...

¿Como puedo saber en el Arduino NANO que el valor que me esta llegando es el VALOR1 y no es el VALOR2 por ejemplo....?

En resumen, que no se como enviar los datos y que el receptor sepa que variable le estoy enviando.

Y porque usas dos cuando solo puedes usar uno? Es un tema de que tomas las lecturas en un punto y debes mostrarlas en otro?
Hay un post similar en software de alguien que quiere enviar datos (dos datos) y justamente se presentan varias opciones de como hacerlo.
Revisa otras respuestas.

Si. Es justo eso. Los sensores estan en un punto y necesito mostrarlos en otro de forma inalambrica.

Por mas que busco no consigo encontrar un post ni ejemplo de algo parecido QUE LOGRE ENTENDER mi nivel es muy básico . De lo contrario no hubiera publicado el post. Pero si me indicas el titulo de ese post para poder encontrarlo también te lo agradeceré.

Hola:

Te pongo tres ejemplos.

Sólo con el potenciómetro.

int valorPot=0;

void setup(){
     Serial.begin(9600);
}

void loop(){
     valorPot=analogRead(2);
     Serial.println(valorPot);
     delay(100);
}

Segundo ejemplo sólo con el potenciómetro.

int valorPot=0;
float voltajePot=0;

void setup(){ Serial.begin(9600); }

void loop(){
     valorPot=analogRead(2);
     voltajePot=valorPot*(5.0/1023.0);
     Serial.println(voltajePot);
     delay(100);
}

Tercer ejemplo. Controlar brillo de un LEd con el potenciómetro, o lo que es lo mismo, resistencia ajustable.

const int numElementos = 10; 
int lecturas[numElementos];  
int index = 0;   
int total = 0;  
int media = 0; 
 
void setup(){
      Serial.begin(9600);                  
      for (i = 0; i < numElementos; i++){
          lecturas[i] = 0;          
      } 
}

void loop() {
     total= total - lecturas[index];        
     lecturas[index] = analogRead(2);
     total= total + lecturas[index];      
     index = index + 1;                    
     if (index >= numElementos){              
          index = 0;                          
     }
     media = total / numElementos;        
     Serial.println(media);  
     delay(1);
}

Un cordial saludo.

Hola rlleixa,

Igual de novato que tu (o más ya que aún estoy esperando recibir mi tarjeta Arduino), pero te planteo una opción. Antes de enviar el valor del sensor, envía un identificador.
Como ejemplo utilizaría letras como identificador:

Serial.print("A");
Serial.print(VALOR1);
delay(10);

Serial.print("B");
Serial.print(VALOR2);
delay(10);

Serial.print("C");
Serial.print(VALOR3);
delay(10);

No estoy seguro si se podría hacer todo en una sola línea.

Del lado del receptor te recomendaría utilizar la función "SWITCH" (Ver referencia).

El switch compararía si el primer dato que recibes es una A, entonces es valor 1. y así sucesivamente para los otros tres valores de tus sensores.

Saludos

Hola. Muchísimas gracias por vuestras respuestas y disculpar que tarde en responder pero he estado fuera unos días...

Metaconta ###

Los tres ejemplos que me pones utilizan simplemente el envío de una sola variable mediante la instrucción Serial.print() y mi problema es enviar tres variables y que el receptor sepa cual es la que le está llegando.

felicito_escobar ###

Lo que me propones es exactamente la misma conclusión a la que he llegado pero no termino de conseguirlo...Seguro que es una tontería pero no veo como... intentaré poner un ejemplo reducido de lo que hago y el problema que tengo.

-------- EMISOR --------

float VAL1 = 4.44;
float VAL2 = 55.55;

BT.write("A");
delay(5);
BT.write(1);
delay(5);
BT.print(VAL1);
delay(5);
BT.write("C");
delay(5);

BT.write("A");
delay(5);
BT.write(2);
delay(5);
BT.print(VAL2);
delay(5);
BT.write("C");
delay(5);

-------- RECEPTOR --------

float VAL1;
float VAL2;
int VALBT=0;

if (BT.available()>0) {
VALBT = BT.read();
if (VALBT==65){ //Si me llega una "A" empieza una variable.
while (VALBT != 67){ // Mientras no llegue una "C" de cierre de variable...
while (BT.available()==0) {
}
VALBT = BT.read();
Serial.println(VALBT);
switch (VALBT){
case 1:
while (BT.available()==0) {
}
VAL1 = BT.read();
break;
case 2:
while (BT.available()==0) {
}
VAL2 = BT.read();
break;
}
}
}
}


...Esto casi me funciona salvo por un pequeño problema... el valor de la variable me llega en ascii.
Es decir debería llegarme esto...

A, 1, 4.44, C
A, 2, 55.55, C

Y en cambio me llega...

A, 1, 4.00, C
A, 2, 55.00, C

No se si queda demasiado claro.
Primero envío una "A" para indicar que empieza una variable.
A continuación envío un numero entero que indica si es la variable 1 o 2.
Luego envío el valor de esa variable.
Y por último envío una "C" para indicar que he terminado de enviar esa variable.

He avanzado un poco más... Ya leo los datos correctamente.
Ahora me faltaría saber como paso estos datos a formato float() por que los tengo en formato texto.

---------- EMISOR -----------

float VAL1 = 4.44;
float VAL2 = 55.55;

BT.write("A");
delay(5);
BT.write(1);
delay(5);
BT.print(VAL1);
delay(5);
BT.write("C");
delay(5);

BT.write("A");
delay(5);
BT.write(2);
delay(5);
BT.print(VAL2);
delay(5);
BT.write("C");
delay(5);

---------- RECEPTOR -----------

char VAL1;
char VAL2;
int VALBT=0;

if (BT.available()>0) {
VALBT = BT.read();
if (VALBT==65){
while (BT.available()==0) {
}
VALBT = BT.read();
switch (VALBT){
case 1:
while (VALBT != 67){
if (BT.available()>0) {
VALBT = BT.read();
if (VALBT == 67) break;
VAL1 = VALBT;
}
}
break;
case 2:
while (VALBT != 67){
if (BT.available()>0) {
VALBT = BT.read();
if (VALBT == 67) break;
VAL2 = VALBT;
}
}
break;

}
}
}

Hola. Echa un vistazo a la referencia de Serial y conocerás a los señores parseInt y parseFloat, que te solucionarán muchas cositas :wink:

          case 1:
            miVariableFloat = Serial.parseFloat();

Saludos

hola alguien me puede ayudar estoy haciendo una comunicacion de voz por medio de bluethoo, arduino y una lcd 16x2, lo que quiero hacer es que cuando yo diga una palabra por ejemplo "centro de electronica" se vea en la lcd, hasta ahorita ya me aparece el nombre pero no puedo hacer que siga el texto en la segunda linea de la lcd es decir cuando yo digo una palabra que rebasa los 16 caracteres de la lcd esta continue en la segunda linea de la lcd pero no logro hacer mi comunicacion es por puerto serial Rx y Tx
anexo mi codigo y espero puedan asesorarme gracias

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5);

void setup(){
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// initialize the serial communications:
Serial.begin(9600);
}

void loop()
{
// when characters arrive over the serial port...
if (Serial.available()) {
// wait a bit for the entire message to arrive
delay(100);
// clear the screen
lcd.clear();
// read all the available characters
while (Serial.available() > 0) {
// display each character to the LCD
lcd.write(Serial.read());
String cadena;
int contcadena = cadena.length();
if((contcadena/16)==0)
{
Serial.print(cadena);
}
if((contcadena/16)==1)
{

char cadena1 [16];
char cadena2 [16];
char cadena0 [32];
cadena.toCharArray(cadena0,32);
for(int i = 0; i<16;i++){
cadena1 =cadena1_+cadena0*;
lcd.setCursor(0,0);
}
for(int i = 16; i<32;i++){
cadena2 =cadena2+cadena0;
lcd.setCursor(0,1);
}*_

}
* }*
* }*
}

Porque no creas un nuevo hilo con este tema y de paso lees las Normas del foro para aprender a insertar códigos.
Creo que tu consulta en parte desvirtúa el hilo.
Te responderá en cuanto lo hagas.