Mostrando entradas con la etiqueta funciones. Mostrar todas las entradas
Mostrando entradas con la etiqueta funciones. Mostrar todas las entradas

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 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 

viernes, 27 de diciembre de 2013

Arduino funcion de alineación en un LCD

Esta tarde he estado practicando con los LCD via I2C, y he programado esta función que alinea el texto a la derecha, a la izquierda, lo centra, lo muestra aleatiramente en una fila especifica o muestra el texto aleatoriamnete por todo el display.




El codifo fuente es este:


Código:
/*
Autor: Aitor Martin
Fecha: 27-12-2013
Titulo: 007 Posicionar texto en el LCD
Placa: Arduino uno
Post: 

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.

--------------------------------------------------------------------------------------

LA funcion:
lcd_posiciona (16, 2, 1, 5, "Hola Mundo");
16 = Numero de columnas del LCD.
2  = Numero de filas del LCD.
1  = Fila en la que quieremos mostrar el texto (la primera es 1).
5  = Modo de alineacion.
"Hola Mundo" = El texto que vamos a mostrar.

Modos de alineacion:

1 = Izquierda
2 = Derecha
3 = Centro
4 = Aleatorio aciendo caso a la fila
5 = Aleatorio y no hace caso a la fila
*/


#include <Wire.h> //Para usar el I2C
#include <LiquidCrystal_I2C.h>//Para usar el display I2C

LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2
 
void setup()
    {
    lcd.init();        //Iniciamos LCD
    lcd.backlight();   //Enciende la iluminacion
    }
 
void loop()
  {
  lcd_posiciona (16, 2, 1, 1, "Alin. Derecha"); //Llamada a la funcion
  delay(2000);    //Espera 2 segundos
  lcd.clear();    //Borra el LCD
  
  lcd_posiciona (16, 2, 1, 2, "Alin. Izquierda"); //Llamada a la funcion
  delay(2000);    //Espera 2 segundos
  lcd.clear();    //Borra el LCD
  
  lcd_posiciona (16, 2, 1, 3, "Alin. Centro"); //Llamada a la funcion
  delay(2000);    //Espera 2 segundos
  lcd.clear();    //Borra el LCD

  for (int i=0; i<10; i++)
    {  
    lcd_posiciona (16, 2, 1, 4, "Alin. Aleatoria"); //Llamada a la funcion
    lcd_posiciona (16, 2, 2, 4, "Respeta fila"); //Llamada a la funcion
    delay(1000);    //Espera 2 segundos
    lcd.clear();    //Borra el LCD
    }
  
  for (int i=0; i<10; i++)
    {
    lcd_posiciona (16, 2, 1, 5, "Hola Mundo");
    delay(1000);
    lcd.clear();
    }
  }

void lcd_posiciona (int lcd_largo, int lcd_alto, int lcdy, int centrar, String texto)

  {
   int lcdx = 0;
   int largo = texto.length();
   int sobrante = lcd_largo - largo;
   int random_sobrante = random (0, (sobrante + 1));
   int random_y = random (0, lcd_alto);
   
   lcdy = lcdy - 1;
   
   switch (centrar)
     {
     case 1: lcdx = 0; break;
     case 2: lcdx = sobrante; break;
     case 3: lcdx = sobrante / 2; break;
     case 4: lcdx = random_sobrante; break;
     case 5:
             lcdx = random_sobrante;
             lcdy = random_y;
             break;
     default: 
     delay(0);// sentencias
     }

    lcd.setCursor(lcdx, lcdy);//Manda texto a las cordenadas calculadas
    lcd.print
(texto);
  } 


domingo, 15 de diciembre de 2013

Lazarus convertir Boolean a String

Hace unos segundos me he visto en la necesidad de convertir un dato Boolean en uno tipo String y como no sabia si lazarus incorporaba o tenia esta función, he hecho una búsqueda en internet y me he encontrado con esta función muy simple y socorrida:

Código:
function booltostr(n: boolean):string;
begin
  if n = true then result := 'true'
  else result:='false';
end;  

Supongo que no hace falta explicar que para utilizarla podemos hacer una llamada tipo booltostr():

Código:
procedure TForm1.CheckDesbloquearSalidasChange(Sender: TObject);
begin
    if (CheckDesbloquearSalidas.Checked = false) then
    begin
     ShowMessage('Ahora el estado de las salidas es: '+ booltostr(CheckDesbloquearSalidas.Checked));
    end;
end;  

Este artículo basado en este post:

martes, 1 de octubre de 2013

Lazarus ejecutar o usar una función que esta gurdada en otra unidad

Para depurar el codigo fuente mas facilmente y por otros muchos movitivos me gusta guardar todas las funciones juntas en un mismo archivo. Despues de insistir un poco tube que preguntar en el foro y me diero esta solucion:

http://www.clubdelphi.com/foros/showthread.php?t=84272

Mi herror era el no poner el implementation del Unit1 el comando  uses Unit2;.


Código:
 unit Unit1;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls;
 
 type
   TForm1 = class(TForm)
     Button1: TButton;
     Edit1: TEdit;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
 
 var
   Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 uses Unit2;
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
    Edit1.Text := ReverseString(Edit1.Text);
 end;
 
 end. 



Con eso ya estaria listo y podriamos acceder a Unit2. Otra cosa muy importantes que no s tenemos que olvidar de poner en el implementation del Unit2 es el uses Unit1, ya que lo contrario no podriamos acceder y modificar propiedades de los componentes del form1...

Código:
unit Unit2;

interface

// Cabecera de Funciones y Procedimientos de Unit2 visibles en otras unidades

implementation

uses Unit1; // Referencia a Unit1

// Implementación de Funciones y Procedimientos de Unit2 (Internas y Externas)

end.

sábado, 13 de julio de 2013

Lazarus Borrar los EDIT y MEMO de golpe

Aun no he tenido tiempo de probar esta función que me paso un conocido por E-mail hace varios años, pero la voy a publicar ya que me parece muy interesante:

 
Código:

procedure TForm1.Button1Click(Sender: TObject);

  procedure VaciaComponentesDeEdicion;
  var
    n : integer;
  begin
    for n:=0 to Pred(ComponentCount) do begin
      //Recorremos los componentes de la form y los vaciamos
      if Components[n] is TEdit then TEdit(Components[n]).Clear
        else
      if Components[n] is TMemo then TMemo(Components[n]).Lines.Clear
        else
      if Components[n] is TDBEdit then TDBEdit(Components[n]).Clear;
    end;
  end;

begin
  VaciaComponentesDeEdicion;
end;

lunes, 8 de julio de 2013

Lazarus invertir el orden de una cadena de string

Para dar la vuelta a un string o mejor dicho para invertir su orden podemos utilizar esta instrucción:

Código:

ReverseString(string_a_invertir );

Para utilizar esta instrucción hay que poner en el uses un enlace a las StrUtils.

Código:

uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, StrUtils; type { TForm1 }

sábado, 6 de julio de 2013

Programando en Lazarus, presentación

Hacia tiempo que no programaba en ningún leguaje de programación, ufff por lo menos 10 años... A pesar que durante estos últimos años he estado programando en HTML y PHP se puede decir que que he empezado prácticamente desde 0 con Lazarus.

Hace muchos años aprendi a programar en turbo pascal y luego me pase al delphi, pero lo tuve que dejar por que los estudios me absorbía mucho tiempo (sobretodo el viaje).

He decidido crear este otro bogg para tener mis apuntes siempre a mano en cualquier lugar del mundo, y no los quiero postear en mi otro bogo ya que esta mas orientado hacia la artesanía...