Go Down

Topic: Por fin correcta lectura en fortma de array por puerto serie con XBee (Read 2800 times) previous topic - next topic

anonimator

Hola compañeros.

Después de mil vueltas que le he dado a mi código de lectura por puerto serie a través de los fabulosos modulos Xbees, ahora tengo una duda, cuando abro mi monitor del puerto serie en el shelch de receptor para visualizar lo que he enviado desde mi emisor, YEAh!!! ahí están mis datos ordenaditos, fabuloso NO?

Pues bien, me aparece una linea algo así   $0, 0, 0 , 0  los dos primeros ceros son datos analógicos los dos segundos son digitales, evidentemente no estoy actuando sobre ningún potenciometro o pulsador del emisor.

Osea que si actúo sobre mis potenciometros y pulsadores en mi emisor me apareceria algo así;

$255, 184, 1, 1

Es decir en el primer valor (255) estoy actuando hasta fondo sobre el potenciometro que tengo en el arduino emisor.

En el segundo valor (184) estoy actuando no tan hasta el fondo.

En el tercer valor (1) simplemente estoy actuando sobre el pulsador correspondiente al igual que en el cuarto valor.

La velocidad de refresco a tiempo casi real y digo casi por que siempre viene con un poco retardo pero inapreciable para nuestras neuronas.

AHORA es cuando pido ayuda:

¿COMO PUEDO LEER LOS DOS PRIMEROS VALORES PARA QUE ACTUEN SOBRE DOS SERVOS Y LOS SEGUNDOS VALORES PARA QUE ACTUEN ON/OFF EN LEDS???????

Ya se que puede parecer lo mas fácil pero me estoy volviendo loco al tratarse de un array no se extraer esos valores.

Saludos y Gracias.

Aqui os dejo mi codigo.-

#include <Servo.h>

Servo servo1;
Servo servo2;
int pin_motor = 13;
int pin_rec = 2;
char array1[4] = { '0', '0', '0', '0'};

void setup()
{
  Serial.begin(19200);

pinMode(pin_motor, OUTPUT);
pinMode(pin_rec, OUTPUT);
servo1.attach(9);
servo2.attach(10);

}
void loop() {
   if (Serial.available() >= 4){
        for ( int i = 0; i < 4; i++)
   array1 = Serial.read();
 
   }
  {
    Serial.print(array1[0]);
    Serial.print(array1[1]);
    Serial.print(array1[2]);
    Serial.print(array1[3]);
   
   
  Serial.flush();
 
delay (40);

}
}



anonimator


Por que a pesar de recibir un 1 en mi monitor serie no se me enciende el pin_rec = 12, en el cual he colocado un led con la funcion:


if(array1[3] == 1){
    digitalWrite(pin_rec, HIGH);
  }else{
    digitalWrite(pin_rec, LOW);
  }

Alguna idea ??????????????


#include <Servo.h>

Servo servo1;
Servo servo2;
int pin_motor = 11;
int pin_rec = 12;
char array1[4] = { '0', '0', '0', '0'};
int i;
void setup()
{
 
  Serial.begin(19200);
Serial.flush();


pinMode(pin_motor, OUTPUT);
pinMode(pin_rec, OUTPUT);
servo1.attach(9);
servo2.attach(10);

}
void loop() {
   if (Serial.available() >= 4){
        for ( int i = 0; i < 4; i++)
   array1 = Serial.read();

   }
  {
   
    Serial.print(array1[0]);
    Serial.print(array1[1]);
    Serial.print(array1[2]);
    Serial.print(array1[3]);
   
     if(array1[3] == 1){
    digitalWrite(pin_rec, HIGH);
  }else{
    digitalWrite(pin_rec, LOW);
  }
   
   Serial.flush();
 
delay (40);

}
}

MBrodi

Buenas, ten en cuenta que lo que recibes por el puerto serie es un char y se almacena en un array de chars. Cuando haces la comparacion con if para el valor de la posicion 3 del array lo comparas con un integer. No es lo mismo. Prueba a poner '1' en lugar de 1.
Saludos.

MBrodi

Por cierto, seria buena idea que añadieras un delay de 5 despues de la sentencia    
array1 = Serial.read(); en tu programa receptor. De otra manera te arriesgas a perder paquetes.

anonimator

Gracias MBrodi,  lo pruebo y te digo como me ha ido.
Saludos

anonimator

Ahora lo que me pasa es que al recibir un 1 en cualquiera de las posiciones del array1 se me enciende el led.

Alguna idea mas???

Saludos.

emmanuelp94

a mi me pasa algo parecido tengo el mismo problema   lo he intentando corregir asignando  valores al array  pero no queda si alguien tiene alguna idea este es mi codigo
const int sensor=A0;float temperatura;float temp;

float r1 = 10; float r2 = 1000;float vPow = 4.7;

const int puerta=2; const int led=13; int estado = 0;

int baterias=3; int estadobateria;

boolean sensores[4]={0,0,0,0};



void setup()
{
Serial.begin(9600);
//Serial.flush();
pinMode(puerta,INPUT);
pinMode(led,OUTPUT);
pinMode(baterias,INPUT);

}

void loop()
{
 
 temp=(analogRead(sensor)*5000L)/2023;
 temperatura=temp/10;

 
 if(temperatura>40)
 {
   sensores[0]='1';
   }
 else
 {
   sensores[0]='0';
   }  


 float v = (analogRead(1) * vPow) / 1024;
 float v2 = v / (r2 / (r1 + r2));

 delay (1000);
 if (v>4.5)
 {
   sensores[1]='1';
   }
   else
   {
     sensores[1]='0';
     }

 
 estado = digitalRead(puerta);


 if (estado == '1') {
   sensores[2]='1';
   
 }
 else {
   
   sensores[2]='0';
 }  

 
  estadobateria=digitalRead(baterias);
  if(estadobateria=0)
  {
   sensores[3]=='1';
   
   }
   else
   {
     sensores[3]=='0';
     }
     //Serial.print(sensores[0]);
     //Serial.print(sensores[1]);
     //Serial.print(sensores[2]);
    Serial.println(sensores[3]);
   

}


surbyte

Tema cerrado. 
Si te interesa el tema, comienza respetando las advertencias que recibes. Este Hilo estaba sin movimiento desde el 2013 y recibiste un Warning en letras rojas adviritiendote de no responder. 


Lee las normas del foro
No postees en estas sección que tiene un primer tópico que dice No usar esta sección del Foro.
Usa tags para postear códigos, enlaces e imágenes. Todo explicado en las Normas del foro. Ejemplo tu código esta mal posteado. Debe verse asi



Code: [Select]
void setup() {
   Serial.begin(9600);
   //Serial.flush();
   pinMode(puerta,INPUT);
   pinMode(led,OUTPUT);
   pinMode(baterias,INPUT);
}


Ves que cambio!!

Crea un nuevo hilo en la sección que corresponda a tu consulta.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy