quarta-feira, 18 de outubro de 2017

Integração Protheus vs Arduino

Neste artigo rápido, gostaria de mostrar uma simples integração entre o ERP Protheus e o Arduino. Não irei aprofundar-me na arquitetura da plataforma arduino, mas resumidamente, ele permite uma ótima integração entre software e hardware.

Imagine poder controlar a rotação de um motor elétrico, nível de luminosidade em determinado ambiente, abrir e fechar circuitos, acionar alarmes, trabalhar com diversos sensores como de temperatura, de presença  usando o ERP Protheus. Com o arduino, isso é possível. E para começar a mostrar as possibilidades, irei iniciar com um projeto bem simples aonde uma tela em advpl terá botões que irão controlar o acendimento de leds.

Para começar, segue abaixo o código usado na IDE do Arduino:

const int LEDa = 13;
const int LEDb = 12;
const int LEDc = 11;
const int LEDd = 10;

void setup() {
  Serial.begin(9600);    //configura comunicação serial com 9600 bps
  pinMode(LEDa,OUTPUT);   //configura pino do led como saída
  pinMode(LEDb,OUTPUT);   //configura pino do led como saída
  pinMode(LEDc,OUTPUT);   //configura pino do led como saída
  pinMode(LEDd,OUTPUT);   //configura pino do led como saída
}
void loop() {
   if (Serial.available()) //se byte pronto para leitura
   {
    apagaTudo();
    switch(Serial.read())      //verifica qual caracter recebido
    {
      case 'A':                  //caso 'A'
        digitalWrite(LEDa,HIGH); //inverte estado do LED
      break;

      case 'B':                  //caso 'B'
        digitalWrite(LEDb,HIGH); //inverte estado do LED
      break;

       case 'C':                  //caso 'C'
        digitalWrite(LEDc,HIGH); //inverte estado do LED
      break;

      case 'D':                  //caso 'D'
        digitalWrite(LEDd,HIGH); //inverte estado do LED
      break;
     
    }
  }
}

void apagaTudo()
{
  digitalWrite(LEDa,LOW);
  digitalWrite(LEDb,LOW);
  digitalWrite(LEDc,LOW);
  digitalWrite(LEDd,LOW);
}



Agora, a tela Protheus que irá controlar os leds:

#INCLUDE "rwmake.ch"                                                 
#INCLUDE 'PROTHEUS.CH'
#include "topconn.ch"   
#INCLUDE 'FONT.CH'
#INCLUDE 'COLORS.CH'


User Function intARDU()  

SetPrvt("oDlg1","oBtn1","oBtn2","oBtn3","oBtn4")

oDlg1      := MSDialog():New( 092,232,225,748,"INTEGRAÇÃO PROTHEUS VS ARDUINO",,,.F.,,,,,,.T.,,,.T. )
oBtn1      := TButton():New( 012,032,"LED A",oDlg1,{|| SendMSG('A')},037,012,,,,.T.,,"",,,,.F. )
oBtn2      := TButton():New( 012,080,"LED B",oDlg1,{|| SendMSG('B')},037,012,,,,.T.,,"",,,,.F. )
oBtn3      := TButton():New( 012,128,"LED C",oDlg1,{|| SendMSG('C')},037,012,,,,.T.,,"",,,,.F. )
oBtn4      := TButton():New( 012,176,"LED E",oDlg1,{|| SendMSG('D')},037,012,,,,.T.,,"",,,,.F. )

oDlg1:Activate(,,,.T.)


Return




Static Function SendMSG(cMSG)


Local cCfg := "COM3:9600,n,8,1"
Local nH := 0


lRet       := msOpenPort(nH,cCfg)     

if(!lRet)
    Alert("Falha ao conectar com a porta serial")
    Return
EndIf 

msWrite(nH,cMSG)

Return



A tela no Protheus deverá ficar assim:



O esquema da placa ficaria assim:



Basicamente o Protheus irá se conectar com a placa Arduino usando a porta USB emulada como porta COM, por isso, o código advpl usa  msOpenPort.

Por último, o resultado: