Blog C/C++ Python
Cython – Integração entre Python e C/C++

Cython é uma ferramenta de integração Entre Python e C/C++, permitindo criar interfaces integráveis entre as duas linguagens.

O uso do cython tende a auxiliar ambos os programadores dos dois mundos.

Para os programadores C/C++ o uso do python permite criar funções mais dinâmicas e rápidas de serem construídas. Permitindo acesso a tecnologias que o programador C demoraria mais para construir nas interfaces nativas.

Para o programador Python, permite utilizar todo o poder o C e C++ integrado com códigos rápidos e ágeis do Python.

Estaremos neste artigo, instalando o cython na máquina, e no próximo criando um case para que possamos utiliza-lo.

Abordaremos apenas a instalação do cython, pois entendemos que os demais ambientes são de responsábilidade dos desenvolvedores.

Instalação do Cython no Linux

Para instalar o cython é necessário ter o python 3.7 ou superior.

Caso tenha uma versão menor, será necessário atualizar sua versão.

A instalação é bem simples, basta digitar:

pip install cython

Lazarus MNote2
Liberado a versão 2.10 Linux

Foi liberado a versão 2.10 linux, a versão 2.10 linux contem alguns ajustes na plataforma.

A versão pode ser baixada pelo repositório GIT no seguinte caminho:

https://github.com/marcelomaurin/MNote2/blob/master/bin/mnote2-2.10_amd64.deb

As modificações necessárias para compilar na 2.10 Linux, serão refletidas na 2.11 Windows.

E tratam de ajustes em macros de ambiente e modificações na integração entre synedit e TItem.

Os ajustes foram necessários pois o tamanho do ponteiro no linux do TSynedit não comportava o armazenamento de classe.

Então foi necessário modificar o Item, e o painel para armazenar o item, ao invés do Tsynedit, e desta forma referenciar ele no através do Titem.

MNote2
MNote2 – Correções Versão 2.10

Estou preparando uma nova versão do editor MNote2.

Com algumas correções identificadas, o MNote2, vem com algumas melhorias.

  • Correção arquivos de Configuração
  • Correção nas rotinas associadas a TSynCompletion
  • Inclusão de rotinas associadas a TSynAutoComplete
  • Correção de carga de arquivos por parâmetros em prompt
  • Libs de acesso ao Banco Mysql/Postgres/Sqlite

Correção arquivos de Configuração

Este problema foi identificado, pois os arquivos de configuração estavam em pasta que exigia permissão de administrador para serem modificados.

Houve uma alteração no código dos arquivos de configuração, permitindo que os arquivos sejam gravados sem permissão especial. Tambem foi agregado condicionais de compilação (diretivas) para permitir customização caso necessário para ambientes heterogênios.

Fontes modificados:

  • setmain.pas
  • setbanco.pas
  • setFolder.pas
  • setMQuery.pas

Tipo de mudança

Foi criado uma variavel

 FPATH : string;

Foram adicionados os caminhos do FPATH, nas funções IdentificaArquivo e SalvaContexto, dos fontes acima.

Correção nas rotinas associadas a TSynCompletion

Este problema ocorre na indicação do código para apontamento da classe TSynCompletion.

O ponto correto é através da classe TItem, na propriedade synCompletion.

No código havia dois pontos divergentes.

Inclusão de rotinas associadas a TSynAutoComplete

Neste processo associado, inclui código da classe TSynAutoComplete, que é um complemento da estilização de código, onde o sistema propoem blocos associados a tipo.

Esta rotina fica criada na main.pas, mas é indicada na Item.pas.

AutoComplete : TSynAutoComplete; 

O código é criado na função NovoItem, onde é criado o objeto, que posteriormente é manipulado diretamente pela classe TItem.

function TfrmMNote.NovoItem():TTabSheet;
var
   tb : TTabSheet;
   syn : TSynEdit;
   item : TItem;
   SynCompletion : TSynCompletion;
   synAutoComplet : TSynAutoComplete;
begin
  tb := pgMain.AddTabSheet();

  syn := TSynEdit.Create(tb);
  syn.Parent := tb;
  syn.Align:= alClient;
  syn.Lines.Clear;
  syn.PopupMenu := popSysEdit;
  syn.OnChange:= @synChange;
  (*Complete*)
  SynCompletion := TSynCompletion.Create(self);
  SynCompletion.Editor := syn;
  SynCompletion.OnCodeCompletion:=@SynCompletion1CodeCompletion;
  SynCompletion.OnExecute:=@SynCompletion1Execute;
  SynCompletion.OnSearchPosition:=@SynCompletion1SearchPosition;

  (*Autocomplete*)
  synAutoComplet := TSynAutoComplete.create(self);
  synAutoComplet.Editor := syn;

  tb.PopupMenu := popFechar;
  tb.Tag:= Integer(pointer(syn)); //Guarda o Sys
  tb.ImageIndex:=0;

  item := TItem.create();
  item.AtribuiNovoNome();
  item.synCompletion:= SynCompletion;    //Ponteiro de SynCompletion
  item.AutoComplete :=  synAutoComplet;  //Ponteiro de synAutocompletion

  syn.Tag:= longint(pointer(item));
  tb.Caption:= item.Name;
  pgMain.Refresh();
  application.ProcessMessages;
  result := tb;
end;             

Correção de carga de arquivos por parâmetros em prompt

Neste problema, identificamos que ao tentar realizar a carga do programa por parâmetro o mesmo não era iniciado.

Após analise, identificamos que o problema do programa era associado ao painel.

O programa estava pegando sempre o item atual, desta forma ele modificava o item errado.

