Duda con transmisor de datos RF433 de arduino a arduino //SOLUCIONADO

Hola
Acabo de empezar un proyecto de envío de mensajes de texto de arduino a arduino con módulos RF433.
El transmisor envía una frase o números al receptor y éste lo muestra en una pantalla OLED.
Como van a haber varios receptores, cada uno tiene que recibir su frase y no las de los otros.
Como puedo hacer para que cada arduino obedezca solo la frase que va dirigida a él ???'
Con uno solo ya me funciona, pero si tengo varios, todos van a mostrar lo mismo...
Querría enviar con el transmisor, algo así:
Receptor 0001, muestra esta frase "Hola Mundo"
Receptor 0002, Muestra "Hola Pepe"
Receptor 0003, muestra "Este mensaje"
Receptor 0004, muestra "YOQUESé"
Así solo obedece el receptor que reciba una orden para él y los otros se mantienen como están.
Estos son los códigos que estoy utilizando:
Para el transmisor:

#include <VirtualWire.h>
 
const int dataPin = 12;
   
void setup()
{
    vw_setup(2000);
    vw_set_tx_pin(dataPin);
}
 
void loop()
{
   String str;  
    char buf[VW_MAX_MESSAGE_LEN];
    
   float dataFloat = 599.75; //Mensaje a enviar. Son nuemros con dos decimales hasta 999.99
    str = "f" + String(dataFloat); // Convertir a string
    str.toCharArray(buf,sizeof(buf)); // Convertir a char array
    vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
    vw_wait_tx(); // Esperar envio
    
    delay(2000);
}

Para los receptores:

#include <VirtualWire.h>
const int dataPin = 11;

#include <Wire.h>     // libreria para bus I2C
#include <Adafruit_GFX.h>   // libreria para pantallas graficas
#include <Adafruit_SSD1306.h>   // libreria para controlador SSD1306
#include <Adafruit_I2CDevice.h>
 
#define ANCHO 128     // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64       // reemplaza ocurrencia de ALTO por 64

#define OLED_RESET 4      // necesario por la libreria pero no usado
//Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);  // crea objeto

void setup() {
  Wire.begin();         // inicializa bus I2C
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa pantalla con direccion 0x3C
  /////////////////////////
  Serial.begin(9600);
    vw_setup(2000);
    vw_set_rx_pin(dataPin);
    vw_rx_start();
}
 
void loop() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
   // Recibir dato
    if (vw_get_message((uint8_t *)buf,&buflen))
    {
      String dataString;
        if((char)buf[0]=='i')
        {
            for (int i = 1; i < buflen; i++)
            {
            dataString.concat((char)buf[i]);
            }
            int dataInt = dataString.toInt();  // Convertir a int
            Serial.print("Int: ");
            Serial.println(dataInt);
        }
        else if((char)buf[0]=='f')
        {
            for (int i = 1; i < buflen; i++)
            {
            dataString.concat((char)buf[i]);
            }
            float dataFloat = dataString.toFloat();  // Convertir a float
            //Serial.print("Float: ");
            Serial.println(dataFloat);
            oled.clearDisplay();      // limpia pantalla
  oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
  oled.setCursor(30, 0);     // ubica cursor en inicio 
  oled.setTextSize(2);      // establece tamano de texto en 2
  oled.print("OFERTA");  // escribe en pantalla el texto
  oled.setCursor (20,16);    // ubica cursor en coordenas 
  oled.setTextSize(3); 
  oled.print(dataFloat);  // escribe en pantalla el texto 
  oled.setCursor (30,42);    // ubica cursor en coordenas 
  oled.setTextSize(2); 
  oled.print("Euros");  // escribe en pantalla el texto
  
  
  oled.display();     // muestra en pantalla todo lo establecido anteriormente
        }
    }
  
    
}

Gracias

Lo que puedes hacer es agregar al principio del mensaje un texto distintivo, por ej. "R001Hola mundo" , "R002Hola Pepe" y en cada receptor te fijas con qué empieza el mensaje recibido para saber si le corresponde imprimirlo.

Te cuento, el emisor receptor que estas usando emite para todos los receptores. La única forma con la que puedes discriminar un mensaje es si le agregas algo al mensaje que identifique el NODO y luego este lo presentará y los demas al recibirlo lo descartarán.

Bajo esa premisa puedes continuar.

