lunes, 24 de julio de 2017

Arduino MFC y puerto serie

Tutorial Arduino MFC y Puerto serie. Interfaz creado con Visual Studio Community 2017 que puedes controlar el puerto serie a Arduino encendiendo y apagando un Led, manejar el LCD.

MFC en C++ hoy en día se usa muy poco, aún lo he visto en algunas universidades en España que lo emplea como enseñanza.

Se merece un toque actual con Arduino, a pesar quela tecnología MFC es complicada. Este tutorial te guía paso a paso hasta lograr el objetivo, ser capaz de cambiar el estado de un Led.


 Código fuente C++ del MFC:
// Arduino_MFCDlg.cpp: archivo de implementación
//

#include "stdafx.h"
#include "Arduino_MFC.h"
#include "Arduino_MFCDlg.h"
#include "afxdialogex.h"
#include "SerialClass.h"
#include
#include
#include

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Cuadro de diálogo de CArduino_MFCDlg

// Puerto serie.
Serial* Puerto = new Serial("COM4");
// Comandos para Arduino.
char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
char Luz_OFF[] = "Luz_OFF";
char Despido[] = "Despido";
char lectura[50] = "\0"; // Guardan datos de entrada del puerto.

CArduino_MFCDlg::CArduino_MFCDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_ARDUINO_MFC_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CArduino_MFCDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CArduino_MFCDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CArduino_MFCDlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CArduino_MFCDlg::OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON4, &CArduino_MFCDlg::OnBnClickedButton4)
END_MESSAGE_MAP()


// Controladores de mensaje de CArduino_MFCDlg

BOOL CArduino_MFCDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // Establecer el icono para este cuadro de diálogo.  El marco de trabajo realiza esta operación
    //  automáticamente cuando la ventana principal de la aplicación no es un cuadro de diálogo
    SetIcon(m_hIcon, TRUE);            // Establecer icono grande
    SetIcon(m_hIcon, FALSE);        // Establecer icono pequeño

    // TODO: agregar aquí inicialización adicional

    return TRUE;  // Devuelve TRUE  a menos que establezca el foco en un control
}

// Si agrega un botón Minimizar al cuadro de diálogo, necesitará el siguiente código
//  para dibujar el icono.  Para aplicaciones MFC que utilicen el modelo de documentos y vistas,
//  esta operación la realiza automáticamente el marco de trabajo.

void CArduino_MFCDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // Contexto de dispositivo para dibujo

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

        // Centrar icono en el rectángulo de cliente
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Dibujar el icono
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

// El sistema llama a esta función para obtener el cursor que se muestra mientras el usuario arrastra
//  la ventana minimizada.
HCURSOR CArduino_MFCDlg::OnQueryDragIcon()
{
    return static_cast(m_hIcon);
}



void CArduino_MFCDlg::OnBnClickedButton1()
{
    // Encener luz.
    Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
}


void CArduino_MFCDlg::OnBnClickedButton2()
{
    // Apagar luz.
    Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); // Envía al puerto el texto "Luz_OFF".
}


void CArduino_MFCDlg::OnBnClickedButton4()
{
    // Mostrar mensaje en el LCD de Arduino de Despedida y ánimos.
    Puerto->WriteData(Despido, sizeof(Despido) - 1); // Envía al puerto el texto "Despido".
}
 


Código fuente Arduino:
#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.
  pinMode(A1, OUTPUT);
  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("  MFC 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.
    digitalWrite(A1, HIGH);
    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.
    digitalWrite(A1, LOW);
    Serial.write("OFF - Led apagado. ");  // Envía este mensaje al PC.
    lcd.setCursor(0, 1);
    lcd.print("Luz OFF.        "); // Mostrar en el LCD.
  }

  if (comando.equals("Despido") == true)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Titulo          ");
    delay(2000);
    lcd.setCursor(0, 1);
    lcd.print("Nombre          ");
    delay(2000);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Animo y...      ");
    lcd.setCursor(0, 1);
    lcd.print("    Adelante. ;)");
  }
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando = "";
}


Ver vídeo:
Ver visor:



Autor: Ángel Acaymo M. G.

Descarga:
PDF
PDF
PDF

XPS
XPS

Ejemplos con librería 653 KB.
Ejemplos con librería 653 KB.

Librería SerialClass oficial.
Librería desde Electrónica PIC X.XX KB.
Librería desde Electrónica PIC. X.XX KB.

No hay comentarios: