Ir al contenido


Foto

[TUTORIAL] Arduino Delphi 10.2 y Puerto serie


  • Por favor identifícate para responder
1 respuesta en este tema

#1 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 24 mensajes

Escrito 18 julio 2017 - 11:05

95.png

Tutorial Arduino Delphi 10.2 y Puerto serie. Interfaz creado con Delphi que puedes controlar el puerto serie a Arduino encendiendo y apagando un Led, manejar el LCD y recibes mensajes hacia el PC.

El entorno Delphi con el lenguaje pascal sigue vigente en la actualidad y su uso en Arduino está creciendo cada vez más.

83.png

Código fuente de Delphi:




delphi
  1. unit Principal;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, CPort;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Label_Titulo: TLabel;
  12. Label_Mensajes: TLabel;
  13. Button_ON: TButton;
  14. Button_OFF: TButton;
  15. Button_COM: TButton;
  16. Button_Abrir: TButton;
  17. Memo_Mensajes: TMemo;
  18. Button_Limpiar: TButton;
  19. ComPort1: TComPort;
  20. procedure Button_ONClick(Sender: TObject);
  21. procedure Button_OFFClick(Sender: TObject);
  22. procedure Button_COMClick(Sender: TObject);
  23. procedure Button_AbrirClick(Sender: TObject);
  24. procedure Button_LimpiarClick(Sender: TObject);
  25. procedure ComPort1AfterClose(Sender: TObject);
  26. procedure ComPort1AfterOpen(Sender: TObject);
  27. procedure ComPort1RxChar(Sender: TObject; Count: Integer);
  28. private
  29. { Private declarations }
  30. public
  31. { Public declarations }
  32. end;
  33.  
  34. var
  35. Form1: TForm1;
  36.  
  37. implementation
  38.  
  39. {$R *.dfm}
  40.  
  41. procedure TForm1.Button_AbrirClick(Sender: TObject);
  42. begin
  43. // Si el puerto está conectado.
  44. if ComPort1.Connected then
  45. begin
  46. ComPort1.Close; // Cierra el puerto.
  47.  
  48. Button_COM.Enabled := True;
  49. Button_ON.Enabled := False;
  50. Button_OFF.Enabled := False;
  51. end
  52.  
  53. else // En caso contrario.
  54.  
  55. begin
  56. ComPort1.Open; // Abre el puerto.
  57.  
  58. Button_COM.Enabled := False;
  59. Button_ON.Enabled := True;
  60. Button_OFF.Enabled := True;
  61. end;
  62. end;
  63.  
  64. procedure TForm1.Button_COMClick(Sender: TObject);
  65. begin
  66. ComPort1.ShowSetupDialog; // Abre la configuración del puerto.
  67. end;
  68.  
  69. procedure TForm1.Button_LimpiarClick(Sender: TObject);
  70. begin
  71. Memo_Mensajes.Clear(); // Limpia los mensajes del Memo.
  72. end;
  73.  
  74. procedure TForm1.Button_OFFClick(Sender: TObject);
  75. begin
  76. ComPort1.WriteStr('Luz_OFF'); // Envía el comando "Luz_OFF" al puerto.
  77. end;
  78.  
  79. procedure TForm1.Button_ONClick(Sender: TObject);
  80. begin
  81. ComPort1.WriteStr('Luz_ON'); // Envía el comando "Luz_ON" al puerto.
  82. end;
  83.  
  84. procedure TForm1.ComPort1AfterClose(Sender: TObject);
  85. begin
  86. if Button_Abrir <> nil then
  87. Button_Abrir.Caption := 'Abrir';
  88. end;
  89.  
  90. procedure TForm1.ComPort1AfterOpen(Sender: TObject);
  91. begin
  92. Button_Abrir.Caption := 'Cerrar';
  93. end;
  94.  
  95. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
  96. var
  97. Str: String;
  98. begin
  99. // Recibe mensajes desde Arduino.
  100. ComPort1.ReadStr(Str, Count);
  101.  
  102. // Muestra los mensajes en pantalla.
  103. Memo_Mensajes.Lines.Add( Str );
  104.  
  105. // Guarda los mensjes de Arduino en un archivo txt.
  106. Memo_Mensajes.Lines.SaveToFile('archivo.txt');
  107. end;
  108.  
  109. end.