Si quieres algo mejor debes usar un nRF24 que entonces si te permite agregar el Id del nodo y enviar mensajes para cada nodo en particular.

Gracias por vuestras opiniones.
Indicar que sigo siendo novato.
Los NRF24 los descarto para este proyecto porque los que uso de 433 son más pequeños.
Olvidé indicar que lo que se va a mostrar en la pantalla son siempre numero con dos digitos (precios).
Efectivamente, pretendo asignar al codigo de cada receptor, un numero unico y que solo obedezca si primero recibe ese numero. ( Si eres 123456, entonces muestra 125.99 en pantalla), si no, no hagas caso.
El transmisor enviará por ejemplo 123456 125.99 que será un precio amostrar en pantalla solo para el receptor 123456. Los otros receptores siguen con la info anterior en pantalla...
Sigo probando...gracias

Aunque despacio, algo voy avanzando...Ya consigo recibir por serial, un numero de serie para quien va dirigido el mensaje y el precio...Unos es Int para nuemro de serie de cada receptor y el otro es float para el precio a enviar...Soy novato, creo que se dice así....
También recibo el precio en la pantalla OLED.
Ahora me queda, ¿Cómo decirle a cada receptor, que muestre el precio, solo si el int lleva su numero de serie?
Estos son los códigos modificados:
Transmisor

#include <VirtualWire.h>
 
const int dataPin = 2;
   
void setup()
{
    vw_setup(2000);
    vw_set_tx_pin(dataPin);
}
 
void loop()
{
   String str;  
    char buf[VW_MAX_MESSAGE_LEN];
   
   // Ejemplo de envío int
   int dataInt = 29999;////////NS a quien va dirigido
    str = "i" + String(dataInt); /// Convertir a string
    str.toCharArray(buf,sizeof(buf)); // Convertir a char array
    vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
    vw_wait_tx(); // Esperar envio
    
   // Ejemplo de envío float
   float dataFloat = 713.14;////Precio a enviar
    str = "f" + String(dataFloat); // Convertir a string
    str.toCharArray(buf,sizeof(buf)); // Convertir a char array
    vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
    vw_wait_tx(); // Esperar envio
    
    delay(2000);
}

Receptor numero de serie 29999

#include <Wire.h>     // libreria para bus I2C
#include <Adafruit_GFX.h>   // libreria para pantallas graficas
#include <Adafruit_SSD1306.h>   // libreria para controlador SSD1306
#include <Adafruit_I2CDevice.h>
 
#define ANCHO 128     // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64       // reemplaza ocurrencia de ALTO por 64

#define OLED_RESET 4      // necesario por la libreria pero no usado
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);  // crea objeto
//////////////////
#include <VirtualWire.h>
const int dataPin = 11;
/////////////////////
void setup() {
  Wire.begin();         // inicializa bus I2C
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa pantalla con direccion 0x3C
  //////////////////
  Serial.begin(9600);
    vw_setup(2000);
    vw_set_rx_pin(dataPin);
    vw_rx_start();
  /////////////////
}
 
void loop() {
  
  /////////////////////
   uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
   // Recibir dato
    if (vw_get_message((uint8_t *)buf,&buflen))
    {
      String dataString;
        if((char)buf[0]=='i')
        {
            for (int i = 1; i < buflen; i++)
            {
            dataString.concat((char)buf[i]);
            }
            int dataInt = dataString.toInt();  // Convertir a int
            Serial.print("Int: ");
            Serial.println(dataInt);
        }
        else if((char)buf[0]=='f')
        {
            for (int i = 1; i < buflen; i++)
            {
            dataString.concat((char)buf[i]);
            }
            float dataFloat = dataString.toFloat();  // Convertir a float
            Serial.print("Float: ");
            Serial.println(dataFloat);
       
  
  
  
  oled.clearDisplay();      // limpia pantalla
  oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
  oled.setCursor(30, 0);     // ubica cursor en inicio de coordenadas
  oled.setTextSize(2);      // establece tamano de texto
  oled.print("OFERTA");  // escribe en pantalla el texto
  oled.setCursor (20,16);    // ubica cursor en coordenas 
  oled.setTextSize(3); 
  oled.print(dataFloat);  // escribe en pantalla el precio recibido
  oled.setCursor (30,42);    // ubica cursor en coordenadas 
  oled.setTextSize(2); 
  oled.print("Euros");  // escribe en pantalla el texto
  oled.display();     // muestra en pantalla todo lo establecido anteriormente

        }

    }

}

Agradecería ayuda de como indicar a cada receptor, que muestre el precio solo si es para él.
Saludos.

Gatul...Gracias por tu sugerencia.
No entiendo bien como quieres que se diferencie en el mensaje enviado, por ejemplo "R001 523.23€" de "R002 785.25€".... de esa manera, estás enviando un mensaje con dos datos...Como le dices a arduino que coja R001 para una cosa y 523.23€ para otra ??? Seguro que se puede ???

Gracias

@DOMPA creo que sigues sin comprender lo que se te ha dicho y además no sabes o desconoces algo mas.
No se que emisor/receptor de 433Mhz estaras usando pero solo espero que no sea la version barata que no tiene siquiera 10 mts de alcance. Esa que se ven un par de bobinas en uno y otro módulo.
Si es el caso te aseguro que tendrás muchos problemas.

gatul te escribió;

gatul:
un texto distintivo, por ej. "R001Hola mundo" , "R002Hola Pepe" y en cada receptor te fijas con qué empieza el mensaje recibido para saber si le corresponde imprimirlo.

Tienes que separar R001 o lo que fuere en cada receptor para detrminar si vas o no a presentarlo.

Lo mismo te dije yo

surbyte:
La única forma con la que puedes discriminar un mensaje es si le agregas algo al mensaje que identifique el NODO y luego este lo presentará y los demas al recibirlo lo descartarán.

Separa el Substring "RXXX", identifica a que nodo corresponde, compara con el que estas e imprime si corresponde.

@DOMPA Te respondo con tu ejemplo "R001 523.23€"

Analicemos: la cadena empieza con "R" que indica que lo que sigue es el ID del receptor al que va dirigido. Luego 3 dígitos con el ID. Entonces los 4 primeros caracteres corresponden al ID.
Luego hay un espacio (" ") y sigue la cadena con x digitos (incluido el punto) y finaliza con "€".

Supongamos que es el receptor 1, lo que haría es leer el serial y almacenar en una cadena (llamémosle buffRx) hasta que encuentre el "€".
Ahora buffRx tiene el el valor "R001 523.23€".
Si los primeros 4 caracteres son "R001" entonces guardo los caracteres desde el 6to en adelante (o sea, "523.23€") en la variable que guarda el precio (si quieres la conviertes a float pero igual la vas a mostrar como cadena, no se si vale la pena), haces la impresión y demás, y vacias buffRx con "".

Si los 4 primeros caracteres NO son "R001" entonces el mensaje no es para este receptor y no se procesa, solo limpias buffRx con "" y listo para la próxima lectura.

El receptor 2 haría lo mismo para la cadena "R002 785.25€" ya que empieza con "R002". ¿Me explico?

A tener en cuenta, siempre leer el serial hasta que aparezca el "€" (en este caso) para eliminar ese mensaje del buffer serial y no dejarlo truncado.
Siempre vaciar las cadenas que uses como buffers o auxiliares asignándoles "" para evitar problemas de memoria.

Algo que podría suceder (por la razón que sea) es que un mensaje llegue truncado, suponte "02 785.25€", como no empieza con "R" se descarta en todos los receptores, entonces te va a convenir enviar cada mensaje 2 o 3 veces para asegurarte que sea entregado correctamente.

Te sugiero que busques "uso de strings en arduino" para aprender a manejar cadenas.

Buenos días...Gracias por vuestra ayuda.
Antes de analizar las dos respuestas y tratar de entenderlas dada mi poca experiencia en programación, querría aclarar algo a Surbyte, que dicho sea de paso siempre está aquí para ayudar aunque a veces sea bronco en sus respuestas. Debe ser su forma de ser pero, esta peculiaridad no debe tapar su disposición y altos conocimientos para ayudar. Por lo menos conmigo así ha sido siempre :
Sabes que soy novato, no soy ingeniero ni programador, pero llevo 20 años trabajando en una empresa donde se utilizan módulos de radiofrecuencia por miles...No son esos superheterodinos con las dos bobinas ala vista. Son marca AUREL entre otras y de de gran calidad y nunca, nunca han dado problemas...Se utilizan para distancias de 30-50 metros. Obviamente hay que saber para que los quieres usar...Si los quieres para 100m, obviamente te darán problemas. Independiente de eso, mi problema a resolver en este post es de software y el modulo con el cual pretendo comunicarme no tiene importancia ahora mismo, a no ser que me digáis que para asignar un numero de ID cada receptor no es posible con estos módulos y creo que no es el caso.

Ahora voy a leer con atención vuestras respuestas con respecto al software e intentar comprenderlas. Os ruego comprensión y paciencia ya que soy novato en programación.

Gracias de nuevo y muy muy agradecido por vuestro tiempo.

Entendido Gatul...
La teoría la he entendido....Creo que te refieres a que en vez de enviar dos mensajes/datos, uno para el NS (numero de serie) y otro para el precio, va todo en uno.
El proyecto, que no se si se usará trata de facilitar la actualización de precios en una tienda imaginaria. Cada producto tiene una etiqueta digital (OLED-arduino-Modulo RFRX) El transmisor es un dispositivo conectado a un PC (Arduino + modulo RFTX).
Imaginemos que queremos cambiar todos los precios de los 1000 artículos de la tienda. Cada etiqueta (receptor) tiene su NS y mostrará el precio enviado desde el TX solo si ese precio va precedido de su NS.
Entonces según tu, debería enviar algo como "R00001 125.99€", "R00045 39.50€", "R12345 458.23€".
Un RX recibe "R01234 451.23€" ¿ como separa NS de precio para mostrar precio en OLED ?
La teoría la entiendo. Lo que no sé es como implementar en el código esa parte del receptor.
En el TX creo que es fácil, es como lo estoy haciendo con int. (Lo probaré esta tarde, ahora work time)

#include <VirtualWire.h>
 
const int dataPin = 2;
   
void setup()
{
    vw_setup(2000);
    vw_set_tx_pin(dataPin);
}
 
void loop()
{
   String str;  
    char buf[VW_MAX_MESSAGE_LEN];
   
   // Ejemplo de envío int
   int dataInt = "R00012 299.99€";////////NS a quien va dirigido
    str = "i" + String(dataInt); /// Convertir a string
    str.toCharArray(buf,sizeof(buf)); // Convertir a char array
    vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
    vw_wait_tx(); // Esperar envio
   
   
    delay(2000);
}

En el lado receptor ni idea.. Creo que pico demasiado alto para mi bajo nivel de conocimientos.
Igualmente muy agradecido a ambos.

Este es un ejemplo de modulo Aurel

rx4m50rr30sf.jpg

rx4m50rr30sf.jpg

Bueno, después de probar con el código anterior, he tenido que rescatar uno que abandoné que sirve para enviar un string, según dice el titulo de la web donde lo he copiado...Reconozco que solo en parte comprendo lo que hace. El caso es que funciona para enviar los ejemplos que me sugerís tipo "R00123 123.56€".
Código transmisor:

#include <VirtualWire.h>
 
  const int dataPin = 2;
  const int ledPin = 13;
 
void setup()
{
    vw_setup(2000);
    vw_set_tx_pin(dataPin);
}
void loop()
{
    const char *msg = "R00123 123.59€";
    digitalWrite(ledPin, true);
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
    digitalWrite(ledPin, false);
    delay(2000);
}

Para el receptor:

#include <VirtualWire.h>
  const int dataPin = 11;
 
void setup()
{
    Serial.begin(9600);
    vw_setup(2000);
    vw_set_rx_pin(dataPin);
    vw_rx_start();
}
 
void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    
    if (vw_get_message(buf, &buflen)) 
    {
    for (int i = 0; i < buflen; i++)
    {
    Serial.print((char)buf[i]);
     }
    Serial.println("");
        
    }
}

Con esto, ya recibo R00123 123.59€ en el serial.
-¿Como le digo al receptor, que R00123 es un numero de serie?
-¿Como le digo que 123.59€ tiene que mostrarlo solo (sin R00123) de momento en el serial?

Gracias

llevo 20 años trabajando en una empresa donde se utilizan módulos de radiofrecuencia por miles...No son esos superheterodinos con las dos bobinas ala vista. Son marca AUREL entre otras y de de gran calidad y nunca, nunca han dado problemas...Se utilizan para distancias de 30-50 metros. Obviamente hay que saber para que los quieres usar...Si los quieres para 100m, obviamente te darán problemas. Independiente de eso, mi problema a resolver en este post es de software y el modulo con el cual pretendo comunicarme no tiene importancia ahora mismo, a no ser que me digáis que para asignar un numero de ID cada receptor no es posible con estos módulos y creo que no es el caso.

Que soy bronco o directo (si cabe el sinónimo) ninguna duda.

Ahora con 160 mensajes aún no sabes precisar un problema explicando con qué estas trabajando y los demás debemos imaginarnos que tu estas usando un módulo AURIEL (que desconocía porque no tengo tu experiencia en el tema).
Eso es lo que siempre reclamo, evitar la pérdida de tiempo que genera quien pregunta por no explicar debidamente el contexto de su problema.

Ese es mi descargo.

Ahora avancemos:

La teoría la he entendido....Creo que te refieres a que en vez de enviar dos mensajes/datos, uno para el NS (numero de serie) y otro para el precio, va todo en uno.

Lo que se te dice es que el emisor le remite a todos los modulos el dato que corresponde.
El receptor debe discriminar o discernir que mensaje le corresponde a el.
Cómo lo hace?

Simple con algo como lo que te hemos dicho:

String paqEnviado[] = {"R00001 125.99€", "R00045 39.50€", "R12345 458.23€"};


void setup() {

  Serial.begin(115200);
  Serial.println("Listo para empezar");
  nodo(1);
  nodo(45);
  nodo(12345);
}

void loop() {

}

void nodo(int tmp) {
  char buffer[10];
  sprintf(buffer, "R%05d", tmp);
  String s = buffer;
  Serial.print("Nodo " + String(s) + "=> ");
  for (int i = 0 ; i < 3; i++) {
    if (s == paqEnviado[i].substring(0, 6)) {
        Serial.println(paqEnviado[i].substring(7, paqEnviado[i].length()));
    }
  }

}

Al no tener un emisor generé supuetos 3 mensajes en un array de Strings con 3 mensajes.
Cada mensaje será impreso en el nodo que le corresponda.

nodo(x) representa a una función que discrimina si lo que le envian es para el.
Lo mejor sería que tu nodo llevará por ejemplo un id en la EEPROM, arranca la lee y el código es el mismo en todos los lugares qeu recepcionarán estos msgs.

Gracias surbyte.
Me entran ganas de abandonar...He probado combinaciones con tu sugerencia y ni transmite ni recibe... Me indica errores que no se resolver, obviamente por mi carencia de conocimientos.
Esto es lo que tengo ahora mismo, pero ya digo que ni transmite ni recibe:

#include <VirtualWire.h>
 
  const int dataPin = 2;
  
 
void setup()
{
    vw_setup(2000);
    vw_set_tx_pin(dataPin);
}
void loop()
{
    
    String paqEnviado[] = {"R00001 125.99€", "R00045 39.50€", "R12345 458.23€"};
    
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
    
    delay(2000);
}

Me dice 'msg' was not declared in this scope

#include <VirtualWire.h>
  const int dataPin = 11;
 
void setup() {

  Serial.begin(115200);
  Serial.println("Listo para empezar");
  nodo(1);
  nodo(45);
  nodo(12345);
}

void loop() {

}

void nodo(int tmp) {
  
  char buffer[10];
  sprintf(buffer, "R%05d", tmp);
  String s = buffer;
  Serial.print("Nodo " + String(s) + "=> ");
  for (int i = 0 ; i < 3; i++) {
    if (s == paqEnviado[i].substring(0, 6)) {
        Serial.println(paqEnviado[i].substring(7, paqEnviado[i].length()));
    }
  }

}

Con este dice:'paqEnviado' was not declared in this scope

Te vas a reír, me estoy planteando usar los NRF24 para aprovechar la función de pipe y usarla como numero de serie. No te molestes en intentar ayudarme con estos códigos....
Me avergüenza haceros perder el tiempo y no saber aprovechar vuestras sugerencias...
Tengo a mano unos NRF24 y varios códigos de la web para transmitir y recibir textos y o números..Lo intentaré con ellos.
Mil gracias de nuevo por vuestra ayuda.

Llegas a este punto por no "escuchar" las sugerencias que te han hecho.
Te dije, busca como usar strings, y si lo hubieses hecho tal vez tu solo hubieses encontrado la solución, que por cierto es bien sencilla (y te aclaro que me hice de mi primer arduino el 29 de septiembre pasado, todavía no hace 4 meses).
Lo que llama la atención es que haces manejo de strings en el emisor, haces conversiones, y lo más simple...

En el codigo original del receptor tienes parte de la solución porque usas un string (yo voy a usar "R00123 123.59€" como ejemplo de dato recibido en el receptor nro. 123)

// Recibir dato
    if (vw_get_message((uint8_t *)buf,&buflen))
    {
      String dataString;
      

// *** y sigo aquí ***

     String precio;
     dataString = buf;
     if(dataString.substring(0,5) == "R00123") { // esto es para este receptor? SI
        precio = dataString(7);   // guarda la cadena desde el 8vo. caracter  hasta el final)
     }
     dataString = "";  //libera la memoria usada por el string

// *** sigues tú con lo que haga falta ***
   }

Ten en cuenta que en los strings el 1er. caracter tiene índice 0, por eso leo el nro. de receptor destinatario desde 0 hasta 5 (6 caracteres).
El espacio intermedio (que tiene índice 6) simplemente lo ignoro y leo el precio desde la posición 7 en adelante.
Para copiar el precio uso el substring con un solo parámetro porque sé donde empieza pero no la longitud (el precio no tiene por qué tener longitud fija).
El string "precio" incluye el "€" del final, tenerlo en cuenta.
Si te fijas ni hace falta hacer conversiones, el texto se envía como tal, se recibe como tal y se imprime del mismo modo.
Salvo que necesites hacer cálculos en el receptor, la conversión de tipos que tú haces en la recepción no tiene sentido.
Ahí te pongo un ejemplo que almacena "precio" si el mensaje es para ese receptor, sino simplemente lo ignora. Atención que es una variable local, supongo que debería ser global. Solo es un ejemplo.

Nooo.. que lio que haces y que te haces.

Luego hablamos de tus habilidades de programación, eso tiene una solución y es ponerse a estudiar, cómo? Un libro por ejemplo es un buen comienzo, pero lo dejamos para otro momento, para cuando te sea posible dedicarle tiempo.

Mi ejemplo solo apunta a como debes resolver las cosas desde el receptor, imaginando que éste recibiera 3 paquetes (en realidad recibe muchos mas).
Asi que es una situación irreal si se quiere pero tiene un elemento con el que puedes determinar si el paquete le corresponde a ese nodo o no.

Vamos a ponerlo en limpio.
Coincidimos que el emisor se encarga de despachar paquetes con los precios cuando estos requieran cambios.

Presta atención porque en este código hay cosas para modificar en cada receptor y cosas que las envia el emisor.

#include <VirtualWire.h>
#include <EEPROM.h>
const int dataPin = 11;
int Id;                         // variable que se carga con el Id del receptor. Nro de 0 a 32565 tal como tu lo definiste.
int address;               // direccion donde guardo el Id del receptor en la EEPROM del Arduino que uses. Yo elegí la 100. 
bool forzamos = true;// una variable que uso porque no tengo en funcionamiento VirtualWire.
 
void setup(){
    address = 100;
    EEPROM.get(address, Id);
    Serial.begin(115200);
    Serial.println("Nodo =" +String(Id));
    if (Id == 0) {  // esto es mejorable. Se supone que la EEPROM cuando esta virgen viene con un dato que creo es FF
        Serial.println("Nodo no idenfificado");  // como no reconocí el nodo le asigno valor pero OJO este debe 
                                                                     // ser diferente para cada producto tuyo.
        Id = 2; // asigno el número de nodo
        EEPROM.put(address,Id);
    }
    
    vw_setup(2000);
    vw_set_rx_pin(dataPin);
    vw_rx_start();
}
 
void loop() {
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    String str = "";
   
   // esta linea es la que va en tu código
    //if (vw_get_message(buf, &buflen))  { // borrar comentarios para prueba con módulo receptor
    if (forzamos) {   // esta línea es la que uso yo porque no implemento VirtualWire
        // Lineas auxiliares que deben comentarse
        sprintf(buf, "R%05d 345.55€", Id);               // esto lo envia el emisor
        // Hasta aca comentar 

        buflen = strlen(buf);
        str = (char *) buf;           // convierto el puntero a String.
        Serial.println(str);
        forzamos = false;           // comentar esta linea cuando se use conlos módulos RF
        nodo(Id, str);
    }
}

void nodo(int tmp_nodo, String st) {
  char buffer[10];
  sprintf(buffer, "R%05d", tmp_nodo);
  String s = buffer;
  Serial.println("Nodo Id = " + s); 
  Serial.println("Nodo env= " + st.substring(0, 6));
  if (s == st.substring(0, 6)) {
      Serial.println("Hay coincidencia");
      Serial.println(st.substring(7, st.length()));
  }
  else
    Serial.println("No corresponde el dato a este nodo");

}

Soy todo oídos para las dudas o consultas que tengas.

Gracias por vuestra paciencia...Efectivamente Surbyte, has dado en el clavo.Me encantaría estudiar programación a full. El único problema es donde y cuando....Si encontrara una academia privada o profesor cerca de casa me lanzo de cabeza a pesar de mis 54 años.
Gatul, toda la razón...No escucho. Pero no es por despreciar vuestros consejos. Creo que es porque al no comprender vuestras sugerencias ala primera, ya salto a por otras soluciones. Pero en fin, aquí sigo y quiero aprender y sacarlo adelante.

A menos que me digáis lo contrario, parto con el código Transmisor del post #11.

#include <VirtualWire.h>
 
  const int dataPin = 2;
   
void setup()
{
    vw_setup(2000);
    vw_set_tx_pin(dataPin);
}
void loop()
{
    const char *msg = "R00123 123.59€";
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
    delay(2000);
}

Ahora voy con las modificaciones que decís...No sé todavía si los dos apuntáis hacía el mismo rumbo...Intentare averiguarlo.

Empiezo por el ultimo post de Surbyte:
Con tu código y las modificaciones que indicas, recibo esto que ahora intentaré comprender linea a linea:

Nodo =-1
R00123 123.59€_%⸮
Nodo Id = R-0001
Nodo env= R00123
No corresponde el dato a este nodo
R00123 123.59€_%⸮
Nodo Id = R-0001
Nodo env= R00123
No corresponde el dato a este nodo
R00123 123.59€_%⸮
Nodo Id = R-0001
Nodo env= R00123
No corresponde el dato a este nodo

En este caso, aunque lo recibe y lo interpreta, no cambiaría el precio en la pantalla, ya que este receptor es R-0001 y lo que yo envío va para R00123... Luego sigo...................

Bien...Funciona.
Hay cosas que he modificado(con ayuda presencial):

En el TX, modifico el id a quien va dirigido:
const char *msg = "R12245 183.59€";

En el RX siempre me mostraba como nodo R00001. Con estos cambios, ya me muestra el numero correcto del RX:

