jueves, 13 de agosto de 2020

ARDUINO - C - ¿Encender led's de un circuito al pulsar teclas?

    En el código que detallo a continuación se encienden ciertos led's al pulsar la tecla que corresponde al puerto digital al que hemos conectado cada uno de los led. Por ejemplo si pulsamos el 0, se encenderá o se apagará el led conectado al puerto 10 digital de nuestro arduino. Y si pulsamos el 3, pues el led conectado al puerto 13.


   Este es nuestro código en C ...

 // Array del 0 al 3 para usar los puertos digitales del 10 al 13
bool   puerto[4];


// Variable que usaremos para capturar el teclado 
char   Captura;


// Para convertir el Char en String
String capturaS;


void setup()
{
  // Preparamos los puertos digitales del 10 al 13 para ser de salida
  for (int i = 10; i <= 13; i++)
  {
    pinMode(i, OUTPUT);
  }
  
  // Se abre la comunicación tipo Puerto Serie a 9600 baudios
  Serial.begin(9600);
}


void loop()
{
  // Vaciamos la tecla capturada
  Captura = ' ';
  capturaS = "";
  
  if (Serial.available() > 0) 
  { 
    // Si la librería Serial mediante available es mayor que 0, entonces es que está funcionando el puerto serie
    // Leemos el puerto Serie para ver si han pulsado algo
    Captura = Serial.read();
    
    // Convierto el char en String para luego poderlo convertir en entero
    capturaS = Captura; 


    // Avisamos si no ha pulsado la tecla correcta
    if (    (Captura != '0')
         && (Captura != '1')
         && (Captura != '2')
         && (Captura != '3') )
    {
      // Como tenemos la comunicación serial abierta con la terminal
      // presentamos mensaje de elección incorrecta
      Serial.println("No es correcto, elija entre 0-3");
    }
  }


  for (long i = 10; i <= 13; i++) // Recorro los puertos digitales del 10 al 13
  {
    if (
         // Convierto el valor de la tecla pulsada en entero
         // y le sumo 10 para ver a que puerto digital relaciono
         ((capturaS.toInt() + 10) == i) && 


         // El puerto serie nos puede devolver algo sin pulsar
         ((capturaS) != "" )
       )
    {
      // Guardamos el On/Off del puerto
      puerto[(i - 10)] = not puerto[(i - 10)];
      // Le decimos al puerto que se ponga en On o en Off
      digitalWrite(i, puerto[(i - 10)]);
    }
  } 
 
}

   Este sería el esquema del circuito que deberíamos de crear para que este código funcionara ...



ARDUINO - C - ¿Cómo convertir un Char a un String?

    Imaginemos que capturamos por el puerto serie del arduino algo pulsado desde la terminal o enviado al puerto serie. Lo que recibimos lo podemos capturar como si fuera un Char, pero luego necesitaríamos convertirlo a String para trabajarlo. ¿Cómo lo haríamos? ...

   Pues tan sencillo como este código que a continuación os presento ...

char Captura; 
String capturaS;


void setup()
  // Se abre la comunicación tipo Puerto Serie
  // Estamos usando una librería de Arduino que abre su puerto serie a 9600 baudios
  Serial.begin(9600);
}


void loop()
{
  Captura = ' ';
  
  if (Serial.available() > 0) 
  { 
    // Si la librería Serial mediante available es mayor que 0, entonces es que está funcionando el puerto serie
     // Leemos el puerto Serie para ver si han pulsado algo
    Captura  = Serial.read();


     // Convierto el char en String, así podría convertir el string a entero con toInt()
    capturaS = Captura;
}


ARDUINO - C - ¿Cómo convertir un String a un entero ó a un Float?

   La clase string dispone de las funciones toInt() y toFloat() que convierten, respectivamente, la cadena de texto a un número entero o flotante.

   Así, el código siguiente muestra la conversión de String a Int ...

#define DEBUG(a) Serial.println(a);
String var_Text = "-98765";


void setup() 
{
  Serial.begin(9600);
  long valor;
   valor = var_Text.toInt();
   DEBUG(valor);
}
 
void loop()
{
}

   Pero la conversión de String a Float sería la siguiente ...

#define DEBUG(a) Serial.println(a);
String var_Text = "-987.65"; 
void setup() 
{
  Serial.begin(9600);
  float valor;
   valor = var_Text.toFloat();
   DEBUG(valor);
}
 
void loop()
{
}

   La conversión a través de la clase String es una clase muy ligera para que no nos penalice su uso. Pero debemos de controlar que no existan caracteres no numéricos a la hora de convertir a entero o float para que no tengamos procesos no controlados.

   Existen otros métodos, pero de momento este es el que más uso.