señales análogas con xbee (SOLUCIONADO)

Hola buenas he estado trabajando con un arduino UNO y un xbee S1 tratando de enviar señales análogas de temperatura de la salida de un TMP35 obviamente inalambricas en la cual no he tenido mucho éxito ya que he estado usando una salida PWM y el xbee me toma cada pulso que da este y lo he comprobado conectando un led a la salida del xbee receptor el cual parpadea, también probé aumentando la frecuenta del arduino y tampoco, lo único que logro es que parpadee mas rápido pero nosotros sabemos que a mayor voltaje mas largo sera el pulso pero necesito trabajar con voltajes bajos ya que maximo que se le puede poner al xbee son 3.3 Volt pero no sirve ya que varia demasiada la salida del xbee receptor
me dijeron que tenia que usar los TX y RX pero no se utilizar muy bien esas salidas la cual hizo que quemara un xbee :stuck_out_tongue: pero buee son pruebas.

la idea es enviar un voltaje por ejemplo 30ºc equivalga a un voltaje determinado y ese voltaje enviarlo por el xbee el cual lo recibe el receptor y entra a un arduino y saque ese voltaje de la salida ..

espero su ayuda o cualquiera que me pueda orientar con los TX y RX saludos.! :slight_smile:

Usa San GOOGLE: Arduino Xbee y busca imagenes

gracias pero una consulta como funciona tx y como me va a ayudar a enviar mi señal analoga si es una salida digital ?? gracias por la respuesta se agradece ... saludos

Hugo.
Con estos elementos no puedes enviar señales análogas. Es mas con ningún método de transmisión se envían señales análogas. Ya que para poder transmitir una señal análoga primero se hace una conversión a digital y luego el receptor reconstruye la señal análoga con ciertos rangos de error.

Ahora mi pregunta: para que quieres una señal analoga.? Has la conversión de la señal y envía los datos validos.

hola Max estoy trabajando en un proyecto en mi U, en la cual queremos enviar la señal del sensor de temperatura a través del xbee, a mi lo que mas me importa es el voltaje en lo posible ... pero si no se puede y hay una forma de enviar el valor de la temperatura también es bueno cualquiera de los dos valores sirve pero me dijEron que tenia que utilizar el TX y el RX ...

BUeno, el XBEE S1 tiene una entrada y una salida analógica.
mira el video
Tal vez tenga tu respuesta

Otro ejemplo mejor y con mayor detalle.

hola surbyte el primer video ya lo vii y modifique eso un poco pero no me funciono ya que me leia los pulsos del pwm creo yo .... el segundo video lo vere bien pero trata de un xbee S2 gracias iguaal vere si se puede utilizar con el S1 si me vaa bien pondre como lo hice :slight_smile: saludos

No me queda claro si la adquisición de datos lo vas a hacer usando el propio xbee o si va a ser el arduino el que lo haga, si es el segundo caso:

Una vez tienes tienes enlazados los Xbee usan entre si una conexión serie, de ahí que usen Rx y Tx( el pin 0 y 1 queda reservado para esto). Con un arduino lee el dato del sensor y se lo mandas mediante serial (Por el xbee) al otro, y en el otro lo interpretas como quieras.

¿Cómo tienes configurado los xbee? ¿Usando su API? ¿Y comunicados al arduino mediante una shield o cómo?

Te dejo un link donde te explican bastante bien este tema: http://www.andresduarte.com/arduino-y-xbee

Hola Raulitus la configuracion de los xbee te los dejo espero que se vean



la adquisición de los datos lo hago a través del arduino , yo estaba utilizando una salida pwm para enviar la señal del sensor y lo ingresaba a D0 del xbee que estaba configurado en ADC ahora un profesor me dijo que estaba mal echo y que lo tenia que hacer a través de TX y RX

Ahora lo que tengo aparte de los xbee S1 son un XBee Explorer Dongle , un XBee Explorer Regulated y tambien tengo un xbee shield pero no lo estoy ocupando.

espero que me puedas echar una manito te lo agradecería mucho.

de ante manos gracias por responder.! :slight_smile:

Los tienes bien configurado a priori, aunque yo tengo uno como coordinador y otro como end device. Una vez tienes los Xbee conectados se crea una comunicacion serie, es como si tuvieras un cable del 1 (Tx) del arduino A al 0 (Rx) del arduino B, y del 1 (Tx) del B al 0 (Rx) del A. Por eso esos pines no los puedes usar al estar ya ocupados. Así que una vez hecho olvídate de los xbee y sus pines si vas a usar arduino. Todo se resume a que tienes un cable virtual que comunica ambos arduinos y que te usa los pin 0 y 1, tienes el resto para lo que quieras y funcionando a 5V

Xbee trabaja a 3.3V pero la shield ya se encarga de regularlo sola, así que sigues teniendo 5V para cada pin arduino. Importante, para programar arduino pon la shield en modo USB, una vez hecho para comunicarse pon la shield en modo Xbee.

No sé si te he liado más..jajaja, mira ejemplos comunicación serial en arduino y nos comentas :wink:

Hola Raulitus agradezco mucho que te tomes un tiempito para responderme muchas gracias.!

Ahora te cuento. yo no he utilizado la salida TX o RX del arduino sino que he ocupado la salida 9 PWM y esa señal la envió a la entrada D0 del xbee ... y yo creo que por eso me toma pulsos el xbee y envía esa señal al receptor.. entonce por lo que me dices es mejor utilizar TX y RX .

ahora el TX del arduino automáticamente me transforma la señal análoga ??.. es que eso no tengo muy claro por mi falta de conocimiento, ya que TX y RX son salidas digitales y eso no me lo puedo sacar de la mente, como lo hace ?, ya que para mi solo envía un 1 y un 0... discúlpame de verdad eso no lo entiendo.

seguiré buscando información sobre eso . aunque creo tener claro eso del cable como dices tu .. pero mi mente da muchas vueltas jajaja

muchas graciaas se agradece tu comentario y que compartas tu conocimiento saludos! :slight_smile:

ahora el TX del arduino automáticamente me transforma la señal análoga ??.. es que eso no tengo muy claro por mi falta de conocimiento, ya que TX y RX son salidas digitales y eso no me lo puedo sacar de la mente, como lo hace ?, ya que para mi solo envía un 1 y un 0... discúlpame de verdad eso no lo entiendo.

Cuando leo estas cosas me agarro la cabeza, porque solo muestra improvisación y falta de lectura.

Lo diré con cuidado para no molestarte aunque ya te lo dijo Raulitus.

Cuando se trabaja con estas cosas, no se puede simplemente conectarlas y ver que pasa.
Se debe leer bien las hojas de datos. Ojo yo también me equivoco aun leyéndolas.

TX y RX son salida y entrada del puerto serie. No transforma nada en analógico. Es un puerto de comunicaciones del arduino con el mundo. todo lo que le programas o le envías al arduino, pasa por ahi, y todo lo que devuelve el arduino viene de ahi.

aaa okaa disculpa si te molestaste por lo que pregunte...para ti tiene que haber sonado tonto .. pero para mi que he buscado información sobre eso .. es algo que no manejo, pero gracias por el comentario me quedo clarito ahora cuando tenga solucionado todo posteare como lo solucione muchas gracias :slight_smile:

Entendí mal, creía que los D0 se referia al Rx del arduino

Tenía por ahí un LM35 y me he puesto a hacer algo parecido, pongo el código de los arduino y algunas notas. Está bastante chafardero y por encima, no he profundizado en librerías, pero para que te hagas una idea de cómo funciona el puerto serie.

int analog_pin = 0;//PIN A0 PARA LEER LM35
int PinAlimentacion = 13; //PIN QUE DA 5V
int cont;
float temperatura, tmedia;

void setup () {
  Serial.begin(9600);
  pinMode(PinAlimentacion, OUTPUT);
  digitalWrite(PinAlimentacion, HIGH); //5V en pin 13
}


void loop() {
  tmedia = 0;
  for(cont=0; cont<100; cont++){ //LEEMOS 100 veces y hallamos media
  temperatura = analogRead(analog_pin);
  temperatura = 5.0*temperatura*100.0/1023.0;
  tmedia=tmedia+temperatura;
  }
  tmedia= tmedia/cont;
  Serial.print('X');// SE MARCA INICIO ENVIO 
  Serial.print(tmedia);
  Serial.print('Y');// SE MARCA FINAL ENVIO
  delay(1000);
  
}

Como mi shield tapa los pin de la alimentación los 5V para el LM35 los he sacado del pin digital 13

Por serie sólo puedes mandar 8 bits y es asíncrona por eso el receptor no sabe cuando empieza una trama o acaba. Para resolver esto en el código mando X al inicio y una Y al finalizar la trama. Quedando algo así:

X19.67YX19.51YX19.67YX19.81YX19.73Y

En la parte del receptor:

char digitos[8];
int cont;
  
  void setup() {
  Serial1.begin(9600);
  Serial.begin(9600);
 
}

void loop()

{
  
    while(Serial1.available()>0){
     
          for(cont=0;cont<8;cont++){//VOLCAMOS DATOS EN ARRAY DE 8*8 BITS
           digitos[cont]=Serial1.read();         
           }
          if(digitos[0]=='X'){//SINCRONIZADO
              Serial.print("La temperatura medida es: ");
                 for(cont=1;cont<8;cont++){
                  if(digitos[cont]!='Y'){
                   Serial.print(digitos[cont]);
                  }
                  else{
                  break;
                }  
              }
                
             Serial.println(" oC");
           }
           
    }
          
          
  
       delay(5000);
  }

Aquí se vuelca cada 8 bits en un array de 8 posiciones (Esto es grave xD ya que se gasta ram a lo tonto sin saber bien cuánto ocupa lo que vamos a recibir). Y una vez que se tiene el array, se mira que la primera posición contenga una X, (sincronizado!! o a saber...) y se imprime hasta que recibe una Y.

No sé si te he resuelto dudas, yo por lo menos estoy aprendiendo bastante, no compiles tal cual porque el 2º código sólo funciona en leonardo y la optimización del código brilla por su ausencia!!

Saludos

Hola Raulitus

muchas gracias de verdad te pasaste un monton! eres un crack! jajajaja y disculpa la demora por no responderte de inmediato. la primera parte la entiendo muy bien e implementado la "X" y "Y" en mi código ya que veo que son necesarias .

implemente el segundo código en el arduino UNO y la verdad le hice un pequeño cambio le borre el Serial1.begin del setup y el que estaba en el loop lo cambie por un serial.begin y quedo asi.

char digitos[8];
int cont;
  
  void setup() {
  Serial.begin(9600);
 
}

void loop()

{
  
    while(Serial.available()>0){
     
          for(cont=0;cont<8;cont++){//VOLCAMOS DATOS EN ARRAY DE 8*8 BITS
           digitos[cont]=Serial.read();         
           }
          if(digitos[0]=='X'){//SINCRONIZADO
              Serial.print("La temperatura medida es: ");
                 for(cont=1;cont<8;cont++){
                  if(digitos[cont]!='Y'){
                   Serial.print(digitos[cont]);
                  }
                  else{
                  break;
                }  
              }
                
             Serial.println(" oC");
             
           }
           
    }

       delay(100);
  }

te tengo que agradecer un monton por que la verdad me haz enseñado demasiado y agradezco mucho que compartas tu saber con todos nosotros ya que no seré el único que salga beneficiado con esto.! cuando arregle el escalado de la señal . pondré todo el código muchas gracias .!!! :smiley:

después de un buen tiempo pude seguir y dar con la solución para poder sacar el numero del dato enviado bueno a lo directo y aqui esta el codigo .. agradecer a Raulitus ya que me dio gran parte del trabajo echo.

Este seria del arduino receptor por si acaso.

char digitos[8];
int outpin=6;
int cont;
int lightLevel=0; 
int high = 0, low = 1023;
void setup() 
{
  Serial.begin(9600);
}

void loop()
{
 String valor;

 
    while(Serial.available()>0)
    {
          for(cont = 0; cont < 8; cont++)
          {
             digitos[cont] = Serial.read();        
          }
          
          
          if(digitos[0] == 'X')
          {
                 Serial.print("La temperatura medida es: ");
              
                 for(cont = 1; cont < 8; cont++)
                 {
                    if(digitos[cont] != 'Y')
                    {
                        Serial.print(digitos[cont]);
                        lightLevel = digitos[cont];
                        
                        valor += digitos[cont];
                    }
                    else
                      break;
                }
                int valor2 = atoi(valor.c_str());
                 Serial.print("\nEL VALOR " );
                  Serial.println(valor2);
                  valor2 = map(valor2, 0, 50, 0, 255);
                  valor2 = constrain(valor2, 0, 255);
                  analogWrite(outpin,valor2);
                 
             Serial.println(" oC");
           }
    }
       delay(500);
}

Hola Hugo0702, Raulitius y demás miembros interesados en este TOPIC:

Me ha servido de gran ayuda vuestro ejemplo para leer los datos, en mi caso de varios sensores (3humedad + 1 temperatura), transmitirlos a través de Xbee Pro S1 (de Arduino UNO R3 a Arduino UNO R3) y sacarlos por pantalla bien presentados. Os dejo mi código por si le queréis echar un vistazo:


char digitos[14];


int cont = 0;








void setup() {


 Serial.begin(9600);





}





void loop() {





 while (Serial.available() > 0)


 {


   for (cont = 0; cont < 14; cont++)


   {


     digitos[cont] = Serial.read();


   }


   if (digitos[0] == 'A')


   {


     Serial.print("SENSOR HUMEDAD 1: ");


     for (cont = 1; cont < 14; cont++)


     {


       if (digitos[cont] != 'B') {


         Serial.print(digitos[cont]);


       }


       else if (digitos[cont] == 'B')


       {


         Serial.print("SENSOR HUMEDAD 2: ");


         for(cont = cont + 1; cont<14; cont++)


         {


           if (digitos[cont] != 'C'){


             Serial.print(digitos[cont]);


           }


           else if (digitos[cont] == 'C')


           {


             Serial.print("SENSOR HUMEDAD 3: ");


             for(cont = cont + 1; cont<14; cont++)


             {


               if (digitos[cont] != 'D'){


                 Serial.print(digitos[cont]);


               }


               else if (digitos[cont] == 'D'){


                 Serial.print("TEMPERATURA: ");


                 for (cont = cont + 1; cont<14; cont++)


                 {


                   if (digitos[cont] != 'E'){


                     Serial.print(digitos[cont]);


                   }


                 


                   else{


                     break;}


                   }


                   Serial.println("");


                 }


               }


             }


           }


         }


     }


   }


 }


delay(3000);


}

Me pongo en contacto con vosotros para ver si me podríais ayudar con mi siguiente paso:

Quiero enviar los datos que tengo bien presentados en Serial del receptor a un WebServer a través de una Ethernet shield unida a la misma placa que el Xbee Shield (receptor). Para ello he escrito un código que también facilito más abajo pero que no me está funcionando. No se me envía nada. El problema creo que está el la forma de trabajar con los datos y mezclar el código correspondiente a la lectura de datos en Serial con la transmisión a WebServer a través de Ethernet.

Para ello creo que la solución más sencilla y funcional seria escribir una función independiente (tipo void senddata()) sólo para enviar los datos a través del Ethernet pero para ello necesito crear un Array con los datos que voy leyendo en el bucle de lectura de datos. Aquí es donde está mi problema en crear ese array conforme va leyendo los valores en el programa diseñado por vosotros. No lo consigo...

¿Podríais darme alguna pista u orientación al respecto? Os estaría muy agradecido ya que estoy a muy pocos pasos de terminar mi proyecto.

El código con el que estoy intentando enviar los datos a WebServer es este:


#include <Ethernet.h>


#include <SPI.h>





byte mac[] = {   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };


IPAddress ip(192, 168, 1, 25); // Poned aqui vuestra IP <------- <------- <--------


EthernetServer server(80);  // Arrancamos el servidor en el puerto estandard 80





char digitos[14];


int cont = 0;








void setup() {


 Serial.begin(9600);





 Ethernet.begin(mac, ip);


 server.begin();          // Inicia el servidor web


 Serial.print("Servidor Web en la direccion: ");


 Serial.println(Ethernet.localIP());





}





void loop() {


 EthernetClient client = server.available();  // Buscamos entrada de clientes


 if (client)


 { Serial.println("new client");


   boolean currentLineIsBlank = true;  // Las peticiones HTTP finalizan con linea en blanco


   while (client.connected())


   { if (client.available())


     { char c = client.read();


       Serial.write(c);   // Esto no es necesario, pero copiamos todo a la consola


       // A partir de aquí mandamos nuestra respuesta


       if (c == '\n' && currentLineIsBlank)


       { // Enviar una respuesta tipica


         client.println("HTTP/1.1 200 OK");


         client.println("Content-Type: text/html");


         client.println("Connection: close");


         client.println("Refresh: 15");            // Actualizar cada 15 segs


         client.println();


         client.println("<!DOCTYPE HTML>");


         client.println("<html>");





         while (Serial.available() > 0)


         {


           for (cont = 0; cont < 14; cont++)


           {


             digitos[cont] = Serial.read();


           }


           if (digitos[0] == 'A')


           {


             Serial.print("SENSOR HUMEDAD 1: ");


             client.print("<head><title>Información Nodo Sensores 1</title></head>");


             client.print("<body><h1> Situacion Ambiente</h1><p>Humedad 1 m. - ");


             for (cont = 1; cont < 14; cont++)


             {


               if (digitos[cont] != 'B') {


                 Serial.print(digitos[cont]);


                 client.print(digitos[cont]);


               }


               else if (digitos[cont] == 'B')


               {


                 Serial.print("SENSOR HUMEDAD 2: ");


                 for (cont = cont + 1; cont < 14; cont++)


                 {


                   if (digitos[cont] != 'C') {


                     Serial.print(digitos[cont]);


                     client.print(digitos[cont]);


                   }


                   else if (digitos[cont] == 'C')


                   {


                     Serial.print("SENSOR HUMEDAD 3: ");


                     for (cont = cont + 1; cont < 14; cont++)


                     {


                       if (digitos[cont] != 'D') {


                         Serial.print(digitos[cont]);


                         client.print(digitos[cont]);


                       }


                       else if (digitos[cont] == 'D') {


                         Serial.print("TEMPERATURA: ");


                         for (cont = cont + 1; cont < 14; cont++)


                         {


                           if (digitos[cont] != 'E') {


                             Serial.print(digitos[cont]);


                             client.print(digitos[cont]);


                           }





                           else {


                             break;


                           }


                         }


                         Serial.println("");


                       }


                     }


                   }


                 }


               }


             }


           }


         }


         delay(10);         // Para asegurarnos de que los datos se envia


         client.stop();     // Cerramos la conexion


         Serial.println("client disonnected");


       }


     }


   }


 }

delay(3000);
}


Un saludo!

Deberían todos los valores de los sensores desde el emisor mandar en una sola cadena usando string,y después con pulsadores en el receptor separar las posiciones y así evitar que se imprima todos los valores de los sensores. Pudiendo elegir cual quieres que se te aparezca, yo lo hice con un lcd 16x2 con i2c y me facilito menorar en tanto a programación se refiere a del receptor. Hasta el momento tengo 3 sensores uno de temperatura y humedad uno de temperatura del agua, sensor de nivel y me falta poner un sensor de viento y un estado de motor paso a paso. y su post me ayudo a entender la comunicación serial, pero es mejor mandar cadenas ténganlo en mente