void setup(){
    address = 100;
    EEPROM.put(address, 0);//**********
    EEPROM.get(address, Id);
    Serial.begin(115200);
    Serial.println("Nodo =" +String(Id));
    
    if (Id == 0) {  // esto es mejorable. Se supone que la EEPROM cuando esta virgen viene con un dato que creo es FF
        Serial.println("Nodo no idenfificado");  // como no reconocí el nodo le asigno valor pero OJO este debe
                                                                     // ser diferente para cada producto tuyo.
        Id = 12345; // asigno el número de nodo //************
        EEPROM.put(address,Id);
    }

He hecho pruebas enviando para otro nodo, y aunque dice que no hay coincidencia, en el serial me indica que recibe todo bien... Esta tarde montaré un segundo y tercer receptor y añadiré la parte de mostrar en la pantalla OLED.
Ahí me surge una duda....Para decirle que muestre en pantalla el precio recibido, creo que es st.substring
Otra duda...Como hacer para que no envíe ni muestre el signo €
Otra más...¿Que significa este 10 ???

void nodo(int tmp_nodo, String st) {
  char buffer[10];

Gracias mil de nuevo...Voy avanzando y viendo la luz

Simplifiquemos las cosas porque veo que doy un paso de mas asi que lo haré mas simple

El nodo requiere que se le diga como se llama.
Si envias un mensaje del tipo

const char *msg = "R12245 183.59€";

El único nodo que debe responder al msg y cambiar su precio será el Nodo 12245 entonces debes grabarle a la EEPROM de ese nodo dicho valor o no responderá.
Veamos cómo hacerlo:
Lo que haz heho para reconocer a tu nodo R12245 esta bien.
Forzaste la dirección de grabación a 0 luego preguntaste si era 0 y y fuerzas el valor que quieres en este caso 12245. Ojo 12245 no 12345 como pusiste o ponte de acuerdo entre mensaje e Id, okay, mira eso porque has confundido uno de dos.

En el loop y el procedimiento nodo puse carteles de mas para informarte, pero si confunden retíralos o coméntalos.

Todo esto va de la mano con el id que se define como global.
Antes del setup

int Id = 12245;

para que todo tenga coherencia

void loop() {
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    String str = "";
  
   // esta linea es la que va en tu código
    //if (vw_get_message(buf, &buflen))  { // borrar comentarios para prueba con módulo receptor
    if (forzamos) {   // esta línea es la que uso yo porque no implemento VirtualWire
        // Lineas auxiliares que deben comentarse
        sprintf(buf, "R%05d 345.55€", Id);               // esto lo envia el emisor
        // Hasta aca comentar

        buflen = strlen(buf);
        str = (char *) buf;           // convierto el puntero a String.
        Serial.println(str);
        forzamos = false;           // comentar esta linea cuando se use conlos módulos RF
        nodo(Id, str); 
    }
}

void nodo(int tmp_nodo, String st) {
  char buffer[10];
  sprintf(buffer, "R%05d", tmp_nodo);
  String s = buffer;
  //Serial.println("Nodo Id = " + s);
  //Serial.println("Nodo env= " + st.substring(0, 6));
  if (s == st.substring(0, 6)) {
      Serial.println("Hay coincidencia");
      // sigo la idea de gatul
      String precio = st(7);
      //Serial.println(st.substring(7, st.length()));
      Serial.println("Precio = " + precio);
  }
  else
      // Serial.println("No corresponde el dato a este nodo");

}

Gracias Surbyte.

Con el código que enviaste en tu post #15 y ese par de cambios que hice, ya funcionaba...casi 100%.
Mis cambios:

En el TX: const char *msg = "R12345 183.59€"; //(Corregido en este post 12345 en vez de 12245)

En el RX:

EEPROM.put(address, 0);//**********
Id = 12345; // asigno el número de nodo //************

Con eso ya funcionaba...Unicamente pequeños detalles.
Sin embargo con las modificaciones que sugieres en tu post #18 ya no funciona. Me da ciertos errores:
Para esta linea: String precio = st(7);
Me dice: no match for call to '(String) (int)'

No sé si corregido eso, habrá más...
En principio, me quedo con la opción del post #15 aunque tiene cosillas a depurar antes de pasar a la fase de mostrar en la pantalla OLED. Esto es lo que muestra en un receptor con Id coincidente:

Nodo =0
Nodo no idenfificado
R12345 183.59€+⸮}⸮⸮⸮⸮⸮ɆzK
Nodo Id = R12345
Nodo env= R12345
Hay coincidencia
183.59€+⸮}⸮⸮⸮⸮⸮ɆzK
R12345 183.59€+⸮}⸮⸮⸮⸮⸮ɆzK
Nodo Id = R12345
Nodo env= R12345
Hay coincidencia
183.59€+⸮}⸮⸮⸮⸮⸮ɆzK

Al principio no lo identifica y muestra Nodo 0, pero luego ya si reconoce y muestra Id y precio correcto.
Tengo muchas preguntas para abusar de tu amabilidad...JEJEJE, ayer eras brusco y hoy ya eres amable...Lo que son las cosas... Es broma, sabes que te tengo en estima.
¿Cómo eliminar esos signos de interrogación y otros?
¿Cómo eliminar el signo de € ? Actualmente, aunque el TX no lo envíe, en el serial lo muestra igualmente.
¿Para mostrar en pantalla OLED, es st.substring ?
¿Qué significa este 10? char buffer[10];
Ahora tengo 3 receptores, ¿Como envío 3 mensajes o más a la vez en la linea

const char *msg = "R12345 183.59€";

Esto me da error:

const char *msg = "R12345 183.59€", "R00345 82.87€", "R21236 215.25€", "R00369 785.45€", "R19854 326.89€"; //Si se puede, me gustaría enviar y recibirlo sin €

Ya sé que son muchas, preguntas, pero con las repuestas pasaré a la siguiente fase.

Gracias de antemano