TCC Raphaela Raika Sávio Vieira Vinicius Samuel
TCC Raphaela Raika Sávio Vieira Vinicius Samuel
TCC Raphaela Raika Sávio Vieira Vinicius Samuel
CAMPUS TRINDADE
CURSO BACHARELADO EM ENGENHARIA ELÉTRICA
TRINDADE - GO
2022
RAPHAELA RAIKA DOS ANJOS FERNANDES
SÁVIO VIEIRA FERNANDES
VINÍCIUS SAMUEL ALVES SOARES
TRINDADE - GO
2022
Sistema desenvolvido pelo ICMC/USP
Dados Internacionais de Catalogação na Publicação (CIP)
Sistema Integrado de Bibliotecas - Instituto Federal Goiano
Sistema de Gerenciamento de Consumo Energético: Solução automatizada para monitoramento de consumo de energia,
geração de usinas fotovoltaicas e créditos energéticos
Trindade 27 / 02 / 2023
Local Data
Ciente e de acordo:
O presente projeto tem por finalidade criar e implementar um sistema de gestão inteligente de e
unificado do consumo de energia, considerando também o fator geração caso exista uma usina
fotovoltaica (microgeração e minigeração) instalada, bem como realizar a análise do desempenho
e viabilidade de um sistema implementado nas cidades de Goiânia-GO e Aparecida de Goiânia-
GO durante o ano de 2022. O sistema é dividido em: montagem e teste de um dispositivo
protótipo para monitoramento do consumo de energia da unidade consumidora analisada em
tempo real; desempenho da usina fotovoltaica existente no local de teste; gestão de fatura e
créditos da concessionária de energia; cruzamento de dados e produção de relatório automático
ao usuário; criação de uma plataforma para disposição dos dados de maneira online ao usuário.
Esta análise tem como objetivo a constatação da utilidade, viabilidade técnica e econômica e a
escalabilidade do sistema para inúmeros usuários, também visa atestar o funcionamento do leitor
de consumo e comparar seu desempenho com outros equipamentos do mercado.
The purpose of this project is to create and implement an intelligent and unified management
system for energy consumption, also considering the generation factor if there is a photovoltaic
plant (microgeneration and minigeneration) installed, as well as performing an analysis of the
performance and feasibility of a system implemented in the cities of Goiânia-GO and Aparecida
de Goiânia-GO during the year 2022. The system is divided into: assembly and testing of a
prototype device for monitoring the energy consumption of the consumer unit analyzed in real
time; performance of the existing photovoltaic plant at the test site; energy utility bill and credit
management; data crossing and production of automatic report to the user; creation of a platform
for online data provision to the user. This analysis aims to verify the usefulness, technical and
economic viability and scalability of the system for numerous users, it also aims to attest to the
operation of the consumer reader and compare its performance with other equipment on the
market.
1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1 Objetivos Principais e Específicos . . . . . . . . . . . . . . . . . . . . . . 13
1.2 Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2 FUNDAMENTAÇÃO TEÓRICA . . . . . . . . . . . . . . . . . . . . . . 15
2.1 Hardware: Dispositivo Medidor de Consumo . . . . . . . . . . . . . . . 15
2.1.1 Sistema Elétrico de Potência . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.2 Geração Distribuída . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.3 Geração Fotovoltáica On Grid . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.4 Medição de Consumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Software: API e Plataforma Online . . . . . . . . . . . . . . . . . . . . . 17
2.2.1 Application Programming Interface . . . . . . . . . . . . . . . . . . . . . . 17
2.2.2 Web Scraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.3 Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.4 Hypertext Markup Language . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.5 PHP: Hypertext Preprocessor . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.6 Cascading Style Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.7 Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.8 Web Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.9 Web Host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.10 Estruturação para Plataforma Online . . . . . . . . . . . . . . . . . . . . . 21
3 METODOLOGIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1 Montagem do Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1 Conexão do Protótipo com Banco de Dados . . . . . . . . . . . . . . . . . 24
3.2 Requisito de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2.1 Web Scraping no Site da Concessionária . . . . . . . . . . . . . . . . . . . 25
3.3 Programação da Plataforma Online . . . . . . . . . . . . . . . . . . . . . 26
4 RESULTADOS E DISCUSSÃO . . . . . . . . . . . . . . . . . . . . . . . 29
4.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.1.1 Montagem do Protótipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.1.2 Aferição dos Sensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1.3 Código em Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.1.4 Armazenamento de Dados de Leitura . . . . . . . . . . . . . . . . . . . . . 34
4.1.5 Leituras Obtidas com o Protótipo Instalado . . . . . . . . . . . . . . . . . . 34
4.1.6 Validação das Leituras de Consumo . . . . . . . . . . . . . . . . . . . . . . 36
4.2 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2.1 Teste do Script API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2.2 Plataforma Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5 CONCLUSÕES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6 CONSIDERAÇÕES FINAIS . . . . . . . . . . . . . . . . . . . . . . . . 48
REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
APÊNDICES 52
1 INTRODUÇÃO
dentro dos horários de produção é consumida instantaneamente pelo local de instalação e so-
mente o excedente é injetado na rede, fora do horário de geração o consumo do local se dá
inteiramente da concessionária de energia. Segundo, o autoconsumo remoto, em que a carga
recebe somente os créditos da concessionária em forma de abatimento de fatura e saldo, isso
acontece quando o local de geração e da unidade consumidora são divergentes. Apesar de ser um
conceito simples, este sistema pode ser uma medida significativa para auxiliar os consumidores
a estabelecer um comportamento de controle e economia de energia, principalmente em caso de
usinas residenciais ou comerciais de pequeno porte que são modelos de instalação mais fáceis de
gerenciar.
É válido observar, que embora as faturas emitidas por todas as concessionárias de
energia do Brasil estejam submetidas a estrutura definida pelo Módulo 11 do Procedimentos
de Distribuição de Energia Elétrica no Sistema Elétrico Nacional - PRODIST (ANEEL, 2017),
é possível que a maneira de disposição das informações possa variar de acordo com layout,
sistemas tarifários e impostos de acordo com cada região, o que pode facilitar ou dificultar
a compreensão de informações por parte do cliente convencional. Outra barreira significativa
no ato de adesão de uma usina fotovoltaica é conceito de consumo instantâneo, uma vez que
é contabilizado no valor total de geração da usina porém, por ser consumido imediatamente,
não chega a ser registrado no valor de energia injetada na rede da concessionária, sendo assim,
somente com o uso de um equipamento que monitora o consumo mensal dentro do quadro de
distribuição que este cliente conseguirá visualizar o consumo instantâneo, que será o valor total
registrado pelo medidor de consumo subtraído o valor registrado pela concessionária de energia.
Com o intuito de possibilitar um método mais intuitivo para compreensão do consumo
de energia, e todo o sistema de geração de energia até o momento de abatimento de créditos
energéticos caso tenha uma usina fotovoltaica instalada, uma opção seria projetar um sistema
capaz de realizar a aquisição de todos os dados pertinentes, interpretar e calcular dados caso
necessário, registrar todas as informações de consumo e, por fim, dispor todas as informações
ao usuário de uma maneira intuitiva e de fácil acesso. Sendo assim, a maneira mais viável para
o sistema proposto seria estabelecer uma estrutura em duas vertentes, sendo elas: um medidor
de consumo em kWh, para registrar o consumo diretamente do quadro geral de distribuição da
unidade desejada; Uma plataforma online, composta por um site e um bot programado, capaz
de fazer a aquisição dos valores de geração da usina fotovoltaica e as informações importantes
fornecidas pela concessionária, receber os dados de consumo lidos pelo software, calcular o
consumo instantâneo da unidade em questão e, por fim, dispor todas essas informações em uma
plataforma online e em forma de relatório.
• Criar Application Programming Interface (API) para efetuar a aquisição de dados de gera-
ção do sistema de monitoramento da usina fotovoltaica; buscar todos os dados relevantes
no site da concessionária de energia sobre a unidade consumidora em questão; manipular
e preparar os dados para o envio a um Banco de Dados.
• Comparar os dados registrados no Banco de Dados para traçar o perfil de geração, consumo
e créditos do cliente;
• Verificar, caso exista uma usina fotovoltaica, se o perfil de consumo está condizente com a
geração projetada, e, caso não esteja, alertar o usuário sobre a situação;
• • Criar uma plataforma online para exibir ao cliente, de maneira transparente e simplificada,
dados como valor da tarifa, energia injetada, consumo e créditos registrados na fatura de
energia fornecida pela concessionária;
• Instalar, testar e estudar os dados obtidos com a leitura para validação do funcionamento
do sistema.
1.2 Justificativa
Uma barreira que pode ser encontrada para este usuário em potencial é o fato de que,
para acessar todas as informações de seu sistema de energia completo, ele deve acessar o
site da concessionária de energia, o do aparelho de monitoramento de consumo e, no caso de
possuir uma usina fotovoltaica instalada, o site ou aplicativo do inversor solar que monitora
a geração. Prezando pela lógica de gerar uma motivação neste usuário em potencial, ter um
sistema de monitoramento de consumo que integre um sistema que seja capaz de realizar este
gerenciamento é uma vantagem competitiva, técnica e até mesmo econômica. Sendo assim,
uma opção é desenvolver um medidor de consumo de energia elétrica por meio da medição de
tensão e corrente elétrica, utilizando uma plataforma de prototipagem eletrônica com acesso a
um servidor externo para armazenar os dados lidos, possibilitando que o usuário possa acessar
em tempo real o valor que está sendo consumido por ele.
15
2 FUNDAMENTAÇÃO TEÓRICA
Sistema elétrico de potência é definido como rede de componentes elétricos usados para
geração, transmissão e distribuição de energia elétrica. (SCHAVEMAKER; SLUIS, 2017).
Historicamente, os sistemas elétricos de potência foram desenvolvidos com base na
geração centralizada com redes de transmissão e distribuição, transportando energia até os
consumidores. Composto por uma parcela de combustível fóssil significativa em sua matriz,
o setor de energia responde por grande parte das emissões gases poluentes, indo contra a
necessidade de redução da produção de agentes agressores ao meio ambiente. (MIRANDA,
2012) Portanto, é perceptível que a redução de emissões de gases poluentes está diretamente
relacionada à descarbonização do setor de energia através da procura constante de implantação
de fontes de energia limpas e renováveis.
Geralmente a geração distribuída (GD) é definida com base em seu tamanho e localização,
mas alguns países a definem por algumas características básicas como: renovável, cogeração, não
despachável ou alguma outra modalidade específica. Nas definições da literatura para geração
distribuída (GD) não são consistentes, mas diferentes termos e definições são usados. Uma
definição bastante consolidada e aplicada no Brasil é uma usina geradora conectada diretamente
à rede de distribuição através de um medidor, geralmente bidirecional (NASCIMENTO et al.,
2014). Um modelo deste método de geração que tem se mostrado promissor no Brasil é a
geração solar fotovoltaica que, além dos benefícios ambientais, apresenta benefícios sistêmicos
energéticos e elétricos, no entanto é preciso estar ciente de que também há custos e riscos.
No Brasil, após a Resolução Normativa nº 482/2012 (ANEEL, 2012),a geração distribuída
se difundiu através da micro e minigeração distribuídas de energia elétrica por meio de usinas
fotovoltaicas. Com o intuito de democratizar o acesso a este modelo de geração por mais
consumidor, a ANEEL adotou medidas como reduzir os custos e prazos para a conexão na rede,
harmonizar o sistema de compensação de energia elétrica, possibilitar a adesão do sistema para o
maior número de consumidores possível, além de melhorar as informações na fatura na resolução
Normativa nº 687/2015 (ANEEL, 2015), revisando a resolução normativa nº 482/2012.
nacional, uma vez que o Brasil apresenta um nível de irradiação solar satisfatório, fazendo com
que as usinas sejam capazes de produzir energia durante o ano inteiro, oferece redução contínua
de custos ao longo dos anos, é um sistema estável e precisa de manutenção simplificada.
Existem duas classes do sistema de energia solar, um deles é o sistema Off-Grid ou
autônomo, onde a geração e o consumo de energia não se conecta à rede de distribuição, logo,
não injeta energia na rede da concessionária. A outra classe, que será utilizado no presente
projeto, é o sistema On Grid ou conectado à rede da concessionária realizando injeção de energia,
consumindo diretamente da rede em horário que não há produção da usina e recebendo créditos
energéticos (CADAVAL et al., 2013).
Um ponto importante que deve ser levantado sobre uma usina fotovoltáica On Grid é sua
estrutura básica que deve ser composta por uma parte para sustentar os módulos fotovoltáicos
para possibilitar melhor posicionamento e inclinação, com o intuito de captar a maior quantidade
de radiação solar possível; um medidor bidirecional para medir o consumo na unidade instalada
e também registrar a quantidade injetada na rede elétrica; o inversor solar, que é responsável por
transformar a corrente elétrica contínua para alternada, garante o fluxo regular da eletricidade e
segurança, além de possibilitar a sincronia com a rede da concessionária; materiais elétricos para
conexão e proteção do sistema como disjuntores, conectores e cabeamento elétrico; as células
fotovoltáicas que captam a luz do sol, fazendo com que os elétrons se movimentem e produzam
a corrente elétrica, vale ressaltar que um painel solar de qualidade tem vida útil de até 25 anos.
e usam protocolos definidos para permitir que desenvolvedores criem, conectem e integrem
aplicativos rapidamente e em escala. As API se comunicam por meio de conjunto de regras que
definem como computadores, aplicativos ou máquinas podem se comunicar entre si (IBM, 2020).
Para o projeto em questão, foi desenvolvido API composto por scripts na linguagem python
para realizar o web scraping no site da concessionária de energia ENEL-GO e no sistema de
monitoramento da geração da usina fotovoltaica que foi utilizada como teste.
Web scraping, também conhecido como raspagem da Web, é o processo de usar “robôs”
(bots) para extrair conteúdo e dados de páginas ou sites online e é bastante empregado em
sites de comparação de preços para recuperar automaticamente preços e descrições de produtos
para sites afiliados ou empresas de pesquisa de mercado para extrair dados de fóruns e mídias
sociais (FARIAS; ANGELUCI; PASSARELLI, 2021). Bots legítimos são identificados com
a organização para a qual eles raspam e obedecem ao arquivo robot.txt de um site, que lista
as páginas que um bot tem permissão para acessar e aquelas que ele não pode. Também é
a prática utilizada para construção de bots maliciosos que, por outro lado, rastreiam o site,
independentemente do que o operador do site tenha permitido com o intuito de roubar dados
protegidos por direitos autorais.
PHP é uma linguagem de script de uso geral de código aberto amplamente usada que é
especialmente adequada para o desenvolvimento da Web e pode ser incorporada ao HTML. Essa
linguagem é frequentemente utilizada para automatizar a execução de tarefas em um ambiente de
tempo de execução específico como, por exemplo, usar um script para validar com segurança se
todos os campos do formulário foram preenchidos antes de serem enviados de volta ao servidor,
no qual o script será executado e verificará todos os campos quando o usuário enviar o formulário
(DUCKETT, 2022).
Para uma plataforma com a característica de autenticação de dados de acesso através de
informações como perfis particulares e senhas, considerando que a plataforma a ser acessada
possui finalidade acadêmica, uma estrutura PHP é uma maneira mais indicada por sua facilidade
estrutural. Uma aplicação que será utilizada é a verificação e autenticação da existência do
registro que houve tentativa de login, autorização de acesso e encaminhamento para páginas
permitidas, bem como o bloqueio de acesso em páginas que o usuário em questão não possui
autorização de acesso.
CSS significa Cascading Style Sheets language e é usado para estilizar elementos escritos
em uma linguagem de marcação como HTML, essa relação entre HTML e CSS está fortemente
marcada e perceptível, porque HTML é a base de um site e CSS é toda a estética do mesmo. Antes
de usar CSS, todos os estilos tinham que ser incluídos na marcação HTML, já com as devidas
atualizações da integração das tags CSS, é possível estilizar tudo em um arquivo diferente,
criando o design na Style Sheets e depois incorporando os arquivos em cima da marcação HTML.
Isso torna a marcação HTML real muito mais limpa e fácil de manter. Vale ressaltar que o CSS
permite que você tenha vários estilos em uma página HTML, o que torna as possibilidades de
personalização quase infinitas (LIE; BOS, 2005).
As configurações de elementos visuais estáticos da plataforma online devem ser desen-
Capítulo 2. FUNDAMENTAÇÃO TEÓRICA 20
volvidos através da linguagem CSS, uma vez que não necessite ações de responsividade dos itens
desejados, facilita algumas definições rápidas como alteração de cores e tamanhos de elementos
e textos.
2.2.7 Bootstrap
Para ser possível construir uma plataforma online, que atenda às necessidades do
projeto, é preciso que possua a função de criação de acesso por login de usuário com autenticação
do mesmo, sendo assim, o primeiro passo é estabelecer a criação e conexão com um banco de
dados online. Uma maneira é criar um script PHP com os dados de acesso do servidor para
estabelecer a conexão com o banco de dados, após sua criação esse arquivo pode ser importado
em qualquer outro script que precise acessar o mesmo banco de dados.
A página inicial, por se tratar de um projeto acadêmico, pode ser escrita na linguagem
HTML, sua estrutura geralmente é composta por "head" e "body". O script geralmente é iniciado
pelo "head", onde se coloca dados e configurações que não devem ou precisam ser exibidos na
página de maneira visível ao usuário. Para o topo da página uma escolha apropriada uma barra
de menu de cor sólida, com a logo à esquerda e botões à direita, esse tipo de disposição de menu
facilita o direcionamento do usuário entre as páginas disponíveis no site, acessos, login e logout.
O "body" é a estrutura que compõe a página e é visível para o usuário, comporta e exibe imagens,
textos e botões de direcionamento. Por se tratar de um projeto acadêmico, para compor toda a
parte estética da página foram escolhidas imagens de domínio público
Por se tratar de um sistema de gerenciamento de dados vinculados a usuários específi-
cos, os logins de usuário devem ser previamente cadastrados no sistema diretamente no banco
de dados. A página de login pode ser criada caso o usuário queira acesso aos seus dados por
múltiplos logins, sendo assim, ele faz o registro nessa página e solicita o vínculo entre o novo
usuário com sua página privada. Para este script, o primeiro passo é utilizar é importar o script de
configuração para efetuar a conexão com o banco de dados de usuários e, em seguida, verificar
se o nome de usuário e senha são válidos para que o registro seja concluído. A estrutura da
página pode ser feita em HTML, para o "head" utiliza a estrutura da página inicial caso ela seja
o padrão definido a ser seguido, já para o "body" é preciso configurar todos os campos de entrada
de textos de usuário e senha, botão de registro e links de redirecionamento para página de login.
Para realizar a autenticação de usuários cadastrados ou, em caso de cadastro ou dados
inválidos, informar que o usuário não foi encontrado, a estrutura utilizada pode ser criada em
PHP, fazendo conexão com o banco de dados através do arquivo de configuração. A área de login
pode ser montada de maneira bem simples e padrão, com campo de entrada para usuário e senha,
além do botão de envio dos dados, também é válido adicionar um link de redirecionamento para
a página de registro caso não seja encontrado um usuário válido para as informações digitadas.
Uma parte muito importante de um site é dar ao usuário toda a autonomia possível
para manipulação de sua página pessoal, sendo assim, é primordial criar um botão de logout para
que a sessão possa ser encerrada automaticamente com apenas um clique.
Cada login de usuário pode ser vinculado a uma página privada que apresenta todos os
dados coletados sobre a geração de sua usina, consumo de energia e créditos da concessionária
Capítulo 2. FUNDAMENTAÇÃO TEÓRICA 22
de energia e demais dados de leitura. Para encaminhar de maneira correta cada usuário para sua
conta, pode ser criado um trecho de código em PHP para sincronizar os dados de usuário com
sua página privada e fazer esse redirecionamento. Ao entrar na própria página pessoal, o usuário
tem todos os seus dados coletados (geração, consumo e créditos) dispostos em uma tabela bem
intuitiva e de fácil compreensão. Como auxílio visual, pode ser adicionado um gráfico de barras
do tipo "Morris"com um conjunto de três barras referentes a cada mês registrado, sendo elas:
geração na cor verde, consumo na cor vermelha e autoconsumo (valor do consumo subtraído do
valor de geração) em azul.
Se tratando de um sistema de gerenciamento, é imprescindível que o administrador do
sistema seja capaz de buscar dentro do banco de dados todos os registros referentes a um cliente
específico, de um mês específico de vários clientes ou qualquer outra situação semelhante. Para
isso, o método adotado pode ser a construção de uma tabela em uma página com PHP e HTML
combinados, respeitando a configuração de estilo citada anteriormente e método de autenticação
PHP.
23
3 METODOLOGIA
Com o intuito de criar um dispositivo protótipo que seja capaz de registrar a leitura de
consumo da unidade consumidora ao qual será instalado, o primeiro procedimento que deverá ser
efetuado é a listagem dos componentes principais e suas determinadas funções. Será necessário
o uso de um Módulo WiFi que possa fornecer a qualquer microcontrolador acesso a uma rede
WiFi e que apresente uma pré-programação que seja compatível diretamente com o Arduino. O
modelo que deverá apresentar uma alta velocidade de processamento e de comunicação, (para
que ocorra o envio de todas as informações sem que haja perdas por causa da quantidade de
informações), protocolos de comunicação (PC) utilizado; Conversor analógico-digital (ADC) de
6 canais com interface SPI (Serial Peripheral Interface).
O uso desse componente será necessário para mitigar possíveis problemas nas portas
analógicas de comunicação do Módulo WiFi; Sensor de corrente (SC) que apresente caracte-
rísticas não invasivas, uma vez que será instalado em um quadro de distribuição já existente e
ativo, facilitando a instalação e o manuseio no sistema, com um valor de corrente suportado
compatível com os níveis máximos esperados em picos do sistema para garantir maior segurança
na instalação; Sensor de tensão (ST) que seja um transformador de tensão capaz de medir tensão
CA até 250 volts com saída analógica, caso tensão de entrada seja alterada, a tensão de saída
também mudará.
Para efetuar medição de tensão serão utilizados bornes, nos quais serão conectados
cabos responsáveis por adquirir tensão; a saída do borne deverá ser conectada ao sensor de tensão
utilizando o neutro comum. A saída do sensor poderá apresentar uma tensão incompatível com
o sensor que será escolhido, devido a isso, uma possível solução para o problema poderá ser
realizado a correção desse valor com a adição de diodos em série com cada um dos sensores.
Na leitura de corrente será utilizado um sensor de corrente não invasivo, com o intuito
de evitar interrupção do funcionamento do sistema elétrico no local de instalação, facilitar a
montagem e também garantir maior segurança no processo de instalação. A indicação é utilizar
um sensor que apresente um pino de 3,5mm em sua saída, serão adicionados na placa ilhada 3
conectores compatíveis. Para aquisição da corrente, o sensor deverá se comportar como uma
espécie de transformador, assim o fio que passa através do sensor irá operar como o primário e as
saídas do sensor como um secundário, sendo um fio de referência e o outro de sinal. As portas de
corrente serão conectadas nas entradas 5, 6 e 7 e as de tensão nas entradas 0, 3 e 4 do conversor
Analógico-Digital. O conversor será conectado ao módulo Wifi através as portas 12,13,14 e 15,
para alimentar o sistema será conectada uma fonte de tensão. Também poderá ser adicionado um
regulador de tensão para possibilitar alcance de maior estabilidade e filtrar possíveis ruídos.
Capítulo 3. METODOLOGIA 24
Nesse trecho de código as bibliotecas time e datetime deverão ser utilizadas para de-
terminar o mês e ano atual, sendo assim, com esses dados também será possível determinar o
mês anterior e, consequentemente, determinar as datas "início"(ano atual - mês anterior - dia
da leitura do mês anterior ) e "fim"(ano atual - mês atual - dia da leitura do mês atual). Com
as datas de "início"e "fim"definidas, o trecho de código irá gerar um array que contendo todas
as datas contidas no intervalo desejado. Com intervalo definido, deverá ser implementado ao
script o código capaz de fazer o login automático no site de monitoramento de geração da usina
fotovoltaica, seja ele diretamente no inversor solar ou com um equipamento externo instalado no
sistema. Um método de Web scraping adequado para esse esse trabalho é uma requisição em
JSON para capturar somente os dados de geração total diário em kWh.
autoconsumo pode grosseiramente ser calculado subtraindo o valor de geração registrado pela
concessionária de energia do valor total de geração registrado pelo inversor solar.
Para gerar o relatório do cliente, poderá ser criado um template em algum aplicativo
externo para ser utilizado em formato PDF para compor toda a parte visual estática, ou seja,
layout padrão a ser utilizado para todos os relatórios gerados posteriormente. Já para a parte
dinâmica, que vai incluir os dados específicos de cada cliente, a opção é escrever e gerar o
gráfico e tabela diretamente com bibliotecas python. Com o intuito de facilitar o entendimento
dos dados mais cruciais de todo esse processo, sendo eles a geração e o consumo registrado
pela concessionária, será utilizada uma representação visual em forma de gráfico horizontal de
barras paralelas através de um array formado por 12 parâmetros, onde cada deles significa um
conjunto de dados mensal (mês referência, geração, consumo). A criação dos gráficos com a
biblioteca utilizada seguirá um padrão de organização sendo o primeiro conjunto mensal do
gráfico o maior valor de geração e o último conjunto o de menor valor de geração. Uma parte
crucial para gerar o gráfico será definir corretamente todas as configurações de espessura das
barras, cores diferentes para geração e consumo, tamanho de fonte para textos e espaçamento
vertical entre as barras, também é necessário definir as configurações de visibilidade dos eixos x
e y, desativação de grid, espaçamento das margens (topo, rodapé, direita e esquerda) e ativação
da legenda do gráfico. Na tentativa de evitar quebra na configuração visual do gráfico, uma vez
que sempre será projetado sobre um template padrão, a melhor opção é exportar esse gráfico
gerado como uma imagem e, em seguida, buscar essa imagem novamente com outra função,
toda a parte de inclusão de imagem e textos sobre o modelo padrão previamente definido foram
adicionados com a biblioteca reportlab.
Para concluir a parte de texto, será preciso definir todo o posicionamento de cada dado
raspado (do monitoramento de geração ou da concessionária de energia), calculado e importado
do banco de dados. Toda a definição de posicionamento utilizará o comando drawString da
biblioteca reportlab, definindo as coordenadas de posicionamento, sendo: horizontal, vertical,
variável ou texto. Após importar a imagem do gráfico gerada no passo anterior, será necessário
definir o posicionamento, dimensões da imagem e a suavização visual da sobreposição da
imagem em um arquivo já existente. Para finalizar do relatório, o script fará a integração do
arquivo template em PDF com a imagem do gráfico e os textos gerados pelos dados adquiridos e
manipulados por todo esse sistema, resultando em um PDF final que será enviado por email para
o cliente.
Por se tratar de uma plataforma que permitirá a criação de acesso de usuário e também
fará a autenticação do mesmo, o primeiro passo é estabelecer a conexão com um banco de
dados online através de um script. Este script poderá ser um arquivo PHP com finalidade de
configuração e, após sua criação, esse arquivo poderá ser importado em qualquer outro script
Capítulo 3. METODOLOGIA 27
conta, será desenvolvido um trecho de código em PHP para sincronizar os dados de usuário com
sua página privada e fazer esse redirecionamento. Ao entrar na própria página pessoal, o usuário
terá todos os seus dados coletados (geração, consumo e créditos) dispostos em uma tabela bem
intuitiva e de fácil compreensão. Como auxílio visual, será adicionado um gráfico de barras
do tipo "Morris" com um conjunto de três barras referentes a cada mês registrado, sendo elas:
geração na cor verde, consumo na cor vermelha e autoconsumo (valor do consumo subtraído do
valor de geração) em azul (Apêndice H).
Por se tratar de um sistema de gerenciamento, é imprescindível que o administrador do
sistema seja capaz de realizar buscas dentro do banco de dados todos os registros referentes a
um cliente, de um mês específico de vários clientes ou qualquer outra situação semelhante. Para
isso, será realizada a construção de uma tabela em uma página com PHP e HTML combinados,
assim como nos scripts anteriores, respeitando a configuração de estilo definida anteriormente e
método de autenticação PHP (Apêndice I).
29
4 RESULTADOS E DISCUSSÃO
4.1 Hardware
Componente Quantidade
Placa ilhada 5x7 mm 1 un.
Sensor de tensão ZMPT101B, 0 a 250V 3 un.
Sensor de corrente SCT-013-050, 50A 3 un.
Diodo IN4007 9 un.
Capacitor 2200uF 1 un.
Capacitor 1100uF 2 un.
Capacitor 10uF 3 un.
Resistor 6,8 k ohm 6 un.
Conector empilhável para arduino 20 vias 1 un.
Conector Jack P2 J2 estéreo áudio 3,5mm 3 un.
ESP 8266 1 un.
Fonte de 9v 1A 1 un.
LM7805 1 un.
Soquete torneado 8 vias 2 un.
Ferro de solda
Estanho
Mcp3208 1 un.
Borne 3 polos - KF-301 3T 1 un.
Borne 1 polo – KF-301 1T 1 un.
Conector emenda 3 polos – WAGO 1 un.
Plug fêmea 10A 1 un.
Cabo paralelo 1,5mm 3 un.
Álcool isopropílico 300ml
Cabo USB (Configuração) 1 un.
Fio para conexões 1 un.
o MCP para integrar os sensores ao módulo Wifi; Sensor de corrente SCT-013-050 (SC) - foi
escolhido por apresentar características não invasivas ao sistema pois o mesmo se encaixa ao
redor de um condutor já instalado, evitando interrupções do funcionamento do sistema e suportar
um valor de corrente compatível com os níveis máximos esperados em picos; Sensor de tensão
ZMPT101B, 0 A 250V (ST) - foi escolhido por possuir um isolamento galvânico, isolando as
portas de leitura da saída do sensor. Por apresentarem uma arquitetura compacta, facilitam o
manuseio e instalação, apresenta significativa precisão para calibração e custo atrativo.
Para efetuar medição de tensão foram utilizados Bornes (um de 1 e outro de 3), nos quais
foram conectados cabos responsáveis por adquirir tensão; a saída do Borne foi conectada ao
sensor de tensão utilizando o neutro comum (ZMPT101B). A saída do sensor apresentou uma
tensão incompatível com o sensor escolhido (MCP3208), devido a isso, foi observado através de
osciloscópio que sem haver leitura de valores na entrada, a saída do osciloscópio era de 2,5V e,
ao ligar em sua entrada, a tensão da tomada (no caso 220V), gerou uma senoide variando com
uma tensão mínima de 2,2V. A tensão de pico máxima observada em 220V não era capaz de
reproduzir um pico de 3V, ou seja, a variação de tensão pico a pico era de apenas 1V. A fim de
compatibilizar a leitura de tensão (em 3,3V Máxima) e a saída teórica máxima do sensor é de
Capítulo 4. RESULTADOS E DISCUSSÃO 31
5V, foi adicionado 3 diodos em série com cada um dos sensores, cada diodo com uma queda de
tensão fixa de 0,7V, ao final resultou em uma saída máxima do sensor de 2,9V (5V [que é padrão
do sensor] - 2,1V [Queda de tensão]), ficando dentro do limite de leitura (no caso 3,3V).
Para leitura de corrente foi utilizado o SCT 013 por não ser invasivo, facilitando a monta-
gem e também a segurança no processo de instalação e funcionamento, como esse sensor possui
um pino de 3,5mm em sua saída, foram adicionados na placa ilhada 3 conectores compatíveis
(Conector jack P2 J2 Estéreo Áudio 3,5mm). Para aquisição da corrente, o sensor se comportou
como uma espécie de transformador, assim o fio que passa através do sensor operava como o
primário e as saídas (p2) do sensor um secundário, sendo um fio de referência e o outro de sinal,
caso a referência fosse conectada no negativo da placa resultaria em uma saída no outro terminal
do sensor, porém alternada, chegando no semicírculo negativo; saindo do range de leitura do
MCP do protótipo capaz de fazer a leitura apenas da parte positiva. Em busca de uma solução
para este problema, foi conectado o terminal de referência a um valor intermediário utilizando
um divisor de tensão com 2 resistores de 6,8 k em 3,3V, apresentando um valor de 1,65V.
Ligando a referência no divisor, a outra extremidade iria variar a sua leitura dentro espectro
do MCP, a fim de atenuar possíveis ruídos. Também foi adicionado um capacitor de 10uF em
paralelo com um dos resistores a placa, em específico entre o negativo e o referencial.
A ideia inicial era ligar de forma direta os sensores nas portas de leitura analógica do
ESP, porém não foi possível, por se tratar de um sinal de 60Hz; para que fosse obtida uma boa
reprodução do sinal, seria necessário ler diversos pontos dentro de um mesmo período a fim de
uma maior precisão nos resultados, o ADC interno do ESP se mostrou totalmente incapaz de
realizar a leitura por se tratar de uma entrada variável e também uma frequência de aquisição
muito rápida. Na tentativa de leitura apenas com o ESP foi retornado apenas ruídos, sendo
impossível retirar o ruído mesmo com filtros passa baixa e somadores operacionais, visto que
esta é uma limitação do ADC interno. Para que esse problema fosse resolvido foi utilizado um
ADC externo, o MCP3208, assim os sensores foram incorporados as portas do mesmo; e através
do protocolo SPI o ADC teriam comunicação constante com o ESP, enviando os dados de suas
portas a ele.
As portas de corrente foram conectadas nas entradas 5, 6 e 7 e as de tensão nas entradas
0, 3 e 4 do MCP, já o MCP foi conectado ao ESP através as portas 12,13,14 e 15. Para alimentar
o sistema foi conectada uma fonte de 9V, como a tensão de alimentação dos sensores de tensão
era de 5V e o ESP poderia ser alimentado com essa mesma tensão. O LM7805 foi utilizado para:
regulagem da tensão, alcance de maior estabilidade e filtro de possíveis ruídos. Visando melhor
desempenho do sistema, o circuito foi projetado da seguinte maneira:
Capítulo 4. RESULTADOS E DISCUSSÃO 32
1024
∗ (0, 7V ∗ 3) = 651, 6364
3, 3V
Esse valor foi multiplicado por uma constante pré-definida pelo sensor na biblioteca, com
o seguinte valor: 234.26 . Com o intuito de alcançar uma regulagem mais precisa no sensor, foi
utilizado o trimpot de cada um deles para permitir calibragem individual. Para ajustar os sensores
foi utilizado um multímetro Minipa© ET-2082D com certificação de calibração válida que foi
conectado em paralelo o sensor a ser calibrado, na rede da concessionaria local, o ajuste foi
realizado manualmente rotacionado o trimpot até a obtenção dos mesmos valores. O multímetro
também foi utilizado para calibrar os sensores de corrente, o foi realizado em banco de resistores
que foi conectado em serie ao leitor de corrente com o intuito de medir a corrente de uma quantia
de resistores em série.
Como anteriormente, foi ajustado o valor lido pelo sensor de acordo com o multímetro
de manualmente e, em seguida, após ajustar todos os sensores envolvidos, foi mudado o arranjo
dos resistores para que as leituras fossem realizadas novamente pelos sensores para validar se o
valor medido pelo sensor era o mesmo lido pelo multímetro.
Capítulo 4. RESULTADOS E DISCUSSÃO 33
Foram usadas 3 principais bibliotecas: a MCP 3008, que realiza a comunicação com o
ADC externo, a EmonLib que realiza os cálculos de conversão da leitura dos sensores em valores
de tensão e corrente, e a ESP8266HTTPClient que realiza a comunicação entre o protótipo e o
servidor, além dessas foram utilizadas as bibliotecas ESP8266WiFi e WiFiClient responsáveis
pela comunicação Wifi.
A biblioteca EmonLib foi utilizada para captar os dados analógicos dos sensores e realiza
os cálculos para tensão e corrente, que se trata do processo mais delicado, contudo essa mesma
biblioteca busca os pinos de leitura analógica do próprio dispositivo no qual ela é instalada, não
tendo de forma nativa recursos para um ADC externo, para contornar esse empecilho foi feita a
alteração da biblioteca, assim todos os pinos referenciados a leitura seriam no final a do ADC,
outro problema enfrentado nesta mesma biblioteca foi o paralelismo de leituras visto que havia
três leituras de tensão e três de corrente. Seria possível abrir várias instâncias da biblioteca e
realizar a leitura RMS de uma das fases, depois a outra, mas isso implicaria em um período
Capítulo 4. RESULTADOS E DISCUSSÃO 34
grande de ausência de leitura, resultando em dados com erros de leitura significativos, o que
acarretou mais uma edição da biblioteca para solucionar o problema. Essa alteração fez com que
a leitura fosse feita em sequência os valores instantâneos e, em seguida, realizando os cálculos
em RMS uma vez a cada 800ms aproximadamente, ou seja, dentro desse mesmo tempo seria
possível armazenar muitos leituras instantâneas de ambas as fases e realizar os cálculos.
Por se tratar de um protótipo para um projeto acadêmico, no qual não houve intenção
inicial de comercialização, alguns dos componentes que foram escolhidos para integrar essa
montagem apresentaram algumas limitações que não se apresentaram prejudiciais. Uma limitação
significativa encontrada foi a parte de envio das leituras da memória interna do equipamento
para o servidor que receberia esses dados, o problema encontrado foi o fato de que a leitura
instantânea seria interrompida no momento do envio, ou seja, haveria um período indeterminado
de ausência de leituras de consumo.
Em busca de resolver o problema com a leitura dos dados, a saída escolhida foi salvar as
leituras instantâneas diretamente em um banco de dados hospedado em um servidor Web. Para
acompanhar os dados lidos foi criada uma página HTML, conectada ao Banco de Dados, com a
finalidade de exibir todas as efetuadas de maneira online. Nessa página específica não houve
tratamento de dados ou implementação de elementos visuais, uma vez que seu propósito foi
somente verificar se a leitura ainda estava em andamento sem precisar abrir o servidor.
Para fins de validação, foram recolhidos os dados de consumo registrados por esse
medidor pelo monitoramento PWRview, próprio da marca Generac©, que registrou todo o
consumo de energia diariamente durante o mesmo período que o medidor protótipo, ambos
conectados ao mesmo quadro e mesmas fases. Os dados de consumo registrados pelo medidor
Generac resultaram no seguinte gráfico:
Capítulo 4. RESULTADOS E DISCUSSÃO 37
Com o intuito de mensurar o erro, de maneira visual, foi criado um gráfico representando
a comparação entre o consumo lido por ambos os medidores de consumo. O erro encontrado em
cada leitura, de acordo com os dados, se manteve inferior a 0,5kWh de maneira bem constante,
exceto no dia 23 em que o erro foi de 5,21kWh.
Para ser possível estabelecer uma validação mais precisa entre os equipamentos, o
medidor de consumo Neurio© e o protótipo, foi feita uma análise comparativa de uma leitura a
cada hora em um período de 24 horas referente ao dia 04/11/2022. O resultado obtido foi:
Ao final da comparação entre as leitura foi possível afirmar que, apesar de ter sido
calibrado manualmente através do método de tentativa e erro, o protótipo se mostrou apresentou
mais eficiente e assertivo que o esperado.
4.2 Software
A unidade consumidora que serviu de base para a validação do API possuia um histórico
de consumo de energia elevado, com fornecimento monofásico e geração fotovoltaica com
potência projetada de 17,085kWp . Com a aquisição de dados por meio de scraping, feito no site
da concessionária de energia Enel-GO e no monitoramento de geração fotovoltaica Solarview©,
baseado na lógica de seletores do Playwright, foi possível testar todos os aspectos relevantes para
um gerenciamento de consumo completo. Após a execução do scrit, os dados foram recolhidos e
tratados assim como descrito no capítulo de metodologia e, após serem atribuídos a variáveis
e estruturado em uma tabela dataframe, as informações se tornaram adequados para envio ao
banco de dados de um servidor web. Após conexão com o servidor, os dados foram alocados
através do phpMyAdmin da seguinte maneira:
Capítulo 4. RESULTADOS E DISCUSSÃO 40
Para gerar o relatório do usuário foi criado um template, no Canva©, para ser utilizado
em formato PDF para compor toda a parte visual estática padrão a ser utilizado para todos os
relatórios gerados posteriormente. Na parte superior do relatório foram adicionados elementos
como a logo do projeto, uma ilustração simples representando os dados de geração da usina e
sua distribuição, também foram incluídos dados como consumo e autoconsumo.
Já para a parte dinâmica, que inclui os dados específicos de cada usuário, a opção foi
utilizar a biblioteca Reportlab para importar os dados armazenados no Banco de Dados em forma
de variável e incorporar as mesmas em forma de texto, além de ajustar o posicionamento de cada
informação de acordo com o layout padrão.
Capítulo 4. RESULTADOS E DISCUSSÃO 41
Para isso, o método adotado foi a construção de uma tabela em uma página com PHP
e HTML combinados assim como nos scripts anteriores, resspeitando a configuração de estilo
citada anteriormente e método de autenticação PHP. Por ser tratar de uma página que pode
comportar um volume de informações grande, formado por diversos clientes e datas referência, a
estrutura da tabela foi criada com campos de pesquisa em seu topo para realizar filtragem de
dados, podendo ser utilizados todos eles simultaneamente.
5 CONCLUSÕES
todo o sistema operante de maneira integral para realizar o processo por completo. Sendo assim,
é possível afirmar que o projeto desenvolvido atingiu os objetivos propostos inicialmente neste
trabalho.
48
6 Considerações Finais
REFERÊNCIAS
DUCKETT, J. PHP & MySQL: Server-Side Web Development. 1ª edição. ed. [S.l.], 2022.
Citado na página 19.
ELMASRI, R.; NAVATHE, S. B. Sistemas de Banco de Dados. 6ª edição. ed. [S.l.], 2010.
Citado na página 18.
FARIAS, M. T. de; ANGELUCI, A. C. B.; PASSARELLI, B. Web scraping and data science in
applied research in communication: a study on online reviews. Revista Observatório, v. 7, n. 3,
p. a1en–a1en, 2021. Citado na página 18.
LIE, H. W.; BOS, B. Cascading style sheets: Designing for the web, Portable Documents.
[S.l.]: Addison-Wesley Professional, 2005. Citado na página 19.
QUEIRÓS, R. Criação Rápida de Sites Responsivos com o Bootstrap. 1ª edição. ed. [S.l.],
2017. Citado na página 20.
SCHAVEMAKER, P.; SLUIS, L. V. der. Electrical power system essentials. 2 ª edição. ed.
[S.l.], 2017. Citado na página 15.
Apêndices
53
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 "] ’) . click ()
71 page . wait_for_timeout (5000)
72
73 mes12 = page . locator ( ’# table - energy -
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 > tbody > tr : nth - child (1)
> td : nth - child (1) ’)
74 m12 = mes12 . evaluate ( ’ el = > el . outerText ’)
APÊNDICE A. Web Screaping: SolarView, Concessionária de Energia (Enel - GO), Conexão com o Banco de
Dados e Emissão de Relatório do Cliente 55
75
76 leitura12 = page . locator ( ’# table - energy -
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 > tbody > tr : nth -
child (1) > td : nth - child (2) ’)
77 l12 = leitura12 . evaluate ( ’ el = > el . outerText ’)
78
79
80 consumo12 = page . locator ( ’# table - energy -
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 > tbody > tr : nth -
child (1) > td : nth - child (3) ’)
81 con12 = consumo12 . evaluate ( ’ el = > el . outerText ’)
82
83 injetada12 = page . locator ( ’# table - energy -
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 > tbody > tr : nth -
child (1) > td : nth - child (4) ’)
84 inj12 = injetada12 . evaluate ( ’ el = > el . outerText ’)
85
86 cred_recebido12 = page . locator ( ’# table - energy -
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 > tbody >
tr : nth - child (1) > td : nth - child (5) ’)
87 cred12 = cred_recebido12 . evaluate ( ’ el = > el . outerText ’)
88
89 t a r i f a _ s e m _ i mp o s t o 1 2 = page . locator ( ’# table - energy -
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 > tbody >
tr : nth - child (1) > td : nth - child (8) ’)
90 tsi12 = t a r i f a _ s e m _ i m po s t o 1 2 . evaluate ( ’ el = > el . outerText ’)
91
92 tarifa_imposto12 = page . locator ( ’# table - energy -
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 > tbody >
tr : nth - child (1) > td : nth - child (9) ’)
93 ti12 = tarifa_imposto12 . evaluate ( ’ el = > el . outerText ’)
94
95 medidor12 = page . locator ( ’# table - energy -
m i c r o g e n e r a t i o n _ a c t i o n _ i t e m _ 1 0 6 2 6 0 3 3 4 7 > tbody > tr : nth -
child (1) > td : nth - child (11) ’)
96 med12 = medidor12 . evaluate ( ’ el = > el . outerText ’)
97 # Delay para executar o proximo script
98 time . sleep (20)
99
100 # Organizando os dados coletados
101 con_12 = float ( con12 )
102
103 inj_12 = float ( inj12 )
104
105 cred_12 = float ( cred12 )
106
107 ti_12 = float ( ti12 )
108
APÊNDICE A. Web Screaping: SolarView, Concessionária de Energia (Enel - GO), Conexão com o Banco de
Dados e Emissão de Relatório do Cliente 56
147
148 # oculta eixo do eixo y
149 # ax . get_yaxis () . set_visible ( False )
150
151 plt . grid ( b = None )
152 right_side = ax . spines [" right "]
153 right_side . set_visible ( False )
154 left_side = ax . spines [" left "]
155 left_side . set_visible ( False )
156 top_side = ax . spines [" top "]
157 top_side . set_visible ( False )
158 bottom_side = ax . spines [" bottom "]
159 bottom_side . set_visible ( False )
160 plt . legend ()
161 plt . savefig (" graphics . png " , format =" png ") # especificando o tipo de
arquivo explicitamente
162
163 from reportlab . pdfgen import canvas
164
165 def add_image () :
166
167 from PyPDF2 import PdfFileWriter , PdfFileReader
168 import io
169
170 in_pdf_file = r ’ C :\ Desktop \ m o d e l o _ r e l a t r i o . pdf ’ # importa o modelo
p a d r o do r e l a t r i o
171 out_pdf_file = r ’ C :\ Desktop \ R e l a t r i o do Cliente . pdf ’ # define o
documento final que s e r gerado
172 img_file = r ’ C :\ Desktop \ graphics . png ’ # importa o g r f i c o gerado
previamente em formato png
173
174 packet = io . BytesIO ()
175 can = canvas . Canvas ( packet )
176 can . setFont ( ’ Helvetica - Bold ’ , 12)
177 can . drawString (335 , 661 , geracao_periodo ) # g e r a o
178 can . drawString (335 , 601 , con12 ) # consumo
179 can . drawString (335 , 544 , v_fatura ) # fatura energia
180 can . drawString (335 , 481 , " xxxx , xx ") # economia total
181
182 can . drawString (470 , 661 , " xx . xxx ") # atendimento
183 can . drawString (470 , 603 , " xx . xxx ") # economia
184 can . drawString (470 , 542 , auto_consumo ) # autoconsumo
185 can . drawString (470 , 483 , " xxx , xx ") # g e r a o 3
186
187 can . setFont ( ’ Helvetica - Bold ’ , 16)
188 can . drawString (88 , 671 , cliente ) # nome do cliente
189 can . setFont ( ’ Helvetica ’ , 14)
190 can . drawString (88 , 654 , "17 ,085") # kwp
APÊNDICE A. Web Screaping: SolarView, Concessionária de Energia (Enel - GO), Conexão com o Banco de
Dados e Emissão de Relatório do Cliente 58
191
192 can . setFillColorRGB (242/255 ,140/255 ,0)
193 can . setFont ( ’ Helvetica - Bold ’ , 10)
194 can . drawString (145 , 578 , con12 ) # imagem consumo distribuidora
195 can . drawString (70 , 522 , auto_consumo ) # imagem autoconsumo
196 can . drawString (220 , 522 , inj12 ) # imagem energia injetada
197
198 can . setFillColorRGB (255 ,255 ,255)
199 can . setFont ( ’ Helvetica ’ , 12)
200 can . drawString (100 , 30 , " xxx , xx ") # co2
201 can . drawString (310 , 30 , " xxx , xx ") # arvores
202
203 can . setFillColorRGB (0 ,0 ,0)
204 can . setFont ( ’ Helvetica - Bold ’ , 10) # tabela
205 can . drawString (322 , 440 , " M s ")
206 can . drawString (308 , 428 , " R e f e r n c i a ")
207 can . drawString (378 , 440 , " Energia ")
208 can . drawString (378 , 428 , " Injetada ")
209 can . drawString (445 , 440 , " C r d i t o ")
210 can . drawString (445 , 428 , " Abatido ")
211 can . drawString (506 , 440 , " Saldo de ")
212 can . drawString (509 , 428 , " C r d i t o ")
213
214 can . setFillColorRGB (0 ,0 ,0)
215 can . setFont ( ’ Helvetica - Bold ’ , 10) # dados da tabela
216 can . drawString (318 , 400 , m12 )
217 can . drawString (318 , 373 , m11 )
218 can . drawString (318 , 345 , m10 )
219 can . drawString (318 , 319 , m9 )
220 can . drawString (318 , 294 , m8 )
221 can . drawString (318 , 269 , m7 )
222 can . drawString (318 , 243 , m6 )
223 can . drawString (318 , 217 , m5 )
224 can . drawString (318 , 190 , m4 )
225 can . drawString (318 , 163 , m3 )
226 can . drawString (318 , 137 , m2 )
227 can . drawString (318 , 111 , m1 )
228
229 can . drawString (383 , 400 , inj12 ) # energia injetada
230 can . drawString (383 , 373 , inj11 )
231 can . drawString (383 , 345 , inj10 )
232 can . drawString (383 , 319 , inj9 )
233 can . drawString (383 , 294 , inj8 )
234 can . drawString (383 , 269 , inj7 )
235 can . drawString (383 , 243 , inj6 )
236 can . drawString (383 , 217 , inj5 )
237 can . drawString (383 , 190 , inj4 )
238 can . drawString (383 , 163 , inj3 )
APÊNDICE A. Web Screaping: SolarView, Concessionária de Energia (Enel - GO), Conexão com o Banco de
Dados e Emissão de Relatório do Cliente 59
1 <? php
2 /* Define os dados de acesso */
3 define ( ’ DB_SERVER ’ , " usuario ") ;
4 define ( ’ DB_USERNAME ’ , " root ") ;
5 define ( ’ DB_PASSWORD ’ , "") ;
6 define ( ’ DB_NAME ’ , " clientes_mvp ") ;
7
8 /* Faz a conexao com o Banco de Dados */
9 $link = mysqli_connect ( DB_SERVER , DB_USERNAME , DB_PASSWORD , DB_NAME ) ;
10
11 // Verifica o status da conexao
12 if ( $link === false ) {
13 die (" ERROR : Could not connect . " . m y s q l i _ c o n n e ct _ e r r o r () ) ;
14 }
15 ?>
62
93 top : 50%;
94 transform : translate ( -50% , -50%) ;
95 background - color : # f1f1f1 ;
96 border : 1 px solid # ccc ;
97 border - radius : 50%;
98 padding : 8 px 10 px ;
99 }
100
101 /* hide some text on medium and large screens */
102 . hide - md - lg {
103 display : none ;
104 }
105
106 /* bottom container */
107 . bottom - container {
108 text - align : center ;
109 background - color : rgb (0 , 0 , 0) ;
110 border - radius : 0 px 0 px 4 px 4 px ;
111 }
112
113 /* Responsive layout - when the screen is less than 650 px wide , make the
two columns stack on top of each other instead of next to each other
*/
114 @media screen and ( max - width : 650 px ) {
115 . col {
116 width : 100%;
117 margin - top : 0;
118 }
119 /* hide the vertical line */
120 . vl {
121 display : none ;
122 }
123 /* show the hidden text on small screens */
124 . hide - md - lg {
125 display : block ;
126 text - align : center ;
127 }
128 }
129 </ style >
65
1
2 <! DOCTYPE html >
3 < html lang =" pt - br " >
4 < head >
5 <! - - Meta tags O b r i g a t r i a s -->
6 < meta charset =" utf -8" >
7 < meta name =" viewport " content =" width = device - width , initial - scale =1 ,
shrink - to - fit = no " >
8
9 <! - - Bootstrap CSS -->
10 < link rel =" stylesheet " href =" https :// stackpath . bootstrapcdn . com /
bootstrap /4.1.3/ css / bootstrap . min . css " integrity =" sha384 - MCw98 /
SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO "
crossorigin =" anonymous " >
11
12 <! - - Font Awesome -->
13 < link rel =" stylesheet " href =" https :// use . fontawesome . com / releases / v5
.3.1/ css / all . css " integrity =" sha384 -
m z r m E 5 q o n l j U r e m F s q c 0 1 S B 4 6 J v R O S 7 b Z s 3 I O 2 E m f F s d 1 5 u H v I t + Y8vEf7N7fWAU "
crossorigin =" anonymous " >
14
15 <! - - Estilo customizado -->
16 < link rel =" stylesheet " type =" text / css " href =" css / estilo . css " >
17
18 </ head >
19
20 < body >
21
22 < header > <! - - inicio Cabecalho -->
23 < nav class =" navbar navbar - expand - sm navbar - light bg - dark " >
24 < div class =" container " >
25
26 <a href ="#" class =" navbar - brand " >
27 < img src =" img \ upside . png " width ="142" >
28 </a >
29
30 < button class =" navbar - toggler " data - toggle =" collapse " data -
target ="# nav - principal " >
31 < span class =" navbar - toggler - icon " > </ span >
32 </ button >
33
34 < div class =" collapse navbar - collapse " id =" nav - principal " >
35 < ul class =" navbar - nav ml - auto " >
36 < li class =" nav - item " >
APÊNDICE D. Página Inicial do Site 66
37 <a href ="" class =" nav - link " > Home </ a >
38 </ li >
39 < li class =" nav - item " >
40 <a href ="" class =" nav - link " > Recursos </ a >
41 </ li >
42 < li class =" nav - item " >
43 <a href ="" class =" nav - link " > B e n e f c i o s </ a >
44 </ li >
45 < li class =" nav - item " >
46 <a href ="" class =" nav - link " > P r e o s </ a >
47 </ li >
48 < li class =" nav - item " >
49 <a href =" login . php " class =" btn btn - outline - light ml -4" >
Entrar </ a >
50 </ li >
51 </ ul >
52 </ div >
53
54 </ div >
55 </ nav >
56 </ header > <! - -/ fim Cabecalho -->
57
58 < section id =" home " > <! - - I n c i o s e o home -->
59 < div class =" container " >
60 < div class =" row " >
61 < div class =" col - md -6 d - flex " > <! - - Textos da s e o -->
62 < div class =" align - self - center " >
63 < h1 class =" display -4" > Saiba como e s t sua Usina
F o t o v o l t i c a ! </ h1 >
64 <p >
65 Essa plataforma existe para simplificar tudo que v o c
precisa saber da sua usina , de maneira r p i d a e
din mica.
66 </p >
67
68 < form class =" mt -4 mb -4" >
69
70 <a href =" register . php " class =" btn btn - dark " > Cadastre - se
</ a >
71 </ form >
72
73 <p > D i s p o n v e l para
74 <a href ="" class =" btn btn - outline - light " >
75 <i class =" fab fa - android fa - lg " > </i >
76 </a >
77 <a href ="" class =" btn btn - outline - light " >
78 <i class =" fab fa - apple " > </i >
79 </a >
APÊNDICE D. Página Inicial do Site 67
80 </p >
81
82 </ div >
83 </ div > <! - -/ fim textos da s e o -->
84 < div class =" col - md -6 d - none d - md - block " >
85 < img src =" img / capa - mulher . png " >
86 </ div >
87 </ div >
88 </ div >
89 </ section > <! - -/ fim s e o home -->
90
91 < section class =" caixa " > <! - -/ I n c i o s e o saiba -->
92 < div class =" container " >
93 < div class =" row " >
94 < div class =" col - md -6 d - flex " >
95 < div class =" align - self - center " >
96 <h2 > Saiba quanto v o c economiza mensalmente </ h2 >
97 <p >
98 Com esse sistema de gerenciamento , v o c acompanha toda
a sua p r o d u o de energia mensal sem c o m p l i c a o.
99 </p >
100 <a href ="" class =" btn btn - dark " > Veja mais </ a >
101 </ div >
102 </ div >
103 < div class =" col - md -6" >
104 < img src =" img / saiba . png " class =" img - fluid " >
105 </ div >
106 </ div >
107 </ div >
108 </ section > <! - -/ FIM s e o saiba -->
109
110 < section class =" caixa " > <! - -/ I n c i o s e o juros -->
111 < div class =" container " >
112 < div class =" row " >
113 < div class =" col - md -6" >
114 < img src =" img / juros . png " class =" img - fluid " >
115 </ div >
116 < div class =" col - md -6 d - flex " >
117 < div class =" align - self - center " >
118 <h2 > I n f o r m a o a qualquer hora em suas m o s </ h2 >
119 <p >
120 Acesse suas i n f o r m a e s de qualquer dispositivo com
acesso a internet , a qualquer hora do dia .
121 </p >
122 <a href ="" class =" btn btn - dark " > Veja mais </ a >
123 </ div >
124 </ div >
125 </ div >
APÊNDICE D. Página Inicial do Site 68
1 <? php
2 // Include config file
3 require_once " config . php ";
4
5 // Define variables and initialize with empty values
6 $username = $password = $co nfirm_pas sword = "";
7 $username_err = $password_err = $ c o n f i r m _ p a s s w o r d _ e r r = "";
8
9 // Processing form data when form is submitted
10 if ( $_SERVER [" REQUEST_METHOD "] == " POST ") {
11
12 // Validate username
13 if ( empty ( trim ( $_POST [" username "]) ) ) {
14 $username_err = " Please enter a username .";
15 } elseif (! preg_match ( ’/^[ a - zA - Z0 -9 _ ]+ $ / ’ , trim ( $_POST [" username "]) ) )
{
16 $username_err = " Username can only contain letters , numbers , and
underscores .";
17 } else {
18 // Prepare a select statement
19 $sql = " SELECT id FROM users WHERE username = ?";
20
21 if ( $stmt = mysqli_prepare ( $link , $sql ) ) {
22 // Bind variables to the prepared statement as parameters
23 m y s q l i _ s t m t _ b i n d _ p a r a m ( $stmt , " s " , $param_username ) ;
24
25 // Set parameters
26 $param_username = trim ( $_POST [" username "]) ;
27
28 // Attempt to execute the prepared statement
29 if ( my s ql i _ st m t_ e xe c u te ( $stmt ) ) {
30 /* store result */
31 m y s q l i _ s t m t _ s t o r e _ r e s u l t ( $stmt ) ;
32
33 if ( m y s q l i _ s t mt _ n u m _ r o w s ( $stmt ) == 1) {
34 $username_err = " This username is already taken .";
35 } else {
36 $username = trim ( $_POST [" username "]) ;
37 }
38 } else {
39 echo " Oops ! Something went wrong . Please try again later
.";
40 }
41
APÊNDICE E. Página de Registro de Usuário 71
42 // Close statement
43 mysql i_stmt_c lose ( $stmt ) ;
44 }
45 }
46
47 // Validate password
48 if ( empty ( trim ( $_POST [" password "]) ) ) {
49 $password_err = " Please enter a password .";
50 } elseif ( strlen ( trim ( $_POST [" password "]) ) < 6) {
51 $password_err = " Password must have atleast 6 characters .";
52 } else {
53 $password = trim ( $_POST [" password "]) ;
54 }
55
56 // Validate confirm password
57 if ( empty ( trim ( $_POST [" confirm_password "]) ) ) {
58 $ c o n f i r m _ p a s s w o r d _ e r r = " Please confirm password .";
59 } else {
60 $conf irm_pass word = trim ( $_POST [" confirm_password "]) ;
61 if ( empty ( $password_err ) && ( $password != $conf irm_pass word ) ) {
62 $ c o n f i r m _ p a s s w o r d _ e r r = " Password did not match .";
63 }
64 }
65
66 // Check input errors before inserting in database
67 if ( empty ( $username_err ) && empty ( $password_err ) && empty (
$confirm_password_err )){
68
69 // Prepare an insert statement
70 $sql = " INSERT INTO users ( username , password ) VALUES (? , ?) ";
71
72 if ( $stmt = mysqli_prepare ( $link , $sql ) ) {
73 // Bind variables to the prepared statement as parameters
74 m y s q l i _ s t m t _ b i n d _ p a r a m ( $stmt , " ss " , $param_username ,
$param_password ) ;
75
76 // Set parameters
77 $param_username = $username ;
78 $param_password = password_hash ( $password , PASSWORD_DEFAULT )
; // Creates a password hash
79
80 // Attempt to execute the prepared statement
81 if ( my s ql i _ st m t_ e x ec u te ( $stmt ) ) {
82 // Redirect to login page
83 header (" location : login . php ") ;
84 } else {
85 echo " Oops ! Something went wrong . Please try again later
.";
APÊNDICE E. Página de Registro de Usuário 72
86 }
87
88 // Close statement
89 mysql i_stmt_c lose ( $stmt ) ;
90 }
91 }
92
93 // Close connection
94 mysqli_close ( $link ) ;
95 }
96 ?>
97
98 <! DOCTYPE html >
99 < html lang =" en " >
100 < head >
101 < head >
102 < meta name =" viewport " content =" width = device - width , initial - scale =1" >
103 < link rel =" stylesheet " href =" https :// cdnjs . cloudflare . com / ajax / libs / font
- awesome /4.7.0/ css / font - awesome . min . css " >
104 < style >
105 body {
106 font - family : Arial , Helvetica , sans - serif ;
107 }
108
109 * {
110 box - sizing : border - box ;
111 }
112
113 /* style the container */
114 . container {
115 position : relative ;
116 border - radius : 5 px ;
117 /* background - color : # f2f2f2 ;*/
118 padding : 20 px 0 30 px 0;
119 }
120
121 /* style inputs and link buttons */
122 input ,
123 . btn {
124 width : 100%;
125 padding : 12 px ;
126 border : none ;
127 border - radius : 4 px ;
128 margin : 5 px 0;
129 opacity : 0.85;
130 display : inline - block ;
131 font - size : 17 px ;
132 line - height : 20 px ;
APÊNDICE E. Página de Registro de Usuário 73
227 . hide - md - lg {
228 display : block ;
229 text - align : center ;
230 }
231 }
232 </ style >
233
234 <! - - Meta tags O b r i g a t r i a s -->
235 < meta charset =" utf -8" >
236 < meta name =" viewport " content =" width = device - width , initial - scale =1 ,
shrink - to - fit = no " >
237
238 <! - - Bootstrap CSS -->
239 < link rel =" stylesheet " href =" https :// stackpath . bootstrapcdn . com /
bootstrap /4.1.3/ css / bootstrap . min . css " integrity =" sha384 - MCw98 /
SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO "
crossorigin =" anonymous " >
240
241 <! - - Font Awesome -->
242 < link rel =" stylesheet " href =" https :// use . fontawesome . com / releases / v5
.3.1/ css / all . css " integrity =" sha384 -
m z r m E 5 q o n l j U r e m F s q c 0 1 S B 4 6 J v R O S 7 b Z s 3 I O 2 E m f F s d 1 5 u H v I t + Y8vEf7N7fWAU "
crossorigin =" anonymous " >
243
244 <! - - Estilo customizado -->
245 < link rel =" stylesheet " type =" text / css " href =" css / estilo . css " >
246
247 < header > <! - - inicio Cabecalho -->
248 < nav class =" navbar navbar - expand - sm navbar - light bg - dark " >
249 < div class =" container " >
250
251 <a href ="#" class =" navbar - brand " >
252 < img src =" img \ upside . png " width ="142" >
253 </a >
254
255 < button class =" navbar - toggler " data - toggle =" collapse " data -
target ="# nav - principal " >
256 < span class =" navbar - toggler - icon " > </ span >
257 </ button >
258
259 < div class =" collapse navbar - collapse " id =" nav - principal " >
260 < ul class =" navbar - nav ml - auto " >
261 < li class =" nav - item " >
262 <a href ="" class =" nav - link " > Home </ a >
263 </ li >
264 < li class =" nav - item " >
265 <a href ="" class =" nav - link " > Recursos </ a >
266 </ li >
APÊNDICE E. Página de Registro de Usuário 76
1 <? php
2 // Initialize the session
3 session_start () ;
4
5 // Check if the user is already logged in , if yes then redirect him to
welcome page
6 if ( isset ( $_SESSION [" loggedin "]) && $_SESSION [" loggedin "] === true ) {
7 header (" location : welcome . php ") ;
8 exit ;
9 }
10
11 // Include config file
12 require_once " config . php ";
13
14 // Define variables and initialize with empty values
15 $username = $password = "";
16 $username_err = $password_err = $login_err = "";
17
18 // Processing form data when form is submitted
19 if ( $_SERVER [" REQUEST_METHOD "] == " POST ") {
20
21 // Check if username is empty
22 if ( empty ( trim ( $_POST [" username "]) ) ) {
23 $username_err = " Please enter username .";
24 } else {
25 $username = trim ( $_POST [" username "]) ;
26 }
27
28 // Check if password is empty
29 if ( empty ( trim ( $_POST [" password "]) ) ) {
30 $password_err = " Please enter your password .";
31 } else {
32 $password = trim ( $_POST [" password "]) ;
33 }
34
35 // Validate credentials
36 if ( empty ( $username_err ) && empty ( $password_err ) ) {
37 // Prepare a select statement
38 $sql = " SELECT id , username , password FROM users WHERE username
= ?";
39
40 if ( $stmt = mysqli_prepare ( $link , $sql ) ) {
41 // Bind variables to the prepared statement as parameters
42 m y s q l i _ s t m t _ b i n d _ p a r a m ( $stmt , " s " , $param_username ) ;
APÊNDICE F. Página de Login de Usuário 79
43
44 // Set parameters
45 $param_username = $username ;
46
47 // Attempt to execute the prepared statement
48 if ( my s ql i _ st m t_ e xe c u te ( $stmt ) ) {
49 // Store result
50 m y s q l i _ s t m t _ s t o r e _ r e s u l t ( $stmt ) ;
51
52 // Check if username exists , if yes then verify password
53 if ( m y s q l i _ st m t _ n u m _ r o w s ( $stmt ) == 1) {
54 // Bind result variables
55 m y s q l i _ s t m t _ b i n d _ r e s u l t ( $stmt , $id , $username ,
$hashed_password ) ;
56 if ( mysq li_stmt_ fetch ( $stmt ) ) {
57 if ( password_verify ( $password , $hashed_password ) )
{
58 // Password is correct , so start a new
session
59 session_start () ;
60
61 // Store data in session variables
62 $_SESSION [" loggedin "] = true ;
63 $_SESSION [" id "] = $id ;
64 $_SESSION [" username "] = $username ;
65
66 // Redirect user to welcome page
67 header (" location : welcome . php ") ;
68 } else {
69 // Password is not valid , display a generic
error message
70 $login_err = " Invalid username or password
.";
71 }
72 }
73 } else {
74 // Username doesn ’ t exist , display a generic error
message
75 $login_err = " Invalid username or password .";
76 }
77 } else {
78 echo " Oops ! Something went wrong . Please try again later
.";
79 }
80
81 // Close statement
82 mysql i_stmt_c lose ( $stmt ) ;
83 }
APÊNDICE F. Página de Login de Usuário 80
84 }
85
86 // Close connection
87 mysqli_close ( $link ) ;
88 }
89 ?>
90
91 <! DOCTYPE html >
92 < html lang =" en " >
93 < head >
94 < meta name =" viewport " content =" width = device - width , initial - scale =1" >
95 < link rel =" stylesheet " href =" https :// cdnjs . cloudflare . com / ajax / libs / font
- awesome /4.7.0/ css / font - awesome . min . css " >
96 < style >
97 body {
98 font - family : Arial , Helvetica , sans - serif ;
99 }
100
101 * {
102 box - sizing : border - box ;
103 }
104
105 /* style the container */
106 . container {
107 position : relative ;
108 border - radius : 5 px ;
109 /* background - color : # f2f2f2 ;*/
110 padding : 20 px 0 30 px 0;
111 }
112
113 /* style inputs and link buttons */
114 input ,
115 . btn {
116 width : 100%;
117 padding : 12 px ;
118 border : none ;
119 border - radius : 4 px ;
120 margin : 5 px 0;
121 opacity : 0.85;
122 display : inline - block ;
123 font - size : 17 px ;
124 line - height : 20 px ;
125 text - decoration : none ; /* remove underline from anchors */
126 }
127
128 input : hover ,
129 . btn : hover {
130 opacity : 1;
APÊNDICE F. Página de Login de Usuário 81
131 }
132
133 /* add appropriate colors to fb , twitter and google buttons */
134 . fb {
135 background - color : #3 B5998 ;
136 color : white ;
137 }
138
139 . twitter {
140 background - color : #55 ACEE ;
141 color : white ;
142 }
143
144 . google {
145 background - color : # dd4b39 ;
146 color : white ;
147 }
148
149 /* style the submit button */
150 input [ type = submit ] {
151 background - color : # ff9d44 ;
152 color : white ;
153 cursor : pointer ;
154 }
155
156 input [ type = submit ]: hover {
157 background - color : #000000;
158 }
159
160 /* Two - column layout */
161 . col {
162 float : left ;
163 width : 50%;
164 margin : auto ;
165 padding : 0 50 px ;
166 margin - top : 6 px ;
167 }
168
169 /* Clear floats after the columns */
170 . row : after {
171 content : "";
172 display : table ;
173 clear : both ;
174 }
175
176 /* vertical line */
177 . vl {
178 position : absolute ;
APÊNDICE F. Página de Login de Usuário 82
225
226 <! - - Meta tags O b r i g a t r i a s -->
227 < meta charset =" utf -8" >
228 < meta name =" viewport " content =" width = device - width , initial - scale =1 ,
shrink - to - fit = no " >
229
230 <! - - Bootstrap CSS -->
231 < link rel =" stylesheet " href =" https :// stackpath . bootstrapcdn . com /
bootstrap /4.1.3/ css / bootstrap . min . css " integrity =" sha384 - MCw98 /
SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO "
crossorigin =" anonymous " >
232
233 <! - - Font Awesome -->
234 < link rel =" stylesheet " href =" https :// use . fontawesome . com / releases / v5
.3.1/ css / all . css " integrity =" sha384 -
m z r m E 5 q o n l j U r e m F s q c 0 1 S B 4 6 J v R O S 7 b Z s 3 I O 2 E m f F s d 1 5 u H v I t + Y8vEf7N7fWAU "
crossorigin =" anonymous " >
235
236 <! - - Estilo customizado -->
237 < link rel =" stylesheet " type =" text / css " href =" css / estilo . css " >
238
239 < header > <! - - inicio Cabecalho -->
240 < nav class =" navbar navbar - expand - sm navbar - light bg - dark " >
241 < div class =" container " >
242
243 <a href ="#" class =" navbar - brand " >
244 < img src =" img \ upside . png " width ="142" >
245 </a >
246
247 < button class =" navbar - toggler " data - toggle =" collapse " data -
target ="# nav - principal " >
248 < span class =" navbar - toggler - icon " > </ span >
249 </ button >
250
251 < div class =" collapse navbar - collapse " id =" nav - principal " >
252 < ul class =" navbar - nav ml - auto " >
253 < li class =" nav - item " >
254 <a href ="" class =" nav - link " > Home </ a >
255 </ li >
256 < li class =" nav - item " >
257 <a href ="" class =" nav - link " > Recursos </ a >
258 </ li >
259 < li class =" nav - item " >
260 <a href ="" class =" nav - link " > B e n e f c i o s </ a >
261 </ li >
262 < li class =" nav - item " >
263 <a href ="" class =" nav - link " > P r e o s </ a >
264 </ li >
APÊNDICE F. Página de Login de Usuário 84
1 <? php
2 // Initialize the session
3 session_start () ;
4
5 // Unset all of the session variables
6 $_SESSION = array () ;
7
8 // Destroy the session .
9 session_destroy () ;
10
11 // Redirect to login page
12 header (" location : login . php ") ;
13 exit ;
14 ?>
87
1 <? php
2 // Initialize the session
3 session_start () ;
4
5 // Check if the user is logged in , if not then redirect him to login
page
6 if (! isset ( $_SESSION [" cliente_fulano "]) || $_SESSION [" cliente_fulano "]
!== true ) {
7 header (" location : login . php ") ;
8 exit ;
9 }
10 ?>
11
12 <! - - PHP code to establish connection with the localserver -->
13 <? php
14
15 // Username is root
16 $user = " root ";
17 $password = "";
18
19 // Database name is geeksforgeeks
20 $database = " n o m e_ b an c o_ d e _d a do s ";
21
22 // Server is localhost with
23 // port number 3306
24 $servername =" localhost ";
25 $mysqli = new mysqli ( $servername , $user ,
26 $password , $database ) ;
27
28 // Checking for connections
29 if ( $mysqli - > connect_error ) {
30 die ( ’ Connect Error ( ’ .
31 $mysqli - > connect_errno . ’) ’.
32 $mysqli - > connect_error ) ;
33 }
34
35 // SQL query to select data from database
36 $sql = " SELECT * FROM c l i e n t e _ g u s t a v o _ t o r r e s ORDER BY Medidor ";
37 $result = $mysqli - > query ( $sql ) ;
38 $mysqli - > close () ;
39 ?>
40
41
42 <! - - HTML code to display data in tabular format -->
APÊNDICE H. Exemplo de Página Privada do Usuário 88
225 <a href ="" class =" nav - link " > Recursos </ a >
226 </ li >
227 < li class =" nav - item " >
228 <a href ="" class =" nav - link " > B e n e f c i o s </ a >
229 </ li >
230 < li class =" nav - item " >
231 <a href ="" class =" nav - link " > P r e o s </ a >
232 </ li >
233 < li class =" nav - item " >
234 <a href =" index . php " class =" btn btn - outline - light ml -4" >
Home </ a >
235 </ li >
236 </ ul >
237 </ div >
238
239 </ div >
240 </ nav >
241 </ header > <! - -/ fim Cabecalho -->
242 </ head >
243
244 < body >
245 < div style =" overflow - x : auto ;" >
246
247 <! - - TABLE CONSTRUCTION -->
248 < table >
249 <tr >
250 <th > M s Ref . </ th >
251 <th > G e r a o Mensal </ th >
252 <th > Valor Fatura </ th >
253 <th > Leitura </ th >
254 <th > Energia Inj . </ th >
255 <th > Energia Consum . </ th >
256 <th > C r d i t o Compens . </ th >
257 <th > Tarifa </ th >
258 <th > Tarifa com Imposto </ th >
259 <th > Medidor </ th >
260 <th > Autoconsumo </ th >
261 <th > Saldo de C r d i t o </ th >
262 <th > Economia </ th >
263 <th > Atendimento </ th >
264 </ tr >
265 <! - - PHP CODE TO FETCH DATA FROM ROWS -->
266 <? php
267 // LOOP TILL END OF DATA
268 while ( $rows = $result - > fetch_assoc () )
269 {
270 ?>
271 <tr >
APÊNDICE H. Exemplo de Página Privada do Usuário 93
45 margin : 5 px 0;
46 opacity : 0.85;
47 display : inline - block ;
48 font - size : 17 px ;
49 line - height : 20 px ;
50 text - decoration : none ; /* remove underline from anchors */
51 }
52
53 input : hover ,
54 . btn : hover {
55 opacity : 1;
56 }
57
58 /* add appropriate colors to fb , twitter and google buttons */
59 . fb {
60 background - color : #3 B5998 ;
61 color : white ;
62 }
63
64 . twitter {
65 background - color : #55 ACEE ;
66 color : white ;
67 }
68
69 . google {
70 background - color : # dd4b39 ;
71 color : white ;
72 }
73
74 /* style the submit button */
75 input [ type = submit ] {
76 background - color : # ff9d44 ;
77 color : white ;
78 cursor : pointer ;
79 }
80
81 input [ type = submit ]: hover {
82 background - color : #000000;
83 }
84
85 /* Two - column layout */
86 . col {
87 float : left ;
88 width : 50%;
89 margin : auto ;
90 padding : 0 50 px ;
91 margin - top : 6 px ;
92 }
APÊNDICE I. Página de Controle de Usuários - Acesso de Administrador 96
93
94 /* Clear floats after the columns */
95 . row : after {
96 content : "";
97 display : table ;
98 clear : both ;
99 }
100
101 /* vertical line */
102 . vl {
103 position : absolute ;
104 left : 50%;
105 transform : translate ( -50%) ;
106 border : 2 px solid # ddd ;
107 height : 175 px ;
108 }
109
110 /* text inside the vertical line */
111 . vl - innertext {
112 position : absolute ;
113 top : 50%;
114 transform : translate ( -50% , -50%) ;
115 background - color : # f1f1f1 ;
116 border : 1 px solid # ccc ;
117 border - radius : 50%;
118 padding : 8 px 10 px ;
119 }
120
121 /* hide some text on medium and large screens */
122 . hide - md - lg {
123 display : none ;
124 }
125
126 /* bottom container */
127 . bottom - container {
128 text - align : center ;
129 background - color : rgb (0 , 0 , 0) ;
130 border - radius : 0 px 0 px 4 px 4 px ;
131 }
132
133 /* Responsive layout - when the screen is less than 650 px wide , make the
two columns stack on top of each other instead of next to each other
*/
134 @media screen and ( max - width : 650 px ) {
135 . col {
136 width : 100%;
137 margin - top : 0;
138 }
APÊNDICE I. Página de Controle de Usuários - Acesso de Administrador 97
222 columnDefs : [{
223 targets : " _all " ,
224 orderable : false
225 }]
226 }) ;
227
228 table . columns () . every ( function () {
229 var table = this ;
230 $ ( ’ input ’ , this . header () ) . on ( ’ keyup change ’ , function ()
{
231 if ( table . search () !== this . value ) {
232 table . search ( this . value ) . draw () ;
233 }
234 }) ;
235 }) ;
236 }) ;
237
238 </ script >
239 </ head >
240
241 < body >
242 < div class =" datatable - container " >
243 <h2 > Registro dos Clientes </ h2 >
244 < table name =" tbl - contact " id =" tbl - contact " class =" display "
cellspacing ="0" width ="100%" >
245
246 < thead >
247 <tr >
248
249 <th > Nome </ th >
250 <th > M s R e f e r n c i a </ th >
251 <th > G e r a o </ th >
252 <th > I n j e o </ th >
253 <th > Consumo </ th >
254 <th > Autoconsumo </ th >
255
256 </ tr >
257 </ thead >
258
259 </ table >
260 </ div >
261 </ body >
262 </ html >
100
1
2 # include < ESP8266WiFi .h >
3
4 # include < ESP 8266HTTPC lient .h >
5
6 # include < WiFiClient .h >
7
8 BIBLIOTECAS DO WIFI
9
10 _______________________________________
11
12 # include " EmonLib . h "
13
14 BIBLIOTECA QUE LE A T E N S O E CORRENTE
15
16 -----------------------------------------
17
18 const char * ssid = " nome_da_rede ";
19
20 const char * password = " senha ";
21
22 NOME E SENHA DO WIFI
23
24 _________________________________________
25
26 const char * serverName = " localhost ";
27
28 String apiKeyValue = "";
29
30 String sensorLocation = " local_de_teste ";
31
32 # define S E A L E V E L P R E S SU R E _ H P A (1013.25)
33
34 CONFIGURA E S DA I N T E G R A O COM O SERVIDOR
35
36 ______________________________________
37
38 EnergyMonitor emon1 ;
39
40 COLOCA UM NOME MAIS FACIL PARA CHAMAR O MONITOR DE ENERGIA ( EMON1 )
41
42 ______________________
43
44 void setup ()
APÊNDICE J. Código Arduino 101
45
46 {
47
48 -------------------------------------------------------
49
50 Serial . begin (500000) ;
51
52 INICIA A C O M U N I C A O SERIAL ( BUTEI A VELOCIADE MAIS ALTA PARA N O
TRAVAR O CODIGO
53
54 _________________________________
55
56 WiFi . begin ( ssid , password ) ;
57
58 Serial . println (" Connecting ") ;
59
60 while ( WiFi . status () != WL_CONNECTED ) {
61
62 delay (500) ;
63
64 Serial . print (".") ;
65
66 }
67
68 LOOP PRA CONECTAR NO WIFI
69
70 ------------------------------------------------------------
71
72 Serial . println ("") ;
73
74 Serial . print (" Connected to WiFi network with IP Address : ") ;
75
76 Serial . println ( WiFi . localIP () ) ;
77
78 PRINTA QUAL O IP Q CONECTOU E FALA Q DEU CERTO
79
80 ---------------------------------------
81
82 emon1 . voltage1 (0 , 740 , 0) ; // Voltage : input pin , calibration ,
phase_shift
83
84 emon1 . voltage2 (3 , 740 , 0) ; // Voltage : input pin , calibration ,
phase_shift
85
86 emon1 . voltage3 (4 , 740 , 0) ; // Voltage : input pin , calibration ,
phase_shift
87
APÊNDICE J. Código Arduino 102
182 }
183
184 CONECTA NO SERVIDOR , MANDA OS VALORES CALCULADOS E DESCONECTA
185
186 --------------------------------------------------------------
187
188 Serial . println ("") ;
189
190 Serial . print (" Fase1 : ") ;
191
192 Serial . print ( emon1 . Vrms1 ) ;
193
194 Serial . print ("/") ;
195
196 Serial . print ( emon1 . Irms1 ) ;
197
198 Serial . print ("/") ;
199
200 Serial . print ( emon1 . realPower1 ) ;
201
202 Serial . println ("") ;
203
204 Serial . print (" Fase2 : ") ;
205
206 Serial . print ( emon1 . Vrms2 ) ;
207
208 Serial . print ("/") ;
209
210 Serial . print ( emon1 . Irms2 ) ;
211
212 Serial . print ("/") ;
213
214 Serial . print ( emon1 . realPower2 ) ;
215
216 Serial . println ("") ;
217
218 Serial . print (" Fase3 : ") ;
219
220 Serial . print ( emon1 . Vrms3 ) ;
221
222 Serial . print ("/") ;
223
224 Serial . print ( emon1 . Irms3 ) ;
225
226 Serial . print ("/") ;
227
228 Serial . print ( emon1 . realPower3 ) ;
229
APÊNDICE J. Código Arduino 105
1 //# include " WProgram . h " un - comment for use on older versions of Arduino
IDE
2
3 # include " EmonLib . h "
4
5 # if defined ( ARDUINO ) && ARDUINO >= 100
6
7 # include " Arduino . h "
8
9 # else
10
11 # include " WProgram . h "
12
13 # endif
14
15 # include < MCP3008 .h > //( ADICIONA A BIBLIOTECA DO MCP )
16
17 MCP3008 adc (14 ,13 ,12 ,15) ; //( PINOS DO MCP CONECTADOS NO ARDUINO )
18
19 float offsetI1 = ADC_COUNTS > >1;
20
21 float offsetV1 = ADC_COUNTS > >1;
22
23 float offsetI2 = ADC_COUNTS > >1;
24
25 float offsetV2 = ADC_COUNTS > >1;
26
27 float offsetI3 = ADC_COUNTS > >1;
28
29 float offsetV3 = ADC_COUNTS > >1;
30
31 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32
33 // Sets the pins to be used for voltage and current sensors
34
35 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
36
37 void EnergyMonitor :: voltage1 ( unsigned int _inPinV1 , double _VCAL1 ,
double _PHASECAL1 )
38
39 {
40
41 inPinV1 = _inPinV1 ;
42
APÊNDICE K. Código EmonLib.h 107
43 VCAL1 = _VCAL1 ;
44
45 PHASECAL1 = _PHASECAL1 ;
46
47 }
48
49 void EnergyMonitor :: voltage2 ( unsigned int _inPinV2 , double _VCAL2 ,
double _PHASECAL2 )
50
51 {
52
53 inPinV2 = _inPinV2 ;
54
55 VCAL2 = _VCAL2 ;
56
57 PHASECAL2 = _PHASECAL2 ;
58
59 }
60
61 void EnergyMonitor :: voltage3 ( unsigned int _inPinV3 , double _VCAL3 ,
double _PHASECAL3 )
62
63 {
64
65 inPinV3 = _inPinV3 ;
66
67 VCAL3 = _VCAL3 ;
68
69 PHASECAL3 = _PHASECAL3 ;
70
71 }
72
73 // SETA OS PINOS DE T E N S O // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74
75 void EnergyMonitor :: current1 ( unsigned int _inPinI1 , double _ICAL1 )
76
77 {
78
79 inPinI1 = _inPinI1 ;
80
81 ICAL1 = _ICAL1 ;
82
83 }
84
85 void EnergyMonitor :: current2 ( unsigned int _inPinI2 , double _ICAL2 )
86
87 {
88
APÊNDICE K. Código EmonLib.h 108
89 inPinI2 = _inPinI2 ;
90
91 ICAL2 = _ICAL2 ;
92
93 }
94
95 void EnergyMonitor :: current3 ( unsigned int _inPinI3 , double _ICAL3 )
96
97 {
98
99 inPinI3 = _inPinI3 ;
100
101 ICAL3 = _ICAL3 ;
102
103 }
104
105 // SETA OS PINOS DE CORRENTE
106
107 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
108
109 // emon_calc procedure
110
111 // Calculates realPower , apparentPower , powerFactor , Vrms , Irms , kWh
increment
112
113 // From a sample window of the mains AC voltage and current .
114
115 // The Sample window length is defined by the number of half wavelengths
or crossings we choose to measure .
116
117 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
118
119 void EnergyMonitor :: calcVI ( unsigned int crossings , unsigned int timeout )
120
121 {
122
123 // F U N O QUE FAZ A LEITURA INSTANTANEA NOS PINOS E CALCULA A T E N S O E
CORRENTE RMS
124
125 # if defined emonTxV3
126
127 int SupplyVoltage =3300;
128
129 # else
130
131 int SupplyVoltage = readVcc () ;
132
133 # endif
APÊNDICE K. Código EmonLib.h 109
134
135 unsigned int crossCount = 0; // Used to measure number of times threshold
is crossed .
136
137 unsigned int numberOfSamples = 0; // This is now incremented
138
139 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
140
141 // 1) Waits for the waveform to be close to ’ zero ’ ( mid - scale adc ) part
in sin curve .
142
143 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
144
145 unsigned long start = millis () ; // millis () - start makes sure it doesnt
get stuck in the loop if there is an error .
146
147 while (1) // the while loop ...
148
149 {
150
151 startV1 = adc . readADC ( inPinV1 ) + 527.5151; // using the voltage waveform
152
153 startV2 = adc . readADC ( inPinV2 ) + 527.5151;
154
155 startV3 = adc . readADC ( inPinV3 ) + 527.5151;
156
157 if (( startV1 < ( ADC_COUNTS *0.55) ) && ( startV1 > ( ADC_COUNTS *0.45) ) )
break ; // check its within range
158
159 if (( startV2 < ( ADC_COUNTS *0.55) ) && ( startV2 > ( ADC_COUNTS *0.45) ) )
break ;
160
161 if (( startV3 < ( ADC_COUNTS *0.55) ) && ( startV3 > ( ADC_COUNTS *0.45) ) )
break ;
162
163 if (( millis () - start ) > timeout ) break ;
164
165 }
166
167 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
168
169 // 2) Main measurement loop
170
171 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
172
173 start = millis () ;
174
175 while (( crossCount < crossings ) && (( millis () - start ) < timeout ) )
APÊNDICE K. Código EmonLib.h 110
176
177 {
178
179 numberOfSamples ++; // Count number of times looped .
180
181 lastFilteredV1 = filteredV1 ; // Used for delay / phase compensation
182
183 lastFilteredV2 = filteredV2 ;
184
185 lastFilteredV3 = filteredV3 ;
186
187 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
188
189 // A ) Read in raw voltage and current samples
190
191 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
192
193 sampleV1 = adc . readADC ( inPinV1 ) + 527.5151; // Read in raw voltage signal
194
195 sampleI1 = adc . readADC ( inPinI1 ) ; // Read in raw current signal
196
197 sampleV2 = adc . readADC ( inPinV2 ) + 527.5151;
198
199 sampleI2 = adc . readADC ( inPinI2 ) ;
200
201 sampleV3 = adc . readADC ( inPinV3 ) + 527.5151;
202
203 sampleI3 = adc . readADC ( inPinI3 ) ;
204
205 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
206
207 // B ) Apply digital low pass filters to extract the 2.5 V or 1.65 V dc
offset ,
208
209 // then subtract this - signal is now centred on 0 counts .
210
211 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
212
213 offsetV1 = offsetV1 + (( sampleV1 - offsetV1 ) /1024) ;
214
215 filteredV1 = sampleV1 - offsetV1 ;
216
217 offsetV2 = offsetV2 + (( sampleV2 - offsetV2 ) /1024) ;
218
219 filteredV2 = sampleV2 - offsetV2 ;
220
221 offsetV3 = offsetV3 + (( sampleV3 - offsetV3 ) /1024) ;
222
APÊNDICE K. Código EmonLib.h 111
314
315 lastVCross = checkVCross ;
316
317 if ( sampleV1 > startV1 ) checkVCross = true ;
318
319 else checkVCross = false ;
320
321 if ( numberOfSamples ==1) lastVCross = checkVCross ;
322
323 if ( lastVCross != checkVCross ) crossCount ++;
324
325 }
326
327 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
328
329 // 3) Post loop calculations
330
331 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
332
333 // Calculation of the root of the mean of the voltage and current squared
( rms )
334
335 // Calibration coefficients applied .
336
337 double V_RATIO1 = VCAL1 *(( SupplyVoltage /1000.0) / ( ADC_COUNTS ) ) ;
338
339 double V_RATIO2 = VCAL2 *(( SupplyVoltage /1000.0) / ( ADC_COUNTS ) ) ;
340
341 double V_RATIO3 = VCAL3 *(( SupplyVoltage /1000.0) / ( ADC_COUNTS ) ) ;
342
343 Vrms1 = V_RATIO1 * sqrt ( sumV1 / numberOfSamples ) ;
344
345 Vrms2 = V_RATIO2 * sqrt ( sumV2 / numberOfSamples ) ;
346
347 Vrms3 = V_RATIO3 * sqrt ( sumV3 / numberOfSamples ) ;
348
349 double I_RATIO1 = ICAL1 *(( SupplyVoltage /1000.0) / ( ADC_COUNTS ) ) ;
350
351 double I_RATIO2 = ICAL2 *(( SupplyVoltage /1000.0) / ( ADC_COUNTS ) ) ;
352
353 double I_RATIO3 = ICAL3 *(( SupplyVoltage /1000.0) / ( ADC_COUNTS ) ) ;
354
355 Irms1 = I_RATIO1 * sqrt ( sumI1 / numberOfSamples ) ;
356
357 Irms2 = I_RATIO2 * sqrt ( sumI2 / numberOfSamples ) ;
358
359 Irms3 = I_RATIO3 * sqrt ( sumI3 / numberOfSamples ) ;
360
APÊNDICE K. Código EmonLib.h 114
409 # endif
410
411 for ( unsigned int n = 0; n < Nu mber_of_ Samples ; n ++)
412
413 {
414
415 sampleI1 = adc . readADC ( inPinI1 ) ;
416
417 // Digital low pass filter extracts the 2.5 V or 1.65 V dc offset ,
418
419 // then subtract this - signal is now centered on 0 counts .
420
421 offsetI1 = ( offsetI1 + ( sampleI1 - offsetI1 ) /1024) ;
422
423 filteredI1 = sampleI1 - offsetI1 ;
424
425 // Root - mean - square method current
426
427 // 1) square current values
428
429 sqI1 = filteredI1 * filteredI1 ;
430
431 // 2) sum
432
433 sumI1 += sqI1 ;
434
435 }
436
437 double I_RATIO1 = ICAL1 *(( SupplyVoltage /1000.0) / ( ADC_COUNTS ) ) ;
438
439 Irms1 = I_RATIO1 * sqrt ( sumI1 / Number_o f_Sample s ) ;
440
441 // Reset accumulators
442
443 sumI1 = 0;
444
445 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
446
447 return Irms1 ;
448
449 }
450
451 long EnergyMonitor :: readVcc () {
452
453 long result ;
454
455 // F U N O RESPONSAVEL POR FAZER A LEITURA
456
APÊNDICE K. Código EmonLib.h 116
1 <? php
2
3 $servername = " localhost ";
4
5 // REPLACE with your Database name
6 $dbname = " banco_de_dados ";
7 // REPLACE with Database user
8 $username = " root ";
9 // REPLACE with Database user password
10 $password = "";
11
12 // Keep this API Key value to be compatible with the ESP32 code provided
in the project page .
13 // If you change this value , the ESP32 sketch needs to match
14 $api_key_value = " FzIwMP0uo0aimJ ";
15
16 $api_key = $location = $tensao1 = $tensao2 = $tensao3 = $corrente1 =
$corrente2 = $corrente3 = $potencia1 = $potencia2 = $potencia3 =
$consumo = $intervalo = "";
17
18 if ( $_SERVER [" REQUEST_METHOD "] == " POST ") {
19 $api_key = test_input ( $_POST [" api_key "]) ;
20 if ( $api_key == $api_key_value ) {
21 $location = test_input ( $_POST [" location "]) ;
22 $tensao1 = test_input ( $_POST [" tensao1 "]) ;
23 $tensao2 = test_input ( $_POST [" tensao2 "]) ;
24 $tensao3 = test_input ( $_POST [" tensao3 "]) ;
25 $corrente1 = test_input ( $_POST [" corrente1 "]) ;
26 $corrente2 = test_input ( $_POST [" corrente2 "]) ;
27 $corrente3 = test_input ( $_POST [" corrente3 "]) ;
28 $potencia1 = test_input ( $_POST [" potencia1 "]) ;
29 $potencia2 = test_input ( $_POST [" potencia2 "]) ;
30 $potencia3 = test_input ( $_POST [" potencia3 "]) ;
31 $consumo = test_input ( $_POST [" consumo "]) ;
32 $intervalo = test_input ( $_POST [" intervalo "]) ;
33
34 // Create connection
35 $conn = new mysqli ( $servername , $username , $password , $dbname ) ;
36 // Check connection
37 if ( $conn - > connect_error ) {
38 die (" Connection failed : " . $conn - > connect_error ) ;
39 }
40
APÊNDICE L. Conexão do Protótipo com o Banco de Dados 119