domingo, 5 de enero de 2014

Arduino cast o truncar un número foat para Convertit float a int, convertir int a byte...

Según el manual de referencia de Arduino, el operador cast (convertidor de tipos) traduce de un tipo de variable a otra y fuerza que los cálculos se realicen según en el nuevo tipo de variable.

Ejemplo
int i;
float f;
f = 3.6;
i = (int) f; // ahora i es 3

Nota
Cuando hacemos un casting de un float a un int (coma flotante a entero) el valor es truncado, no redondeado. Así que por ejemplo, tanto (int) 3.2 como (int) 3.7 acaban siendo 3.

Fuente: http://arduino.cc/es/Reference/Cast

Una ved llegados a este punto podemos pensar que cast no muy útil puesto que al utilizarlo perdemos los decimales. Pero existe un truco para pasar un valor foat a int sin perder las decimales. Imaginemos que estamos trabajando con un termometro que nos mide la temperatura en grados, y el valor entregado lo tenemos almacenado en una variable float, y nosotros queremos pasarlos a una variable tipo int con dos decimales de precisión. Para solventar este problema, tenemos que trabajar en fracciones de la unidad (décimas, centésimas, milésimas) y escoger la unidad que mejor se ajuste a nuestras necesidades.

En este ejemplo que me puso noter en el foro de arduino se ve claramente a que me refiero:

Código:
float grados=27.56;
int centGrados= grados*100.0; // centGrados=2756
Serial.print(centGrados/100); // Imprime 27
Serial.print(",");
Serial.print(centGrados%100);// Imprime 56 

Fuente: http://forum.arduino.cc/index.php?topic=208565.0

Gracias a ehrja y noter por enseñarme este truco.

sábado, 4 de enero de 2014

Arduino Histeresis, retardo o tolerancia de una medida

Normalmente se le llama histeresis a una tolerancia o retardo que tiene un material. Imaginemos que nuestro arduino esta midiendo la temperatura de un liquido que tiene que empezar a fluir a los 30ºC y tiene una tolerancia de 2ºC pues nuestro liquido fluiría entre los 28 y los 32ºC.

De esta forma nosotros podríamos calentar el liquido hasta alcanzar los 33ºC y dejar de calentarlo hasta que la temperatura leída sea menor que 30ºC pero pero superior a 28ºC....

Con esta función calculamos la histeresis de un número:

Código:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2

int tolerancia = 5;

void setup() 
  {
  lcd.init();
  lcd.backlight(); //enciende la iluminacion 
  }

void loop() 
  {
    Histeresis (random(-10, 10), random(-10, 10), tolerancia );
    delay(2000);
  }
// x = Es un valor fijo, por ejemplo el que hemos programado o estipulado.
// y = Puede ser el valor obtenido por una sonda.
// t = La tolerancia o magen que hemos estipulado, la histeresis.

void Histeresis (int x, int y, int t)
  {
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("X: ");
    lcd.print(x);
    lcd.print(" Y: ");
    lcd.print(y);
    lcd.setCursor(0, 0);
    lcd.print("Tol: ");
    lcd.print(t);
    lcd.setCursor(6, 0);

    int superior, inferior = 0;
    superior = x + t; //valor fijo + tolerancia
    inferior = x - t; //valor fijo + tolerancia
    if ((y >= inferior) && (y <= superior))
      {
      lcd.print(" Si");
      }
      else
      {
      lcd.print(" No");
      }
  }



viernes, 3 de enero de 2014

Arduino Obtener el taño de un aray 2D con sizeof();

Hacia tiempo que estaba atascado con un programa, necesitaba recorrer un array multidimensional o array 2D del cual desconocía el tamaño o número de filas.

Código:
int ProgTemporizador [][7] = 
  {
  //Fecha, Mes, Año, Hora, Minutos, Salida, Estado  
  {2014, 1, 2, 10, 12, 0, 1},
  {2014, 1, 2, 10, 13, 0, 0},
  {2014, 1, 2, 10, 13, 1, 1},
  {2014, 1, 2, 10, 14, 1, 0}
  };



Después de preguntar en el foro de arduino, noter me dio la solución. Cuando hacia sizeof(ProgTemporizador); el resultado que obtenía era 56 y yo me pensaba que estaba haciendo algo mal. Pero no es así, ya que sizeof(); no el número de filas de un array, si no que nos devuelve tamaño en bytes del array. Para obtener el número de filas de un array en nuestro caso tenemos que dividir el resultado por 14:

Si hacemos un sizeof(ProgTemporizador); obtenemos  56 (4*7*2), que es el resultado de la mutiplicación del número de filas del array por El número de columnas del array por 2 ya que un INT ocupa 2 bytes.

Código:
int ProgTemporizador [][7] = 
  {
  //Fecha, Mes, Año, Hora, Minutos, Salida, Estado  
  {2014, 1, 2, 10, 12, 0, 1},
  {2014, 1, 2, 10, 13, 0, 0},
  {2014, 1, 2, 10, 13, 1, 1},
  {2014, 1, 2, 10, 14, 1, 0}
  };

void setup()
  {
  Serial.begin(9600); 
  }

void loop()
  {
  int x = sizeof(ProgTemporizador);   
  x = (x / 7) / 2;
  //x = x / 14; Mas facil seria dividirlo por 14...
  Serial.print ("Numero X = ");
  Serial.println (x);
  for (int i=0; i < x; i++)
    {
      for (int n=0; n < 7; n++)
        {
          Serial.print(ProgTemporizador [i][n]);
          Serial.print("   ");
        }
    Serial.println();    
    }
  Serial.println ("-----------------------------------------------------");  
  delay(5000);
  }

Fuente: http://forum.arduino.cc/index.php?topic=208323.0

Arduino Funcion para obtener la fecha en modo texto

Hace un rato me he encontrado con esta funcion que ha publicado jalfonsosuarez en el foro de arduino, y me ha parecido muy interesante, ya que con ella se puede pasar una fecha obtenida del relog en tiempo real (RTC) a modo texto muy facilmente y con poco codigo:

Código:
/*
FUNCION PARA OBTENER LA FECHA EN MODO TEXTO
Devuelve: DD-MM-AAAA HH:MM:SS
*/
String dimeFecha()
  {
  char fecha[20];
  DateTime now = RTC.now(); //Obtener fecha y hora actual.
        
  int dia = now.day();
  int mes = now.month();
  int anio = now.year();
  int hora = now.hour();
  int minuto = now.minute();
  int segundo = now.second();
        
  sprintf( fecha, "%.2d.%.2d.%.4d %.2d:%.2d:%.2d", dia, mes, anio, hora, minuto, segundo);
  return String( fecha );
  }

Fuente:
http://forum.arduino.cc/index.php?topic=207403.0