Uma correção foi implementada.

      tb := NovoItem();

      //tb := pgMain.ActivePage;
      syn := TSynEdit(tb.tag);
      try
        item := Titem(syn.tag);
        fSynCompletion := item.synCompletion;
        fAutoComplete := item.AutoComplete;
        syn.Lines.LoadFromFile(arquivo);

        item.ItemType := classificaTipo(arquivo);            

Foi mudado o NovoItem, passando de Procedure para Function, onde passo o tb diretamente, sem necessidade de capturar.

tb := pgMain.ActivePage;

O erro era justamente na rotina acima. Que foi comentada nos testes e posteriormente apagado.

Libs de acesso ao Banco Mysql/Postgres/Sqlite

Preparação para próxima versão, onde já contempla libs de conexão de banco de dados.

Criação da Pasta Libs, contemplando arquivos de conexão há bancos de dados.

Revisão e lançamento das versões

As correções serão lançadas em master no git e estarão disponíveis na versão 2.10.

pós graduação
Analise do Material

Atividade destinada ao curso de Pos graduação UNINOVE.

Artigo

Article
Fuzzy-Based Statistical Feature Extraction for
Detecting Broken Rotor Bars in Line-Fed and
Inverter-Fed Induction Motors

Cleber Gustavo Dias 1,* , Luiz Carlos da Silva 1 and Ivan Eduardo Chabu 2

Analise do material

Objetivo do material

Identificar disturbios na barra de rotor através de sensoriamento.

São os sensores Efeito Hall (efeito de campo magnético) o mesmo utilizado em estradas.

Permitindo identificar a existência, mas o comprometimento da barra.

No método aplica-se um tenção de 7,5KW alimentada por um inversor

Introdução

Apresenta uma visão da necessidade, bem como do ambiente industrial aplicado. Onde máquinas são movidas por motores elétricos.

Ele aponta alguns problemas:

  • Rolamento dos motores
  • gaiola do rotor
  • Mancais

Estima-se que paradas não previstas , geram uma perda de receita de US$2,5 a US$4.0 milhões.

Falhas possíveis

  • malha fechada
  • vazamento detectado por escorregamento muito baixo,componente da banda lateral esquerda

Tempo de leitura

aproximadamente 100s, ou seja 1 minuto e meio de leituras amostrais.

Metodologias e propostas de analise

Baseadas em Transformada wavelet Discreta (DWT) e Transformada de Fourier de Tempo Curto (STFT).

Falhas em máquinas rotativas,
como abordagens no domínio do tempo e no domínio da frequência, bem como o uso de KNN, SVM e Fuzzy
Classificadores c-Means, entre outros.

Este artigo apresenta o uso de um sistema de inferência fuzzy (FIS) para extrair as características de um sensor Hall sinal, instalado dentro do motor, de acordo com a condição do rotor.

945 / 5.000

Resultados de tradução

(i) Não é necessário estimar o escorregamento do rotor, conforme exigido pelo método MCSA e outras técnicas
(relacionado à indicação de FN);
(ii) É possível detectar barras quebradas durante a variação de carga (relacionada à indicação FN);
(iii) É possível detectar barras quebradas durante oscilações de carga de baixa frequência (relacionadas à indicação de FP);
(iv) É possível classificar a gravidade das falhas do rotor;
(v) É possível detectar barras de rotor rompidas para motor funcionando em baixo escorregamento (relacionado à indicação FN);
e
(vi) O método permite a detecção de falhas do rotor para motores alimentados por um inversor e também alimentados por
fonte de energia.

A presente abordagem foi validada usando resultados de simulação de dois IMs (1200 kW e
7,5 kW) e foram realizados testes experimentais utilizando um motor de indução de 7,5 kW, 220 V e
38 barras de rotor, alimentadas por uma alimentação senoidal e por um inversor. A metodologia e os resultados são
apresentados nas subseções a seguir.

Artigo 2

Developing IoT Sensing System for
Construction-Induced Vibration Monitoring and
Impact Assessment

Neste artigo, a justificativa do trabalho se baseia no crescimento vertical , onde analise de vibrações tem ligação direta com processos construtivos. Garantindo qualidade e segurança.

O projeto justifica seu uso, e apresenta um sistema robusto porem de baixo custo baseado em solução raspberry, bluetooth e 4G

Sensores IoT

Developing IoT Sensing System for
Construction-Induced Vibration Monitoring and
Impact Assessment

Qiuhan Meng and Songye Zhu *
Department of Civil and Environmental Engineering, The Hong Kong Polytechnic University,
Hong Kong, China; qiuhan.m.meng@connect.polyu.hk

  • Correspondence: songye.zhu@polyu.edu.hk; Tel.: +852-34003964

Utilizando um raspberry pi, conectado a um dispositivo 4G ligado ao sensor acelerometro pela porta GPIO, conforme figura abaixo:

Tabela de resolução do equipamento LSM9DS1

A comunicação e internet

Se dá através de dong USB 4G.

Velocidades de conexão variam, podendo chegar

Fornecimento de energia

O consume do RASPBERRY é baixo, e estima-se que um painel de 50W, ligado a uma bateria de 20Ah com 12V possa fornecer 28h de energia ininterrupta, mesmo sem recarga, e que o painel de 50W possa recarregar em 7H. Sendo mais que suficiente para sua alimentação.

Software

O Software necessário precisa ler o GPIO , lendo o dispositivo I2C, gravando em um arquivo CSV.

Conforme fluxograma

A sincronização de tempo se dá pelo serviço de NTP.

Como os relogios são sincronizados pelo mesmo servidor ntp, os times são bem precisos, com uma diferença estimada em 10ms

Armazenamento na nuvem

Se dá através de um servidor em nuvem, através de aplicação conforme exemplo a seguir

Comparado com um equipamento industrial, o uso do raspberry, teve uma diferença de 3% em média menor, nos valores amostrados, mostrando uma confiabilidade em diferentes tipos de frequencia.

