Duda con If-Else

Pues estoy tratando de variar los actos en funcion del numero enviado pero no soy capaz de dar en el clavo :S
Si pongo

if(numEntrada == 0)
{
hace una cosa
}

else if(numEntrado ==1)
{
hace otra cosa
}
..
..

else{
Hace lo ultimo si no encuentra nada
}

Pues solo me hace el Primero If y el ultimo else y n ose a que se debe :S
Alguna idea?
gracias

¿Puedes poner el código exacto?
¿Has probado con switch? http://arduino.cc/en/Reference/SwitchCase

Como dice complubot, sin ver el código…

Por lo pronto se me ocurre que el valor que esté devolviendo la variable que monitorizas no te esté dando valores exactos (ej., 0, 1, 2, …), sino decimales (ej., 0.5, 1.1,…) En ese caso, al no corresponderse de forma exacta no te hace lo que tu quieres… Pero supongo que eso ya lo has considerado, no?

en mi caso trabajaba con numeros decimales, así que lo hice de esta menera:

void WindSpeed(){
  speedwind = ((2 * pi * radio * RPM)/60) / 1000;  // Calculate wind speed on m/s
  if (speedwind <= 0.3){                           // Calculate Wind force depending of wind velocity
    windforce = 0;  // Calm
  }
  else if (speedwind <= 1.5){
    windforce = 1;  // Light air
  }
  else if (speedwind <= 3.4){
    windforce = 2;  // Light breeze
  }
  else if (speedwind <= 5.4){
    windforce = 3;  // Gentle breeze
  }
  else if (speedwind <= 7.9){
    windforce = 4;  // Moderate breeze
  }
  else if (speedwind <= 10.7){
    windforce = 5;  // Fresh breeze
  }
  else if (speedwind <= 13.8){
    windforce = 6;  // Strong breeze
  }
  else  if (speedwind <= 17.1){
    windforce = 7;  // High wind, Moderate gale, Near gale
  }
  else if (speedwind <= 20.7){
    windforce = 8;  // Gale, Fresh gale
  }
  else if (speedwind <= 24.4){
    windforce = 9;  // Strong gale
  }
  else if (speedwind <= 28.4){
    windforce = 10;  // Storm, Whole gale
  }
  else if (speedwind <= 32.6){
    windforce = 11;  // Violent storm
  }
  else {
    windforce = 12;  // Hurricane (from this point, apply the Fujita Scale)
  }
}

y funciona sin problemas.

No se si te sirve la idea… otra cosa no se me ocurre a si a voz de pronto…

[edit]Otra idea:
pon un serial.print(numEntrada) justo antes del primer if. De esa forma verás que valor te devuelve, y así poder saber si el error viene de antes, o si de verdad de trata de un problema en la cadena if-else.[/edit]

Pues con el case me hace lo mismo
El programa en sí consiste en:
Envio por una interfaz en java un numero a la placa arduino ,y segun el resultado del numero pues me debe hacer una u otra cosa
Pongo el codigo de java que envia el numero

try {
settings = new Parameters();
} catch (Exception ex) {
Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE, null, ex);
}

settings.setPort(“COM7”);
settings.setBaudRate(“9600”);
settings.setByteSize(“8”);
settings.setStopBits(“1”);
settings.setParity(“N”);
//Instance COM7.

try {
com7 = new Com(settings);
Thread.sleep(2000);
com7.sendSingleData(numero);

// Settings parameters COM·.
} catch (Exception ex) {
Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE, null, ex);
}
try {
com7.close();
} catch (Exception ex) {
Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE, null, ex);
}

Y el de arduino :

if (Serial.available()) {

entrada = Serial.read();

switch (entrada) {
case 0:
{
lcd.clear();
lcd.printIn(“Robot encendido”);
servo1.write(90);
delay(20);
delay(1000);
break;
}
case 1:{
lcd.clear();
lcd.printIn(“Robot apagado”);
servo1.write(0);
delay(20);
delay(1000);
break;
}
default:
break;
}

lcd.clear();
lcd.printIn("Esperando… ");
Serial.flush();

}

Con todo eso solo me entra en el case 0,es decir ,cuando escribo 0 me manda el mensaje de ese case,pero con el 1 no me hace nada :s

¿pero has comprobado que entran todos los valores en el arduino? Así sabrías si el problema está en el programa de java o en el código de arduino...

He comprobado valor a valor y no me pilla el == 1, pero si pongo >1 y envio 1 entra en ese if pero con el case no me entra nada mas en el 0 :S

Hola prueba con ' '
es decir

if(numEntrada == '0')
{
hace una cosa
}

vigila siempre el formato en el que recibes la información, que tengas suerte.

Salu2

he probado a enviarle una cadena de texto e intento obtenerla en arduino de la siguiente forma sin exito:

int i = 0;
char buffer [33] ="";
while((buffer*=(char)Serial.read())!= '(')*

  • {*
  • i++;*
  • }*
    La envio desde java con el caracter ( para diferenciar el final pero no hace nada :S

Bueno, vamos un poco con las cosas “obvias” que suelen ser las responsables del 80% de los problemas:

  • Has configurado la misma velocidad en ambos dispositivos (PC y Arduino)

  • ¿Qué tipo de dato es “numero” en el programa JAVA?

  • ¿Estamos seguros que “com7.sendSingleData(numero);” manda un único byte? (yo de JAVA ni idea)

Igual es una tontería pero yo nunca pongo {} dentro de los “case” del switch

numero lo envio desde java siendo un string , y en la placa arduino lo leo asi:
if (Serial.available()) {

int i = 0;
char buffer [33] ="";
while((buffer*=(char)Serial.read())!= '/' )*

  • {*
  • delay(2000);*
  • i++;*
  • }*
    lcd.clear()
    lcd.printIn(buffer);
    delay(2000);
    Donde '/' es el caracter de control, pero de esta forma en buffer no me sale nada :S
    "com7.sendSingleData(numero); segun la api envia tanto string,como char,como int,yo le mando el string y luego con el arduino intento que me lea caracter por caracter,aunque no se si lo esoy haciendo bien
    Y la velocidad tengo puesto 9600 en ambos programas

Bueno he hecho nuevas pruebas,le e estado enviando numeros y mostrandolos por pantalla haber si los enviaba bien,pero hay algun roblema y no se el porque,si le envio 0 si me muestra 0,si le envio 1 muestra el 6,si envio el 2 muestra el 24… vamos que o no me envia el numero bien o el arduino me lo lee erroneamente :S

numero lo envio desde java siendo un string

String.... Sería mejor asegurarnos que envías un único byte

He probado de varis maneras, enviando como string e intentar leyendo en arduino caracter a caracter ,con este metodo no consigo nada,salvo que la placa se me quede colgada, enviando enteros, que pasa lo que puse antes,si envio 0 me lee 0,si envio 1 me manda un 6 etc
Como me dices por bytes como seria? como se envia 1 por byte y como se lee ese 1 ?

¿No puedes definir una variable como "byte" o "unsigned char"?, de esta forma nos aseguramos que se envía un único byte. Si mandas un entero, no mandas un único byte. Me da a mi que el problema está en esto.

Pero si envio un byte desde java como leo desde arduino ese byte ,declaro un byte n; ? y como paso ese byte a cadena para poder mostrarlo por pantalla?

La función Serial.read() de arduino lee un único byte cada vez (un número comprendido entre el 0 y el 255). Tu puedes meter ese valor en un int o donde quieras, pero es un solo byte.

Si desde Java (o cualquier otro lenguaje) envias más de un byte, te encuentras con una situación no controlada.

Imagina que desde Java mandas un int, y que es un int de 16 bits, cuando lo mandes por el puerto serie, la función correspondiente mandará 2 bytes, sea cual sea el valor de dicha variable.

Lo que tienes que conseguir es asegurarte que desde JAVA mandas un único byte cada vez.

Pero si desde java envio un 1 ,es un byte no?esque si le envio un 1 me llega un 6 a arduino :S

Lo lees con Serial.read() y lo guardas donde quieras (int, unsigned char...)

Si mandas un "1" en binario y quieres visualizarlo, lo primero que tienes que hacer es ponerlo en ASCII (le sumas 48 en decimal para los dígitos del 0 al 9).

Si mandas el número (un dígito) como un byte en ASCII, (48 para el 0, 49 para el 1...) Solo lo tienes que leer con SerialRead y meterlo en el Arrray.

Un string no es más que un array de char que termina con un delimitador (null)