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.
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.
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:
// 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).
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
leqos97:
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...
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.
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.