Go Down

Topic: Cambiar datos desde el monitor (Read 141 times) previous topic - next topic

leqos97

Hola! Soy nuevo en la programación de Arduino, pero no tanto en el tema de programación general.
Lo que estoy tratando de hacer es un termostato, que se pueda cambiar la temperatura deseada desde el monitor.
Intente hacerlo de esta forma.
Code: [Select]
void loop() {
if (Serial.available()){
  char a = Serial.read();
  String b = String(a);
  switch (a){
    case 48:
    Serial.println("Ahora escriba la temperatura que desee");
   
  }
}
}

Y la idea era que luego de presionar "0" (48) yo pudiese colocar la temperatura deseada.
Pero de esta manera, toma valores de cada letra/numero por individual. Como puedo lograr tomar un conjunto de numeros (ejemplo 28) y ponerle ese valor a una variable, que correponderia a la temperatura deseada.
 
Muchas gracais desde ya

msoffredi

Si eres programador, te recomiendo veas la funcion Serial.readStringUntil() para simplificarte la vida.
--------------------
Marcelo
arduinohobby.com

ArielP

Hola!
Tengo implementado algo parecido.

Básicamente, una app de Android manda via Bluetooth un par de bytes a un cochecito, que "ejecuta" comandos como "avanzar", "girar", etc en función de lo que ha recibido.

Siempre son dos bytes,el primero es el comando, el segundo es un "fin de comando", o sea,no se procesa.

Te paso una parte del código que escribí, seguramente se puede adaptar a tu proyecto:



Code: [Select]


// Variables vinculadas al bluetooth
int estado = 'D'; //inicia detenido
int comando = 'S';
 
long previousMillis = 0; //
long interval = 500;    //El intervalo entre cambios de estado baliza
unsigned long currentMillis = millis();


//-----------------------------------------------------------------------------------
// Rutina setup();
//-----------------------------------------------------------------------------------
void setup(){
  Serial.begin(9600); //Inicializa la comunicacin con la PC
  Serial1.begin(9600);//Inicializa la comunicacin con Bluetooth
  Serial.println("Conexion serie con la PC Ok");
  Serial1.println("Coche conectado OK");
  delay(500);
  Serial1.println("Motores detenidos.");
   
 
}




//-----------------------------------------------------------------------------------
// Rutina loop();    **** PROGRAMA PRINCIPAL ****
//-----------------------------------------------------------------------------------
void loop(){
 
         
  if (Serial1.available()>0) //Si hay texto en el buffer....
    {   estado = Serial1.read();
        Serial.print("Comando disponible ");       // Hay comandos disponibles       
        Serial.println(  (estado));
        controlMotores(estado);
     }
}



//-----------------------------------------------------------------
// Funciones utilizadas por el programa
//-----------------------------------------------------------------


//------------------------------------------------------
// Procesa un comando
//------------------------------------------------------
void controlMotores(char estado) {
  switch (estado) {
    case 'L':     //Giro a la izquierda
      motorGira(1,1);
      motorGira(2,2);
      luzStop( LOW );
      Serial.println("Giro a la izquierda...");
      break;
     
    case 'R':    //Giro a la derecha
      motorGira(1,2);
      motorGira(2,1);
      luzStop( LOW );     
      Serial.println("Giro a la derecha...");

      break;
           
    case'F':    //Avanza
      motorGira(1,2);
      motorGira(2,2);
      Serial.println("Avanzando..."); 
      luzStop( LOW );
      break;
         
    case 'B':    //retrocede
      motorGira(1,1);
      motorGira(2,1);
      luzStop( LOW );   
      Serial.println("Retrocediendo..."); 
      break;
     
    case 'S':    //detiene
      motorStop(1); //Detiene el motor 1
      motorStop(2); //Detiene el motor 2   
      luzStop( HIGH );
      delay(100);
      luzStop( LOW );
      Serial.println("Motores detenidos.");
      break;

    default:
      // Si no era nada de lo anterior, no hago nada

    break;
  }
}





Ten en cuenta que solo he puesto trozos del programa, es muy extenso y no aporta nada al hilo. Solo dejé la estructura que creo te puede ser útil. Con esto quiero decir que si lo compilas tal como está, seguramente va a arrojar un montón de errores (faltan las funciones que se llaman desde los "case", etc).

Suerte!

leqos97

#3
Aug 13, 2017, 02:51 am Last Edit: Aug 13, 2017, 03:58 am by surbyte
Agradezco la intención de ayudar. Y me serviria este código. El problema es que yo lo que necesito mandar, es mas de 1 sólo carácter/letra. Busco mandar, por ejemplo, "temp min 22". Y que cambie el valor de jna variable con el nombre de tempmin, a 22. Pero el la función Serial.read() sólo funciona con caracteres individuales. Hay alguna forma de tomar todos los caracteres ingresados, y no uno por uno? Gracias

Lucario448

Hay alguna forma de tomar todos los caracteres ingresados, y no uno por uno? Gracias
readString o readBytes.

Por cierto, ¿qué aplicación da las órdenes? Si dichas órdenes no tienen que ser leídas por un ser humano, la implementación de lo que quieres hacer sería más sencilla si los datos estuvieran en "forma binaria" y no como texto...

leqos97

Momentaneamente es a mano, con el monitor. Luego será con una aplicacion por bluethoot. Asi que es buena idea que lo haga con numeros de "forma binaria". Gracias.

Lucario448

Debo aclarar que "forma binaria" no significa hacer una cadena literal de 0 y 1; sino aprovechar el hecho de que en un solo caracter se puede representar un valor del 0 al 255.
No solo para representar números enteros, también se puede utilizar para otros propósitos como por ejemplo, dictar la manera en que los siguientes datos deben ser interpretados, o para qué serán utilizados.

Go Up