84.png

Código de Arduino:




delphi
  1. // ----- Electrónica PIC -----
  2. //
  3. // Ejercicio 2.
  4. //
  5. // Encendido y apagado del Led 13 mediante puerto serie con pantalla.
  6. // Es lo mismo que el Ejercicoi 1, pero usando el LCD Keypad Shield.
  7.  
  8. #include
  9.  
  10. // Inicializa la librería con sus pines indicados.
  11. // RS, RW, Enable, D4, D5, D6, D7.
  12. LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
  13. // LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  14.  
  15. // Pin 10 para saber que es luz de fondo.
  16. const byte LuzFondo = 10;
  17.  
  18. const byte Led = 13; // Declaramos la variable pin del Led.
  19. char caracter;
  20. String comando;
  21.  
  22. void setup()
  23. {
  24.   pinMode(Led, OUTPUT); // Inicializa el pin del LED como salida:
  25.   Serial.begin(115200); // Puerto serie 115200 baudios.
  26.   lcd.begin(16, 2); // Formato de pantalla.
  27.   lcd.clear(); // Borra la pantalla y su posición superior izquierda.
  28.   lcd.print(" Arduino ");
  29.   delay(1000);
  30. }
  31.  
  32. void loop()
  33. {
  34.   /*
  35.   Voy leyendo carácter a carácter lo que se recibe por el canal serie
  36.   (mientras llegue algún dato allí), y los voy concatenando uno tras otro
  37.   en una cadena. En la práctica, si usamos el "Serial monitor" el bucle while
  38.   acabará cuando pulsamos Enter. El delay es conveniente para no saturar el
  39.   canal serie y que la concatenación se haga de forma ordenada.
  40.   */
  41.   while (Serial.available() > 0)
  42.   {
  43.   caracter = Serial.read();
  44.   comando.concat(caracter);
  45.   delay(10);
  46.   }
  47.  
  48. /*
  49. Una vez ya tengo la cadena "acabada", compruebo su valor y hago que
  50. la placa Arduino reacciones según sea este. Aquí podríamos hacer lo
  51. que quisiéramos: si el comando es "tal", enciende un Led, si es cual,
  52. mueve un motor... y así.
  53. */
  54.  
  55. // Si los carácteres es recibido y verdadero.
  56. if (comando.equals("Luz_ON") == true)
  57. {
  58.   digitalWrite(Led, HIGH); // Enciende el Led 13.
  59.   Serial.write("ON - Led encendido."); // Envía este mensaje al PC.
  60.   lcd.setCursor(0, 1);
  61.   lcd.print("Luz ON. "); // Mostrar en el LCD.
  62.   }
  63.  
  64.  
  65. if (comando.equals("Luz_OFF") == true)
  66. {
  67.   digitalWrite(Led, LOW); // Apaga el Led 13.
  68.   Serial.write("OFF - Led apagado. "); // Envía este mensaje al PC.
  69.   lcd.setCursor(0, 1);
  70.   lcd.print("Luz OFF. "); // Mostrar en el LCD.
  71.   }
  72.  
  73. // Limpiamos la cadena para volver a recibir el siguiente comando.
  74. comando = "";
  75. }

82.png

Ver vídeo.

Ver visor.

Ver PDF.

Un cordial saludo.


  • 2

#2 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 560 mensajes
  • LocationEspaña

Escrito 20 julio 2017 - 01:03

Gracias por el aporte, amigo

 

Saludos


  • 0