El entorno Delphi con el lenguaje pascal sigue vigente en la actualidad y su uso en Arduino está creciendo cada vez más.
unit Principal;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, CPort;
type
TForm1 = class(TForm)
Label_Titulo: TLabel;
Label_Mensajes: TLabel;
Button_ON: TButton;
Button_OFF: TButton;
Button_COM: TButton;
Button_Abrir: TButton;
Memo_Mensajes: TMemo;
Button_Limpiar: TButton;
ComPort1: TComPort;
procedure Button_ONClick(Sender: TObject);
procedure Button_OFFClick(Sender: TObject);
procedure Button_COMClick(Sender: TObject);
procedure Button_AbrirClick(Sender: TObject);
procedure Button_LimpiarClick(Sender: TObject);
procedure ComPort1AfterClose(Sender: TObject);
procedure ComPort1AfterOpen(Sender: TObject);
procedure ComPort1RxChar(Sender: TObject; Count: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button_AbrirClick(Sender: TObject);
begin
// Si el puerto está conectado.
if ComPort1.Connected then
begin
ComPort1.Close; // Cierra el puerto.
Button_COM.Enabled := True;
Button_ON.Enabled := False;
Button_OFF.Enabled := False;
end
else // En caso contrario.
begin
ComPort1.Open; // Abre el puerto.
Button_COM.Enabled := False;
Button_ON.Enabled := True;
Button_OFF.Enabled := True;
end;
end;
procedure TForm1.Button_COMClick(Sender: TObject);
begin
ComPort1.ShowSetupDialog; // Abre la configuración del puerto.
end;
procedure TForm1.Button_LimpiarClick(Sender: TObject);
begin
Memo_Mensajes.Clear(); // Limpia los mensajes del Memo.
end;
procedure TForm1.Button_OFFClick(Sender: TObject);
begin
ComPort1.WriteStr('Luz_OFF'); // Envía el comando "Luz_OFF" al puerto.
end;
procedure TForm1.Button_ONClick(Sender: TObject);
begin
ComPort1.WriteStr('Luz_ON'); // Envía el comando "Luz_ON" al puerto.
end;
procedure TForm1.ComPort1AfterClose(Sender: TObject);
begin
if Button_Abrir <> nil then
Button_Abrir.Caption := 'Abrir';
end;
procedure TForm1.ComPort1AfterOpen(Sender: TObject);
begin
Button_Abrir.Caption := 'Cerrar';
end;
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
// Recibe mensajes desde Arduino.
ComPort1.ReadStr(Str, Count);
// Muestra los mensajes en pantalla.
Memo_Mensajes.Lines.Add( Str );
// Guarda los mensjes de Arduino en un archivo txt.
Memo_Mensajes.Lines.SaveToFile('archivo.txt');
end;
end.
// ----- Electrónica PIC -----
//
// Ejercicio 2.
//
// Encendido y apagado del Led 13 mediante puerto serie con pantalla.
// Es lo mismo que el Ejercicoi 1, pero usando el LCD Keypad Shield.
#include
// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
// LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Pin 10 para saber que es luz de fondo.
const byte LuzFondo = 10;
const byte Led = 13; // Declaramos la variable pin del Led.
char caracter;
String comando;
void setup()
{
pinMode(Led, OUTPUT); // Inicializa el pin del LED como salida:
Serial.begin(115200); // Puerto serie 115200 baudios.
lcd.begin(16, 2); // Formato de pantalla.
lcd.clear(); // Borra la pantalla y su posición superior izquierda.
lcd.print(" Arduino ");
delay(1000);
}
void loop()
{
/*
Voy leyendo carácter a carácter lo que se recibe por el canal serie
(mientras llegue algún dato allí), y los voy concatenando uno tras otro
en una cadena. En la práctica, si usamos el "Serial monitor" el bucle while
acabará cuando pulsamos Enter. El delay es conveniente para no saturar el
canal serie y que la concatenación se haga de forma ordenada.
*/
while (Serial.available() > 0)
{
caracter = Serial.read();
comando.concat(caracter);
delay(10);
}
/*
Una vez ya tengo la cadena "acabada", compruebo su valor y hago que
la placa Arduino reacciones según sea este. Aquí podríamos hacer lo
que quisiéramos: si el comando es "tal", enciende un Led, si es cual,
mueve un motor... y así.
*/
// Si los carácteres es recibido y verdadero.
if (comando.equals("Luz_ON") == true)
{
digitalWrite(Led, HIGH); // Enciende el Led 13.
Serial.write("ON - Led encendido."); // Envía este mensaje al PC.
lcd.setCursor(0, 1);
lcd.print("Luz ON. "); // Mostrar en el LCD.
}
if (comando.equals("Luz_OFF") == true)
{
digitalWrite(Led, LOW); // Apaga el Led 13.
Serial.write("OFF - Led apagado. "); // Envía este mensaje al PC.
lcd.setCursor(0, 1);
lcd.print("Luz OFF. "); // Mostrar en el LCD.
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando = "";
}
Ver vídeo:
Autor: Ángel Acaymo M. G.
Descarga:
XPS
XPS
Ejemplos con librería 653 KB.
Ejemplos con librería 653 KB.
Librería ComPort oficial.
Librería desde Electrónica PIC X.XX KB.
Librería desde Electrónica PIC. X.XX KB.
2 comentarios:
Hola Angel.
Estaba buscando la manera de poder leer en el PC lo que mando al puerto serie con el Arduino mediante Delphi y me encontré con tu magnífico tutorial, que más allá del ejemplo concreto me ha servido para aclararme con la inclusión de librerias externas porque estoy iniciándome con Delphi, pero me ha surgido un error intentar compilar "DsgnCPortDXE.dpk" me dice:
[dcc32 Fatal Error] DsgnCPortDXE.dpk(34): E2202 Required package 'CPortLibDXE' not found
Y no me deja instalar el paquete. Así que no puedo pasar de la página 90 del tutorial.
A ver si me podrías indicar qué estoy haciedno mal. Gracias
Hola Agustín:
Nunca me ha pasado ese error. Desinstala todo el paquete, lo vuelves a instalar paso a paso.
Lo que te dice es que no lo tienes instalado, cuando lo instales, prueba los ejemplos.
Saludos.
Publicar un comentario