Resumo e Discussão

Este estudo apresenta o projeto, desenvolvimento e validação de um sistema de sensoriamento IoT sem fio para
monitoramento de vibração induzida pela construção em tempo real e avaliação de impacto. O hardware do
O sistema de detecção IoT desenvolvido consiste na placa Raspberry Pi, acelerômetro MEMS, Internet 4G
dongle e bateria solar. O Raspberry Pi é usado para coletar e analisar sinais digitais medidos por
o acelerômetro MEMS. Processamento de sinal local, incluindo filtro de dados, integração e avaliação de
níveis de vibração em tempo real em relação ao PPV, velocidade RMS na banda de 1/3 de oitava e aceleração RMS
Sensores 2020, 20, 6120 21 de 23
em banda de 1/3 de oitava, são realizados no Raspberry Pi. Os dados brutos e processados, bem como os
os resultados analisados ​​são transmitidos para o banco de dados MySQL na nuvem pública através do celular 4G
rede em tempo hábil. Painéis solares com bateria recarregável são usados ​​como fonte de energia contínua
fornecer. O software de operação e o mecanismo de sincronização de tempo NTP são desenvolvidos de acordo.
As funções de banco de dados e alarme são implementadas no sistema em nuvem. Além disso, uma página da web
interface do usuário é desenvolvida para exibir resultados de medição em tempo real e sinais de alarme, que podem
ser acessado remotamente a partir do computador autorizado ou dispositivos móveis via Internet. O saliente
Os recursos do sistema de detecção de vibração IoT incluem: (1) tamanho pequeno e sensor sem fio autônomo
nós que permitem fácil instalação sem qualquer trabalho de cabeamento, (2) baixos custos de hardware e baixo consumo de energia
consumo, (3) nós de sensores independentes evitando rede hierárquica de sensores, (4) dados confiáveis
transmissão sem perda de dados, (5) sincronização de tempo NTP permitindo amostragem de dados de alta precisão,
e (6) processamento de dados em tempo real, avaliação de vibração e capacidade de alarme.
A precisão do acelerômetro MEMS selecionado (LSM9DS1) foi verificada através do
comparação com o acelerômetro tradicionalmente com fio nos experimentos de laboratório. Além disso, a IoT
sistema de detecção de vibração foi testado em um local de constrição real em Hong Kong com estaca-prancha em andamento
trabalho de construção. Os resultados experimentais de laboratório e de campo indicaram que o
O sistema de detecção IoT pode medir vibrações induzidas pela construção com precisão satisfatória em ambos
domínio do tempo e da frequência. O poder computacional do Raspberry Pi e da nuvem permite que o
cálculo em tempo real de diferentes indicadores de vibração e avaliar o impacto da vibração comparando
vários limites de vibração pré-especificados. Este sistema de detecção de vibração IoT será implementado em breve
em outro canteiro de obras em Hong Kong para monitoramento de impacto de vibração de construção a longo prazo
e avaliação.
Notavelmente, o Raspberry Pi é uma plataforma de código aberto que permite conexões com vários tipos de
sensores com portas compatíveis. Portanto, o sistema de detecção IoT desenvolvido pode ser convenientemente estendido
a outras funções de monitoramento, como microfones MEMS para medição de ruído, temperatura e
sensores de umidade para monitoramento ambiental, sensores ultrassônicos para detecção de danos e
sensores de vibração de sensibilidade, se necessário.
Contribuições dos autores: Conceituação, metodologia, software, validação, investigação, curadoria de dados e
redação—preparação do rascunho original: Q.M.; Conceituação, redação – revisão e edição, supervisão, projeto
administração e aquisição de financiamento: S.Z. Todos os autores leram e concordaram com a versão publicada de
o manuscrito.
Financiamento: Esta pesquisa foi financiada pelo Conselho da Indústria da Construção de Hong Kong (número de concessão: CICR/03/18)
e a Universidade Politécnica de Hong Kong (número da concessão: Projeto No. ZE1F).
Conflitos de interesse: Os autores declaram não haver conflito de interesse.

Minhas referencias

http://maurinsoft.com.br/index.php/2022/05/27/integrando-python-com-php/

http://maurinsoft.com.br/index.php/2022/02/04/mysql-com-c-lazarus-python-php-r-parte-3/

http://maurinsoft.com.br/index.php/2022/01/31/mysql-com-c-lazarus-python-php-r-parte-1/

Objetivo – Analise do Artigo

O projeto visa estabelecer a base de um hardware suficiente para captura de vibraçoes, propiciando a captura e envio das informações para um servidor em nuvem.

Entendendo como a captura é realizada, através de um raspberry PI, que é um equipamento fornecido por uma organização sem fins lucrativos A Fundação Raspberry PI www.raspberrypi.org [https://pt.wikipedia.org/wiki/Raspberry_Pi_Foundation].

Na qual provê alem do equipamento, tambem um sistema operacional RASPIAN (linux like), no qual permite o desenvolvimento de diversos projetos embarcados com grande flexibilidade e robustes.

Instalação do Serviço de NTP

Uma das primeiras coisas que são feitas no equipamento, é o cuidado com a sincronização dos tempos.

A sincronização dos tempos é feita através de um serviço de NTP, que é Network Time Protocol [https://ntp.br/]. O NTP garante sincronização dos tempos baseados em servidores de tempo ultra precisos, espalhados pelo mundo. No caso usaremos o servidor a.st1.ntp.br.

Este servidor foi estabelecido pois tem tempo de resposta entre 12.ms1 e 12.9ms.

Instalando o SSH

Após a instalação do Servidor de NTP, será necessário instalar um serviço de manutenção de ssh, para propiciar a conexão remota nos equipamentos. O procedimento para realização pode ser visto no link [https://roboticsbackend.com/enable-ssh-on-raspberry-pi-raspbian/]

Após a instalação de um serviço é necessário o acesso a internet.

No Raspberry PI, isso é feito de duas formas, no nosso caso usaremos o processo de conexão via WIFI, que permite conectar através de uma rede. Lendo as informações de acesso. O procedimento de configuração de um wifi, pode ser visto conforme segue [https://pplware.sapo.pt/linux/tutorial-raspberry-pi-configurar-wireless-via-linha-de-comandos/]

Instalando um servidor web

A instalação do equipamento, agora será necessário permitir configurar um serviço de monitoramento web, para que possamos conectar aparelhos como celular ou tablets a fim de obter leituras do dispositivo. Para tanto usaremos um servidor APACHE/PHP, realizando o procedimento de instalação conforme o apresentado. [https://randomnerdtutorials.com/raspberry-pi-apache-mysql-php-lamp-server/]

Para analise de dados usaremos o python para realizar a leitura dos dados amostrados.

Para tanto usaremos um processo de integração direto, entre o PHP/Python, conforme apresentado no link abaixo:

[https://maurinsoft.com.br/index.php/2022/05/27/integrando-python-com-php/]

Conexões com Hardware

Depois de montado o sistema operacional e criado uma versão funcional do linux com os requisitos minimos necessários para a manutenção, iremos suprir o hardware necessário.

As conexões com o raspberry são realizadas conforme figura abaixo, gentilmente fornecida pelo site:

Análise de acelerômetro, giroscópio e magnetômetro com Raspberry Pi Parte I: leituras básicas

O procedimento de criação bem como captura das informações tambem estão disponíveis no site acima referenciado.

Ficando apenas de referencia o codigo

# deve ser salvo na pasta local com o nome "mpu9250_i2c.py"
# será usado como controlador I2C e porto de função para o projeto
# consulte o datasheet e registre o mapa para obter uma explicação completa
import smbus,time
def MPU6050_start():
    # alterar a taxa de amostragem (estabilidade)
    samp_rate_div = 0 # sample rate = 8 kHz/(1+samp_rate_div)
    bus.write_byte_data(MPU6050_ADDR, SMPLRT_DIV, samp_rate_div)
    time.sleep(0.1)
    # redefinir todos os sensores
    bus.write_byte_data(MPU6050_ADDR,PWR_MGMT_1,0x00)
    time.sleep(0.1)
    # gerenciamento de energia e configurações de cristal
    bus.write_byte_data(MPU6050_ADDR, PWR_MGMT_1, 0x01)
    time.sleep(0.1)
    #Write to Configuration register
    bus.write_byte_data(MPU6050_ADDR, CONFIG, 0)
    time.sleep(0.1)
    #Escrever no registro de configuração do Gyro
    gyro_config_sel = [0b00000,0b010000,0b10000,0b11000] # byte registers
    gyro_config_vals = [250.0,500.0,1000.0,2000.0] # degrees/sec
    gyro_indx = 0
    bus.write_byte_data(MPU6050_ADDR, GYRO_CONFIG, int(gyro_config_sel[gyro_indx]))
    time.sleep(0.1)
    #Gravar no registro de configuração do Accel
    accel_config_sel = [0b00000,0b01000,0b10000,0b11000] # byte registers
    accel_config_vals = [2.0,4.0,8.0,16.0] # g (g = 9.81 m/s^2)
    accel_indx = 0
    bus.write_byte_data(MPU6050_ADDR, ACCEL_CONFIG, int(accel_config_sel[accel_indx]))
    time.sleep(0.1)
    # registro de interrupção (relacionado ao estouro de dados [FIFO])
    bus.write_byte_data(MPU6050_ADDR, INT_ENABLE, 1)
    time.sleep(0.1)
    return gyro_config_vals[gyro_indx],accel_config_vals[accel_indx]

def read_raw_bits(register):
    #ler valores de aceleração e giroscópio
    high = bus.read_byte_data(MPU6050_ADDR, register)
    low = bus.read_byte_data(MPU6050_ADDR, register+1)
    # combinado alto e baixo para valor de bit sem sinal
    value = ((high << 8) | low)

    # converter para +- valor
    if(value > 32768):
        value -= 65536
    return value
def mpu6050_conv():
    #bits de aceleração brutos
    acc_x = read_raw_bits(ACCEL_XOUT_H)
    acc_y = read_raw_bits(ACCEL_YOUT_H)
    acc_z = read_raw_bits(ACCEL_ZOUT_H)
    # bits temporários brutos
##    t_val = read_raw_bits(TEMP_OUT_H) # uncomment to read temp

    #pedaços brutos de giroscópio
    gyro_x = read_raw_bits(GYRO_XOUT_H)
    gyro_y = read_raw_bits(GYRO_YOUT_H)
    gyro_z = read_raw_bits(GYRO_ZOUT_H)
    #converter para aceleração em ge giroscópio dps
    a_x = (acc_x/(2.0**15.0))*accel_sens
    a_y = (acc_y/(2.0**15.0))*accel_sens
    a_z = (acc_z/(2.0**15.0))*accel_sens
    w_x = (gyro_x/(2.0**15.0))*gyro_sens
    w_y = (gyro_y/(2.0**15.0))*gyro_sens
    w_z = (gyro_z/(2.0**15.0))*gyro_sens
##    temp = ((t_val)/333.87)+21.0 # descomente e adicione abaixo em troca
    return a_x,a_y,a_z,w_x,w_y,w_z
def AK8963_start():
    bus.write_byte_data(AK8963_ADDR,AK8963_CNTL,0x00)
    time.sleep(0.1)
    AK8963_bit_res = 0b0001 # 0b0001 = 16-bit
    AK8963_samp_rate = 0b0110 # 0b0010 = 8 Hz, 0b0110 = 100 Hz
    AK8963_mode = (AK8963_bit_res <<4)+AK8963_samp_rate # bit conversion
    bus.write_byte_data(AK8963_ADDR,AK8963_CNTL,AK8963_mode)
    time.sleep(0.1)

def AK8963_reader(register):
    # ler os valores do magnetômetro
    low = bus.read_byte_data(AK8963_ADDR, register-1)
    high = bus.read_byte_data(AK8963_ADDR, register)
    # combinado alto e baixo para valor de bit sem sinal
    value = ((high << 8) | low)
    # converter para +- valor
    if(value > 32768):
        value -= 65536
    return value
def AK8963_conv():
    # bits de magnetômetro brutos
    loop_count = 0
    while 1:
        mag_x = AK8963_reader(HXH)
        mag_y = AK8963_reader(HYH)
        mag_z = AK8963_reader(HZH)
        # a próxima linha é necessária para AK8963
        if bin(bus.read_byte_data(AK8963_ADDR,AK8963_ST2))=='0b10000':
            break
        loop_count+=1

    #converter para aceleração em ge giroscópio dps
    m_x = (mag_x/(2.0**15.0))*mag_sens
    m_y = (mag_y/(2.0**15.0))*mag_sens
    m_z = (mag_z/(2.0**15.0))*mag_sens
    return m_x,m_y,m_z

# Registros MPU6050
MPU6050_ADDR = 0x68
PWR_MGMT_1   = 0x6B
SMPLRT_DIV   = 0x19
CONFIG       = 0x1A
GYRO_CONFIG  = 0x1B
ACCEL_CONFIG = 0x1C
INT_ENABLE   = 0x38
ACCEL_XOUT_H = 0x3B
ACCEL_YOUT_H = 0x3D
ACCEL_ZOUT_H = 0x3F
TEMP_OUT_H   = 0x41
GYRO_XOUT_H  = 0x43
GYRO_YOUT_H  = 0x45
GYRO_ZOUT_H  = 0x47
#Registros AK8963
AK8963_ADDR   = 0x0C
AK8963_ST1    = 0x02
HXH          = 0x04
HYH          = 0x06
HZH          = 0x08
AK8963_ST2   = 0x09
AK8963_CNTL  = 0x0A
mag_sens = 4900.0 # sensibilidade do magnetômetro: 4800 uT
# iniciar o driver I2C
bus = smbus.SMBus(1) # iniciar comunicação com ônibus i2c
gyro_sens,accel_sens = MPU6050_start() # instantiate gyro/accel
AK8963_start() # magnetômetro instanciar
# MPU6050 9-DoF Example Printout
from mpu9250_i2c import *
time.sleep(1) # delay necessary to allow mpu9250 to settle
print('recording data')
while 1:
    try:
        ax,ay,az,wx,wy,wz = mpu6050_conv() # read and convert mpu6050 data
        mx,my,mz = AK8963_conv() # read and convert AK8963 magnetometer data
    except:
        continue

    print('{}'.format('-'*30))
    print('accel [g]: x = {0:2.2f}, y = {1:2.2f}, z {2:2.2f}= '.format(ax,ay,az))
    print('gyro [dps]:  x = {0:2.2f}, y = {1:2.2f}, z = {2:2.2f}'.format(wx,wy,wz))
    print('mag [uT]:   x = {0:2.2f}, y = {1:2.2f}, z = {2:2.2f}'.format(mx,my,mz))
    print('{}'.format('-'*30))
    time.sleep(1)

Armazenamento dos dados

Agora que temos o programa que coleta as informações do acelerometro, podemos preparar o padrão de armazenamento, criando estruturas em mysql que armazenam os dados, e que posteriormente, sejam analisadas.

wordpress
Plugin Wordpres com AngulaJS – Parte 1

Neste artigo, irei apresentar um plugin desenvolvido com angularjs.

Apresentarei o desenvolvimento e detalhes de implementação.

A criação de um plugin é uma tarefa bem simples.

Plugin criado

Primeiro iremos criar uma pasta, e chamar do nome do nosso plugin.

Vamos chamar esse nosso exemplo de maurinsoft, conforme figura abaixo:

Pasta do projeto Maurinsoft

Agora iremos criar um arquivo maurinsoft.php, e incluir o fonte conforme referencia abaixo:

<?php
/*
Plugin Name: Maurinsoft
Plugin URL: http://maurinsoft.com.br/plugin/
Description: Plugin de Acesso a camera
Version: 1.0
Author: Marcelo Maurin Martins
Author URI: http://maurinsoft.com.br
Text Domain: maurinsoft
License: GPLv3
*/

/*Classe maurinsoft  -  Esta classe eh single instance , ou seja somente pode ser criada uma vez*/
class Maurinsoft{
	private static $instance; /*Pega a instancia da classe*/

	public static function getInstance(){
			if(self::$instance==NULL){
				self::$instance = new self(); /*caso nao exista cria uma instancia*/
			}
	}

	private function __construct(){ /*construtor da classe*/
			/** Add action do word press **/
			add_action('init',array($this,'maurinsoft_inicializa')); /* Ao inicializar */
			add_action('wp_footer',array($this,'maurinsoft_rodape')); /*informação adicional do rodape*/
			//remove_action('','');
			add_action('admin_enqueue_scrips',array($this,'add_css')); /*Registra o CSS especifico */

	}

	function add_css(){
		wp_register_style('maurinsoft',plugin_dir_url(__FILE__).'css/maurinsoft.css');
		wp_enqueue_style('maurinsoft');
	}

	function maurinsoft_aboutus(){
		echo "Maurinsoft 1.0";
	}

	function maurinsoft_rodape(){
		echo "<a href='http://maurinsoft.com.br'>maurinsoft.com.br</a> ";
	}

	function maurinsoft_inicializa(){
		if (is_user_logged_in()){
			//echo 'Logado!';
			} else {
			//echo 'Nao logado';
			}
	}

}  //Fim da classe

Maurinsoft::getInstance(); //Inicializa metodo construtor

Vamos entender este projeto:

Primeiramente, criamos uma classe Maurinsoft, onde criamos um método construtor que chama a função add_action.

O add_action é um callback, que permite vincular uma ação do wordpress a uma chamada de função.

Para quem não sabe o que é call back, recomendo ler o artigo abaixo:

http://maurinsoft.com.br/index.php/2021/02/11/callback-em-c/

O wordpress faz algumas chamadas, na primeira:

add_action('init',array($this,'maurinsoft_inicializa')); /* Ao inicializar */

Ele ao inicializar o wordpress, chama a função maurinsoft_inicializa.

Na segunda chamada:

add_action('wp_footer',array($this,'maurinsoft_rodape')); /*informação adicional do rodape*/

Ao chamar o wp_footer , ou seja o rodapé, ele chama a função maurinsoft_rodape, que inclui uma chamada ao rodapé.

E por fim,

add_action('admin_enqueue_scrips',array($this,'add_css')); /*Registra o CSS especifico */

Ao chamar os scripts ele carrega o css.

Que por sua vez tem 2 funções chamadas:

function add_css(){
		wp_register_style('maurinsoft',plugin_dir_url(__FILE__).'css/maurinsoft.css');
wp_enqueue_style('maurinsoft');
	}

A função wp_register_style, registra um arquivo css, e a wp_enqueue_style a usa.

É possível chamar diretamente através do código:

//<!-- Bootstrap -->
wp_enqueue_style('bootstrap.min','https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css');
wp_enqueue_style('bootstrap-theme.min','https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css');
wp_enqueue_script('bootstrap.min','https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js');

//<!-- AngularJS -->
wp_enqueue_script('angular.min','https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js');



//<!-- Jquery -->
//wp_enqueue_script('jquery.min.js','https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js');
wp_enqueue_script('jquery.min.js','https://code.angularjs.org/1.6.4/angular.js');


//<!-- Parte local-->
wp_enqueue_script('ctlr_test','/wp-content/plugins/comlink-application-clone-admin-page/js/ctlr_test.js');

wp_enqueue_style('style','/wp-content/plugins/comlink-application-clone-admin-page/style.css');

Por fim deixarei a lista de eventos associados ao add_action:

https://developer.wordpress.org/reference/hooks/

MNote2
Bug MNOTE2

Relatório de BUG

Problema

Foi encontrado bugs associados ao MNote2

Descrição Problema 1

Ao chamar um fonte associado ao MNOTE2, o MNOTE2 executa, mas o fonte não é chamado.

Tambem dá erro no arquivo de cfg.

Ao chamar o programa sem o mnote2 sem parametro adicional, o problema não acontece.

Descrição Problema 2

Ao chamar o MNote2, o mesmo entra como formato de dialogo, e não como janela.

IA PHP Python
Criando um chatbot – Parte 1

Neste artigo iremos dar inicio a criação de um chatbot. Ele estará sendo hospedado em um raspberry pi.

Utilizando PHP, AngularJS e Python.

Este artigo é uma continuação do artigo anterior, que pode servir de referência:

http://maurinsoft.com.br/index.php/2022/05/27/integrando-python-com-php/

Eu apresentarei uma introdução hoje ao Angularjs e o PHP, onde apenas depois mostrarei a parte do Python e do IA propriamente dito.

Este estudo faz parte do estudo da minha Pós graduação na UNINOVE.

Primeiramente iremos escrever o javascript ctlr_test.js



		angular.module("App",[]);
		angular.module("App").controller("TesteCtrl", function ($scope,$http) {
			$scope.app = "Teste Chatbot";
			$scope.texto = "";
			$scope.pergunta = "";
			$scope.msg = "Dúvidas entre em contato com marcelomaurinmartins@gmail.com";
			$scope.resposta = "Sem resposta";
			$scope.url = "http://maurinsoft.com.br/python/runpy.php?pergunta?"+$scope.pergunta;

			$scope.IncluiResposta = function() {
			   $scope.texto = $scope.texto . $scope.resposta;
			}
			$scope.displayResposta = function() {
				$http.get("http://maurinsoft.com.br/python/runpy.php?pergunta="+$scope.pergunta)
				.success(function(data)
				{
					//console.log(data);
					$scope.data = data.rs[0];
					$scope.resposta = data.rs[0].resposta;
					$scope.texto = $scope.texto + "Pergunta:"+$scope.pergunta+'\n';
					$scope.texto = $scope.texto + "Resposta:"+$scope.resposta+'\n';
					$scope.msg = "Resposta obtida!";
				})
				.error(function(erro)
				{
					//console.log(erro);
					$scope.msg = "Pesquisa retornou vazia";
					$scope.data = null;
				})
			}
		});

Nele chamamos a função IncluiResposta , que envia a resposta para o web service(ws), que recebe a resposta e devolve para o browser.

Ao enviar a solicitação, a mesma é processada pelo ws, que devolve um json, na figura abaixo, vemos a execução direta do json, simulando a pergunta do browser.

Depois iremos criar o index.php , que monta uma interface para ser mostrada na tela.

<!DOCTYPE HTML>
	<HTML  ng-app="App" LANG="PT-BR">
	<head>
		<meta charset="UTF-8"/>
		<meta name="description" content="Maurinsoft"/>
		<meta name="viewport" content="width=device-width, initial-scale=1"/>
		<title>Teste de Chatbot</title>

		<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>

		<!-- jQuery library -->
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>



		<link rel="stylesheet" href="../../libs/bootstrap/css/bootstrap.css"/>
		<link rel="stylesheet" href="../../libs/bootstrap/css/bootstrap-theme.min.css"/>
		<link rel="stylesheet" href="style.css"/>
		<script src="https://code.angularjs.org/1.6.4/angular.js"></script>
		<script src="js/ctlr_test.js"></script>

	</head>
	<body ng-controller="TesteCtrl">
		<video autoplay loop poster="img/logo.jpg" class="bg_video">
			<source src="video/fundo.webm" type="video/webm">
			<source src="video/fundo.mp4" type="video/mp4">
		</video>
		<div class="container">
			<!--Caixa titulo -->
			<div class="row  borda_container">
				<div class="col-xs-2 ">
					<img src="img/logo.png" alt="Tutorial de CSS" title="Logo do CSS"  width="100" height="100"/>
				</div>
				<div class="col-xs-10 Logo ">
					<h1 class="titulo">{{app}}</h1>
				</div>
			</div>
			<div class="row separacao">
			</div>

			<!--Login -->
			<div class="row">

			</div>

			<!--Menu Item-->
			<div class="row">
					<div class="col-xs-12 menu">
						<div class="row">
						  <h4 class="menu_titulo">Conversa</h4>
						</div>

						<div class="row container col-xs-12">
						   <textarea type="text"  style=" top:500px;height:200px;width:600px; left:470px; overflow:hidden;" class="col-md-10" >{{texto}}</textarea>
						</div>
						<div class="info_help">
					   	 <div class="row col-md-12">
						    <h4>Perguta</h4>
						 </div>
						 <div class="row container">
						    <div class="col-md-8">
						      <input type="text" value="{{pergunta}}" ng-model="pergunta" name="Pergunta">
						    </div>
						    <div class="col-md-2">
						     <input type="submit" value="Enviar" ng-click="displayResposta()">
						    </div>
						 </div>
						</div>
					</div>
			</div>
		</div>
		<div class="row rodape_container">
			  <div class="row">
			  <center>{{msg}}</center>
			  </div>

		</div>
		<script type="text/javascript" src="../../libs/bootstrap/js/bootstrap.js"></script>
	</body>
	</html>

Chamada do lado do WS

No webservice, o python é chamado, que realiza toda a analise da pergunta.

Fonte do runpy.php, que é o web service.

<?php
    /*phpinfo();*/
	/*Registra webservice para processamento de jobs*/
	ini_set('display_errors', 'ON');
	error_reporting(E_ALL);

	header('Content-Type: application/json');  // <-- header declaration

	include "/var/www/html/ws/connectdb.php";

	//header('Cache-Control: no-cache, must-revalidate');




$data = json_decode(file_get_contents("php://input"));

if($data){
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
} else {
		$pergunta = $dbhandle->real_escape_string($_GET['pergunta']);
}


$json =  '{"rs":[';
if($pergunta){
  $command = escapeshellcmd('/var/www/html/python/nlp.py "'.$pergunta.'" > /var/log/proclog.log');
  $resposta = shell_exec($command);
  $resposta = str_replace (array("\r\n", "\n", "\r"), ' ', $resposta);

  if($resposta){
     $json = $json  . '{';
     $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":'.$resposta;
     $json = $json  .  '}';
  } else {
	 $json = $json  . '{';
	 $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	 $json = $json  .  '}';
  }
} else {
	$json = $json  . '{';
	$json = $json  .  '"pergunta":"'.$pergunta.'",';
    $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	$json = $json  .  '}';
}
$json = $json  .  ']}';

echo $json


?>

O armazenamento das solicitações, podem ser gravadas pelo webservice, que permite gravar as respostas, para aprimoramento posterior.

Fonte do nlp.py, que gera a analise em python.

#!/usr/bin/env python3

#import pandas as pd
import sys
import numpy as np
import math
import time
import re
import random


pergunta = f'"{sys.argv[1]}"'

resposta = "Desculpe, não achei uma resposta válida"

#Iniciando o processo de analise de dados



#Devolvendo o modelo para o ws
resposta= "\"%s\""%(resposta)
print(resposta)

Neste exemplo simples porem integral, podemos notar o processo completo de desenvolvimento de chatbot, sem a implementação da parte do python, que abordaremos nos próximos tópicos.

URL do projeto

http://maurinsoft.com.br/index.php/2022/06/30/chatbot-no-wordpress/

IA PHP Python
Integrando Python com PHP

Neste artigo abordarei como rodar rotinas em python integrado com PHP.

Para exemplificar este projeto, estarei criando uma pagina PHP, conforme se segue:

<?php
    /*phpinfo();*/
	/*Registra webservice para processamento de jobs*/
	ini_set('display_errors', 'ON');
	error_reporting(E_ALL);

	include "/var/www/html/ws/connectdb.php";

	//header('Cache-Control: no-cache, must-revalidate');


$data = json_decode(file_get_contents("php://input"));


$data = json_decode(file_get_contents("php://input"));
if($data){
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
} else {
		$pergunta = $dbhandle->real_escape_string($_GET['pergunta']);
}



if($pergunta){
  $command = escapeshellcmd('/var/www/html/python/nlp.py "'.$pergunta.'" > /var/log/proclog.log');
  $resposta = shell_exec($command);

  if($resposta){
  echo '{"rs":[';
  echo '{';
  echo '"pergunta":'.$pergunta.',';
  echo '"resposta":'.$resposta;
  echo '}]}';
  } else {
    echo "sem resposta";
  }
} else {
	echo "sem pergunta";
}


?>

Neste programa chamamos o comando shell_exec para executar o comando python.

Ao chamar o programa python, devemos chamar, conforme apresentado.

#!/usr/bin/env python3

#import pandas as pd
import sys


pergunta = f'"{sys.argv[1]}"'

resposta= '"ok"'
print(resposta)

O detalhe que é importante é o comando /usr/bin/env chamando o python, que é destinado a transformar em um script python.

Para finalizar segue o link do url de teste:

http://maurinsoft.com.br/python/runpy.php?pergunta=teste2

O resultado é um JSON, conforme apresentado:

{"rs":[{"pergunta":teste2,"resposta":"ok" }]}

Instalando pacotes

Para adicionar pacotes basta rodar como administrador o comando:

pip3 install numpy

Exemplo de instalação do numpy

Blog Dicas Varejo
Competir ou Cooperar?

Outro dia, fui questionado por um entrevistador:

Voce tem uma empresa, voce desenvolve programas Open Source no meu segmento.

Porque deveria contratar um concorrente?

Naquele momento, percebi que minhas intensões não estavam sendo claras. E resolvi publicar este artigo.

Projeto Open Source nunca concorre com aplicações comerciais. Eu nunca ví, em meus 24 anos de carreira, uma empresa que faliu por conta de um software open source.

A única coisa que ví, foi a Microsoft, que depois de muito sofrimento, aderiu ao mundo open source. Hoje está ganhando dinheiro com Linux.

Então, se voce souber de alguma empresa que faliu por conta de um projeto open source, é bom falar agora, ou cale-se para sempre.

Software Open Source, são em sua essencia ferramentas de fomento e desenvolvimento.

Quando desenvolvemos um projeto Open source estável e seguro, este, cria um leque de possibilidades e serviços que qualquer empresa pode agregar.

De fato, projetos open source criam oportunidades, não as tira.

O Linux é o maior CASE do mundo open source, mas não é o unico.

Existem vários, como:

  • APACHE
  • Blender
  • Docker
  • GIT
  • KUBERNETES
  • R
  • SUGARCRM

Entre tantos outros.

O Apache mesmo, fomentou e desenvolveu diversos serviços e produtos. Sendo a base para produtos incriveis pagos.

VAREJO OPEN SOURCE

Poucas ações tem contríbuido mais com o varejo que o ACBR, projeto Open Source destinado a alavancar empresas no desenvolvimento de soluções para PDV e Self Checkout.

Conheço grandes player que trabalhei que a base de funcionamento do seu PDV é baseado no ACBR.

Apesar de termos um grande player, como o ACBR, existem poucas soluções Open Source destinadas ao Varejo.

Vamos falar de minhas soluções

Os projetos que desenvolvo, são sempre atrelados a Hardware, minha paixão.

Sempre que criei uma lib, ou desenvolvo conexão com um hardware, este pode e deve ser integrado, dentro de uma cadeia ou software house.

Vamos falar sobre alguns projetos:

O srvCP é um software (servidor) destinado a integrar com equipamentos de consulta de preço. Este por si só precisa de uma base de produtos, que deve ser integrada de um PDV ou CRM. Dificilmente um cliente entrega meu software sem ter um PDV ou CRM em sua loja.

Pois este precisa de uma base de produtos saneados.

Então, o srvCP não prejudica desenvolvedores de software, muito pelo contrário, agrega uma oportunidade, permitindo agregar o benefício de uso de leitores de preço sem a necessidade de desenvolvimento e manutenção deste equipamento.

Agora iremos falar sobre outro projeto o RFID, este projeto destinado a criar um leitor de RFID de mesa, não tem o objetivo de fornecer equipamentos para o varejo, ou atacadistas. Pois o seu desenvolvimento implica em assemblagem de equipamentos eletrônicos, bem como impressão. O que por fim acaba saindo mais caro que seus equipamentos industriais. Porem, este pode ser usado em ambientes de desenvolvimento, e equipes de TI, permitindo a simulação em seu PDV de cartões. Sem a real necessidade de compra de seus pares industrializados. O uso deste, permite aprimorar e desenvolver conceitos na indústria de software.

Outro exemplo, é o software de emissão de etiqueta, este projeto permite criar um serviço de impressão de etiquetas, permitindo a integração com o CRM, através de uma web api. Permitindo imprimir etiquetas de gondolas de forma fácil e transparente.

Por fim, iremos falar sobre o projeto Leitor Balança, este projeto visa criar um serviço de leitura de balança, que permite através de uma Web API ler o peso.

Vejam que os projetos Open Source são integrados e permitem integração, retirando das software houses a necessidade de desenvolvimento destes equipamentos, deixando elas se preocupar com seu real core business.

Vemos aqui, que projetos open source, são parceiros dos empreendedores, pois criam oportunidades de negócio, permitindo que estes foquem no que realmente é importante.

Com este texto, espero muito que as software house, percam o medo do desenvolvimento open source, e abracem a causa, pois este agrega oportunidades de negocio. Alavancando o negócio delas.

Grande abraço.

Marcelo Maurin Martins

Pai de 2 meninas, desenvolvedor

e apaixonado pelo Open Source.

srvCP Varejo
srvCP Versão 0.6

Esta versão veio com diversas correções e ajustes.

Itens adicionados:

  • Melhoria no controle de logs
  • Retirada dos CALLBACKs
  • Diminuição dos tempos dos timers
  • Correção na chamada de função de busca de dados.
  • Diversos ajustes em funções internas..

Todas as modificações visam garantir maior estabilidade da aplicação.

Porem ainda foram encontrados travamentos, porem com frequencia diminuída.

Estamos analisando os problemas a fim de corrigir o mesmo.

pt_BRPortuguese