Ingresar varios datos por serial.read()

hola, es mi primer posteo, mi duda es la siguiente, tengo que hacer lo siguiente,enviar 2 valores por seiral, es asi tengo un motor DC montado con un puente H (para que gire el motor en 2 sentidos, izquierda (I) y derecha(D) y ademas necesito enviar el tiempo que va a estar girando en ese sentido utilizando delay. estuve usando ARRAY donde paso los 2 valores el sentido y el tiempo, y hasta ahora no lo pude ahcer funcionar.
codigo:

int neg=3; 
int pos=4;
int input=0;
int letra[1];
int segundos = 1000;
int tiempo = 1;

void setup(){
  Serial.begin(9600);
  pinMode(neg, OUTPUT);
  pinMode(pos, OUTPUT);
}
void loop(){

  if (Serial.available())
  {
   letra[0] = Serial.read(); 
   letra[1] = Serial.read();
  if (letra[0]==100 )//El motor girará a la derecha 100 = d en ascii
  {   
  analogWrite(neg, 0);
  analogWrite(pos, 255);    
  Serial.println("La lavadora esta bate a la derecha ");
  delay (letra[1] * segundos);
  analogWrite(pos, 0);
  }
  else if (letra[0]==105 ) { //El motor girará a la izquierda  105= i en asii
  analogWrite(pos, 0);
  analogWrite(neg, 255);    
  Serial.println("La lavadora esta bate a la izquierda ");
  delay (letra[1] * segundos);
  analogWrite(neg, 0);
  }
  else if (letra[0]=='0')//El motor se detendrá
  { 
  digitalWrite(neg, LOW);
  digitalWrite(pos, LOW);
  Serial.println("Lavadora apagada ");
  }
  }
}

Lo primero que te voy a recomendar es que leas las normas del foro y en especial el punto 7. Como insertar code tag.
Vuelves a tu post, vas a More, luego Modify, seleccionas todo el código y click en el ícono </>.

Ya está Ricardo. Lo hice yo. Prometo que lo haré por única vez, así le doy posibilidad de aprender como debe hacerlo.

:slight_smile:

leeré las normas, gracias por corregirme

delay (letra[1] * segundos);
// Si letra[1] == '1', entonces delay(47 * segundos)?

Eso es lo que pretendes? Si no es así, entonces:

letra[1] = Serial.read(); // No
letra[1] = Serial.parseInt(); // Sí

Lucario448:

delay (letra[1] * segundos);

// Si letra[1] == '1', entonces delay(47 * segundos)?



Eso es lo que pretendes? Si no es así, entonces:



letra[1] = Serial.read(); // No
letra[1] = Serial.parseInt(); // Sí

gracias por contestar, lo que necesito es lo siguiente
necesito por sonsola enviar 2 cosas el sentido y el delay por ejemplo D, 1. Donde D ira en sentido derecha y 1 durara 1 segundo

int pos=7; //Pines de salida del Arduino
int neg=6;
char letra;
int tiempo;
void setup(){
    Serial.begin(9600);
    pinMode(neg, OUTPUT);
    pinMode(pos, OUTPUT);
}
void loop(){
    if (Serial.available()){
    letra = Serial.read();    
    if (letra=='d' || letra=='D'){ //bate a la derecha
    analogWrite(pos, 255);
    Serial.println("La lavadora bate a la derecha ");    
    delay (1000);// lo que necesito ingresar en lugar de 1000, ingresarlo por consola
    analogWrite(pos, 0);
    }
    else if (letra=='i' || letra=='I') { //bate a la izquierda
    analogWrite(neg, 255);
    Serial.println("La lavadora bate a la izquierda ");
    delay (1000); //  lo que necesito ingresar en lugar de 1000, ingresarlo por consola
    analogWrite(neg, 0);
    }
    else if (letra=='0'){ //Se detiene
    analogWrite(pos, 0);
    analogWrite(neg, 0);
    Serial.println("Apagada ");
    }
    }
}

juancis82:
necesito por sonsola enviar 2 cosas el sentido y el delay por ejemplo D, 1. Donde D ira en sentido derecha y 1 durara 1 segundo

Tu problema es fácil de solucionar. Si en la consola digitas "D1", el primer Serial.read() devolverá 'D'; el segundo Serial.read() devolverá '1'.

Nótese bien que el número está entre comillas simples, esto porque lo que se lee es un caracter, no el número en sí. Todo lo que ingreses a la consola del monitor serie, se recibe como texto (comprensible para el ser humano), no en su "forma binaria" si se tratasen de números (comprensible para la máquina).

Por eso, si lees ese '1' tal y como se recibe (como texto); entonces a la hora de involucrarlo en una operación matemática, ese dato se interpretaría con el valor decimal 47 (según la tabla ASCII).

Si lo que quieres es que se lea como un número en verdad, usa la función Serial.parseInt()

PD: si vas a separar los datos con espacios o comas, ahí ya habría que usar strtok u otro método que descarte los caracteres sobrantes...