são carlos 2016 - biblioteca digital de trabalhos acadêmicos · sistema de gerenciamento e...
Post on 25-Dec-2018
213 Views
Preview:
TRANSCRIPT
São Carlos
2016
André Progiante
Sistema de Gerenciamento e Consulta de
Consumo de Energia Elétrica na Nuvem
para Residências
Trabalho de Conclusão de Curso apresentado
à Escola de Engenharia de São Carlos, da
Universidade de São Paulo
Curso de Engenharia Elétrica
ORIENTADOR: Prof. Dr. Evandro Luis Linhari Rodrigues
São Carlos
2016
AUTORIZO A REPRODUÇÃO TOTAL OU PARCIAL DESTE TRABALHO,POR QUALQUER MEIO CONVENCIONAL OU ELETRÔNICO, PARA FINSDE ESTUDO E PESQUISA, DESDE QUE CITADA A FONTE.
Progiante, André
PA543sSistema de gerenciamento e consulta de consumo de
energia elétrica na nuvem para residências / AndréProgiante; orientador Evandro Luis Linhari Rodrigues.São Carlos, 2016.
Monografia (Graduação em Engenharia Elétrica com ênfase em Eletrônica) -- Escola de Engenharia de SãoCarlos da Universidade de São Paulo, 2016.
1. consumo. 2. energia elétrica. 3. internet das coisas. 4. sistemas embarcados. 5. arduino. 6. aspberrypi. 7. computação em nuvem. 8. automação residencial.I. Título.
página com a folha de aprovação (página ímpar).
Figura 1: Folha de Aprovação.
Dedicatória
Dedico este trabalho aos meus pais, Shirley e José Mauro, e às minhas irmãs, Ana Lia
e Sara, os quais sempre me apoiaram em todas as fases de minha vida, estimulando-me a
prosseguir nos estudos e a enfrentar desafios.
Agradecimentos
Ao meu orientador, Professor Doutor Evandro Luís Linhari Rodrigues, pela condução se-
gura e competente; aos meus pais, Shirley e José Mauro, pelo amor incondicional; às minhas
irmãs, Ana Lia e Sara, por terem sido, para mim, exemplos de dedicação e responsabilidade;
ao amigo Felipe da Cruz Bueno, pela inestimável ajuda; à empresa DuPont, pela preciosa
colaboração durante a realização deste trabalho.
"Se quer viver uma vida feliz,
amarre-se a uma meta, não às pessoas nem às coisas."
Albert Einstein
Resumo
Entre os vários itens que impactam o orçamento das famílias brasileiras nos dias atuais, está
o gasto com energia elétrica. Embora existam planos do atual governo federal para aumentar
a matriz energética nacional - o que demandará investimentos públicos e privados de longo
prazo-, é necessário que a população encontre mecanismos de economia de energia. Di-
ante desse cenário e após analisar as opções já existentes no mercado, foi desenvolvido um
dispositivo que propiciará ao cidadão o controle de gastos por fonte consumidora. Tal con-
trole pode acontecer por cômodo da residência ou por tomada. Como embasamento teórico,
foram utilizados os conceitos de internet das coisas, microcontroladores e sistemas embar-
cados.Também foi desenvolvido um website para o acompanhamento do consumo em tempo
real ou num período específico: horário, dia, mês. Nessa análise, é possível reconhecer picos
de consumo de energia elétrica em determinada data e também verificar padrões de consumo
por horário.Os indicadores são em kWh e em real. O protótipo foi desenvolvido utilizando
ESP-12 e Raspberry Pi; atingiu os resultados especificados no projeto e se mostrou uma
alternativa viável para o controle e redução do consumo de energia elétrica em residências.
Palavras-Chave: consumo, energia elétrica, internet das coisas, sistemas embarcados, ar-
duino, aspberry pi, esp8266, computação em nuvem, automação residencial.
Abstract
Among the many items that impact the budget of Brazilian families nowadays is electricity
spending. Although there are government plans to increase the national energy matrix - which
will require long term public and private investments-, it is necessary that people find elec-
tricity saving mechanisms. Given this scenario and after analyzing the existing options on
the market, it was developed a device that will provide the citizen control of electricity spen-
ding individualized by source. Such control could be analyzed individually or by room in the
house. As a theoretical basis, it was used the concept of internet of things, microcontrollers
and embedded systems. Also, it was developed a website to monitor consumption in real time
or at a specific time: hours, days months. In this analysis, it is possible to recognize electri-
city consumption peaks in certain date and also check consumption patterns by hours. The
indicators are in kWh and R$. The prototype was developed using ESP-12 and Raspberry
Pi; it achieved the results specified on the project and is a viable option for home electrical
energy consumption reduction and control.
Keywords: consumption, electricity, internet of things, embedded systems, arduino, rasp-
berry pi, esp8266, cloud computing, home automation .
Lista de Figuras
1 Folha de Aprovação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1 Visão Geral do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2 Foto do FTDI232-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3 Comparação do tamanho do ESP-12 com uma moeda . . . . . . . . . . . . . 33
3.4 Página de Login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.5 Gráfico de Consumo no período . . . . . . . . . . . . . . . . . . . . . . . . 38
3.6 Gráfico de Consumo em Tempo Real . . . . . . . . . . . . . . . . . . . . . . 39
3.7 Página de Locais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.8 Página Locais - Detalhes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.9 Página de Pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.10 Página de Pontos - Edição . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.11 Página de Usuários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.12 Página de Perfis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Lista de Tabelas
3.1 Tabela Usuarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2 Tabela Locais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3 Tabela Pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.4 Tabela Consumos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.5 Tabela Perfis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.6 Tabela Pontos Perfis Ativos . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.1 Tabela Custos por Módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Siglas
UART Universal asynchronous receiver/transmitter -
Transmissor/Receptor Universal Síncrono e Assíncrono
PWM Pulse Width Modulation -
Modulação por largura de pulso
HTML HyperText Markup Language -
Linguagem de Marcação de Hipertexto
CSS Cascading Style Sheets -
Folhas de estilo cascateadas
JSON JavaScript Object Notation" -
Notação de objeto JavaScript
RAM Random Access Memory -
Memória de acesso aleatório
ROM Read-Only Memory -
Memória somente leitura
23
Sumário
1 Introdução 25
1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.3 Justificativas/relevância . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.4 Organização do Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2 Fundamentação Teórica 29
2.1 Microcontroladores e Sistemas Embarcados . . . . . . . . . . . . . . . . . . 29
2.2 Computação na Nuvem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3 Internet das Coisas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3 Material, Ferramentas e Métodos 31
3.1 Visão Geral do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2 Materiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.1 FTDI232-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.2 ESP-12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.3 Raspberry Pi Rev 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3 Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.1 Lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.2 NodeMCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.3 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.4 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.5 MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.6 Chart.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4.1 ESP-12 - Recepção das medições e envio dos dados via socket . . . . 35
24
3.4.2 Criação de servidor socket HTTP e threadings na Rapsberry Pi . . . . 36
3.4.3 Estrutura do website e apresentação dos dados para o usuário . . . . . 36
4 Resultados e Discussões 49
4.1 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.1.1 ESP-12, Comunicação Wi-Fi e LUA . . . . . . . . . . . . . . . . . . 49
4.1.2 Raspberry PI, Python, Comunicação com Banco de Dados por meio
das APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.1.3 Website em PHP no DigitalOcean, Banco de dados MySQL . . . . . 50
4.2 Discussões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.2.1 Limitações da Aplicação . . . . . . . . . . . . . . . . . . . . . . . . 50
4.2.2 Impactos da aplicação na rede elétrica . . . . . . . . . . . . . . . . . 51
5 Conclusões 53
5.0.1 Expansões do trabalho . . . . . . . . . . . . . . . . . . . . . . . . . 54
A Algoritmos do Projeto 57
A.1 Algoritmos LUA no ESP-12 . . . . . . . . . . . . . . . . . . . . . . . . . . 57
A.1.1 init.lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
A.1.2 generatesend.lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
A.2 Algoritmo Python na Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . 58
A.2.1 socketserver.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
25
Capítulo 1
Introdução
O Banco Central estimou um aumento de 51,7% no preço da Energia Elétrica no Brasil no
início 2015, conforme publicado pelo Globo- G1 [1]. Tal aumento se deve à alta nos custos de
geração de energia elétrica em usinas Hidroelétricas e Termoelétricas e nos encargos setoriais
para compra de energia elétrica, bem como à implantação do sistema de bandeiras, ocorrido
no início do ano.
Influenciando diretamente os índices de inflação, o crescimento do preço da Energia Elé-
trica tem grande impacto na renda das famílias brasileiras.
Diante desse cenário, é necessário e urgente que a população encontre mecanismos de
redução do consumo de energia em residências.
Para isso, seriam eficazes ações simples como utilização de eletrodomésticos com maior
eficiência (índices A, B ou C), certeza de que aparelhos elétricos que não estão sendo uti-
lizados se mantenham desligados e desconectados da tomada, e utilização mais breve de
chuveiros elétricos e ferros de passar.
Atualmente, o consumo de energia elétrica é acompanhado apenas por meio da fatura
fornecida mensalmente pela concessionária. Por esse demonstrativo, não é possível visualizar
o consumo individual de cada aparelho elétrico. Porém, já é viável essa medição individual,
a qual permite ao usuário ter um controle de gastos por fonte consumidora de energia, o que,
por sua vez, possibilita ações que mitiguem o gasto de um determinado aparelho elétrico.
Recentemente, foi criada uma campanha de arrecadação para produção de um dispositivo
similar ao desse trabalho no website "IndieGoGo". O projeto é chamado "Curb"[2].
26
1.1 Motivação
A motivação para este trabalho surgiu durante as aulas de Projetos de Sistemas Digitais,
no estágio realizado no Canadá, bem como diante da percepção do alto custo da energia
elétrica no Brasil. Além disso, a atual e imprescindível preocupação com o meio ambiente
também nos motivou a desenvolver um dispositivo que pudesse, além de reduzir as despesas
familiares, contribuir para o arrefecimento dos danos ao meio ambiente.
1.2 Objetivos
O objetivo deste trabalho de conclusão de curso é desenvolver o projeto e montar um sistema
que, conectado a um medidor de consumo de energia elétrica, permita consulta em tempo
real por meio da internet. Essa consulta permitirá aos usuários rastrear as maiores fontes
consumidoras da casa e desligá-las.
1.3 Justificativas/relevância
O tema foi escolhido por envolver microcontroladores e sistemas embarcados, temas pelos
quais tenho interesse e nos quais desenvolvi projetos pessoais durante a graduação. O projeto
tem também um cunho ambiental,já que a proposta é reduzir o consumo de energia elétrica,
tema de suma relevância em nosso país hoje.
1.4 Organização do Trabalho
Este trabalho é dividido em cinco capítulos, incluindo esta introdução, dispostos conforme a
descrição que segue: Capítulo 1 - Introdução: apresenta os objetivos, motivação e justificativa
deste trabalho.
Capítulo 2 - Embasamento Teórico: Introduz a teoria de microcontroladores e sistemas
embarcados.
Capítulo 3 - Materiais e Métodos: Define os materiais e componentes utilizados no pro-
jeto, apresenta todo o código desenvolvido, montagem e ligação dos componentes além de
detalhes na elaboração do projeto.
Capítulo 4 - Resultados e Discussões: Discussão dos resultados obtidos com o projeto,
apresentação do que foi bem sucedido e o que não foi possível alcançar. Apresenta dados
27
obtidos em testes no projeto.
Capítulo 5 - Conclusões: Conclusão do trabalho, objetivos alcançados, pontos de conti-
nuidade e aprendizados obtidos com o projeto de conclusão de curso.
28
29
Capítulo 2
Fundamentação Teórica
2.1 Microcontroladores e Sistemas Embarcados
Um microcontrolador é um chip que contém núcleo de processamento, memórias RAM,
ROM e Flash, periféricos, gerador de clock, e outros circuitos típicos de computadores. Atu-
almente, estão presentes em diversos produtos como: eletrodomésticos, máquinas industriais
e comerciais, brinquedos, sistemas embarcados, entre outros. Os microcontroladores são
amplamente utilizados por seu baixo custo e fácil implementação.[3]
Um sistema embarcado é um sistema microprocessado completamente dedicado ao dis-
positivo onde está encapsulado, realizando tarefas predefinidas e que não podem ser alteradas
durante o uso.[4] São exemplos de dispositivos que utilizam microcontroladores e sistemas
embarcados:
• Smartphones
• Impressoras
• Roteadores
• Equipamentos Médicos
Nesse projeto, o microcontrolador utilizado foi o ESP8266[5] com firmware embarcado
NodeMCU.[6]
2.2 Computação na Nuvem
Computação nas nuvens ou, em inglês, cloud computing é o princípio que propõe que pro-
cessamento, armazenamento podem ser realizados na em computadores servidores remotos
30
e acessados de qualquer ponto utilizando a internet, daí a alusão à nuvem. A viabilidade do
uso desse modelo é mais viável do que o uso de unidades físicas locais.[7] Atualmente, em-
presas como Google, Microsoft e Amazon oferecem serviços de computação na nuvem.[8]
Nesse projeto, a ideia de um sistema online que controle dispositivos físicos é uma aplicação
de Computação na Nuvem e utiliza o servidor OceanCloud, que disponibiliza ao usuário um
computador servidor por meio da internet.
2.3 Internet das Coisas
Internet das coisas ou, em inglês Internet of Things, é um conceito em que todas as coisas do
dia a dia estão conectadas à internet. A conexão de um objeto qualquer à internet possibilita
controle remoto, medições, integração, geração de dados de funcionamento, entre outros.
Tudo isso é possível com a presença de sensores, microcontroladores e módulos de conexão,
integrados ou externos.
Atualmente, o desenvolvimento de soluções utilizando o conceito de internet das coisas
não está restrito a grandes companhias de tecnologia. Graças à redução de preços, popula-
rização e aumento na quantidade de material de suporte, desenvolvedores amadores podem
colocar suas ideias em prática e desenvolver aplicações em internet das coisas.[9]
31
Capítulo 3
Material, Ferramentas e Métodos
Neste capítulo serão descritos o material e métodos utilizados no projeto. Primeiramente os
componentes serão apresentados e explicados, posteriormente é mostrada a montagem e as
conexões realizadas no trabalho.
32
3.1 Visão Geral do sistema
A visão geral do sistema é representada pela Figura 3.1, que apresenta a comunicação entre
os dispositivos e o fluxo de funcionamento do projeto.
Figura 3.1: Visão Geral do sistema
33
3.2 Materiais
3.2.1 FTDI232-1
O FTDI232-1 é uma placa que contém o microcontrolador de interface USB - UART FT232RL,
que permite, com auxílios de drivers instalados em um computador, realizar a programação e
o teste de dispositivos que utilizam comunicação serial e são programados utilizando-se essa
tecnologia. Nesse projeto, o FTDI232-1 foi utilizado para programar e testar o ESP-12. A
figura 3.2 mostra o componente utilizado.[10]
Figura 3.2: Foto do FTDI232-1
3.2.2 ESP-12
o ESP-12 é um chip que possui o microcontrolador ESP8266 e oferece acesso às portas de
entrada e saída do componente. O microcontrolador possui 80Mhz de clock, 4Mb de memória
Flash e funciona como cliente ou ponto de acesso para conexões Wi-Fi. O processador pode
ser programado com o firmware NodeMCU e pode executar códigos em Lua e C.[5]
Na figura 3.3, pode-se comparar o tamanho do ESP-12 com uma moeda americana.
Figura 3.3: Comparação do tamanho do ESP-12 com uma moeda
34
3.2.3 Raspberry Pi Rev 2
Raspberry Pi é um computador de uma única placa desenvolvido no Reino Unido pela Rasp-
berry Pi Foundation em 2012. Desde seu lançamento, a popularidade do modelo em projetos
de automação, gerenciamento de arquivos de mídia entre outras aplicações de internet das
coisas cresceu exponencialmente. A placa possui um processador de 700Mhz e é capaz de
executar Sistemas Operacionais Unix. [11] Nessa aplicação, foi utilizado o ArchLinux, versão
simplificada do Sistema Operacional, muito utilizada em processadores ARM.
3.3 Ferramentas
3.3.1 Lua
Lua é uma linguagem de script criada em 1993 na PUC-RJ. A linguagem possui simplicidade
única, extensível e permite prototipagens rápidas e integrações eficientes entre diferentes
linguagens.[12] Nesse projeto, foram utilizados códigos Lua no NodeMCU no ESP-12.
3.3.2 NodeMCU
NodeMCU é uma plataforma aberta de desenvolvimento de Internet das Coisas que utiliza
Lua como linguagem. É um firmware para ESP8266 que facilita a integração do módulo
Wi-Fi a outros hardwares. Nesse projeto, os ESP-12 utilizados possuem NodeMCU como
firmware.[6]
3.3.3 Python
Python é uma linguagem de programação e script, interpretada, orientada a objetos criada em
1991 por Guido Van Rossum. A linguagem possui uma sintaxe concisa e grande diversidade
de bibliotecas. Nessa aplicação, foi utilizada a versão 2.7 do Python, instalada e executada
na Raspberry Pi.[13]
3.3.4 PHP
PHP é uma linguagem interpretada criada em 1994 para ser utilizada no lado do servidor de
aplicações web. Atualmente, é a linguagem de programação mais utilizada no mundo para
esse tipo de aplicação.[14] Neste projeto, todo o website foi desenvolvido com base em um
35
framework PHP que utiliza o VoodOrm para facilitar a comunicação com o banco de dados
MySQL. Para o design das páginas, foram utilizados HTML, CSS e JavaScript.
3.3.5 MySQL
MySQL é uma ferramenta de gerenciamento de banco de dados que utiliza linguagem SQL.
Foi criado na década de 1980 e atualmente é o banco de dados relacional mais utilizado do
mundo.[15] Nesse projeto, o banco de dados MySQL armazena informações sobre os locais
e pontos da residência e o consumo nos pontos específicos.
3.3.6 Chart.js
Chart.js é uma biblioteca JavaScript para a criação de gráficos. Ideal para pequenas apli-
cações, oferece gráficos simples, elegantes e responsivos. A biblioteca utiliza HTML 5 e é
compatível com todos os navegadores.[16] Neste projeto, todos os gráficos foram montados
utilizando Chart.js.
3.4 Métodos
3.4.1 ESP-12 - Recepção das medições e envio dos dados via socket
O ESP-12 funciona como escravo na relação com a RaspberryPi e como mestre na relação
com o dispositivo medidor.
O ESP-12 executa o arquivo LUA, init.lua que conecta à rede Wi-Fi pré configurada e
executa o arquivo generatesend.lua
O arquivo generatesend.lua se conecta ao servidor socket HTTP, que está sendo execu-
tado na Rasperry Pi e, ao receber a requisição de medida e o status do sensor, envia uma
requisição ao dispositivo medidor em conjunto com o comando para ligar ou desligar o relé
e o dispositivo medidor envia a leitura serialmente ao ESP-12.
Em posse do valor da medição, o ESP-12 envia o dado via socket HTTP para a Raspberry
Pi.
Os códigos LUA completos são explicitados nos apêndices A.1.1 e A.1.2
36
3.4.2 Criação de servidor socket HTTP e threadings na Rapsberry Pi
O código presente na Raspberry Pi utiliza multi-threading para desempenhar múltiplas fun-
ções simultaneamente.
São utilizados os seguintes threads:
• main_thread
É o thread principal, se mantém aguardando novas conexões de sensores e, ao receber
uma nova conexão, cria um novo thread exclusivo, chamando a função clientthread.
• clientthread
Cada conexão da Raspberry Pi com sensores é mantida por um thread exclusivo, que
executam a função clientthread Essa função envia um pedido de leitura ao ESP-12
em questão, juntamente com o status do sensor e recebe o valor lido pelo dispositivo
medidor e enviado pelo ESP-12. Em posse do dado da medida, a função grava esse
valor em uma lista global juntamente com o endereço físico do ESP-12 e a data e hora
da medição.
• requestT hread
Esse thread é executado continuamente a partir do momento em que há uma conexão
ativa. Ele realiza a conexão da Raspberry Pi ao servidor PHP. A função executada
primeiramente, realiza uma leitura dos sensores ativos no servidor, utilizando a request
ativos e então atualiza a lista de sensores da Raspberry Pi. Em seguida, é feita a
conversão da lista de medições em um JSON e esse JSON é submetido ao servidor PHP
via request adicionar
bulk.
O código Python presente na Raspbery Pi é explicitado no Apêndice A.2.1.
3.4.3 Estrutura do website e apresentação dos dados para o usuário
No momento da defesa, O website está hospedado em uma máquina do serviço DigitalOcean
e pode ser acessado da internet pelo endereço http://107.170.36.176/. O website também está
hospedado e será mantido em um endereço dentro dos domínios da USP com disponibilidade
regida pela universidade.
O website possui seis views principais e diversas views auxiliares acessíveis ao usuário:
37
Login
Na tela de login, o usuário digita seu login e senha, que são checados na tabela de usuários
no banco de dados. Pode-se visualizar a página de login na figura 3.4.
Figura 3.4: Página de Login
38
Visão Geral
É a página principal do website, onde o usuário pode visualizar o consumo de Energia elétrica
nos locais que possuem tomadas com sensores conectados.
O primeiro gráfico, Consumo no Período, permite visualização em R$ ou em kWh. O
preço do kWh é inserido manualmente pelo usuário.
O gráfico pode ser ajustado para mostrar um dia, mês, semana, ano ou um período definido
manualmente.
O agrupamento dos dados pode ser feito por Horário, Dias ou Meses. Pode-se visualizar
a página de visão geral na figura 3.5
Figura 3.5: Gráfico de Consumo no período
O segundo gráfico, Consumo em Tempo Real, permite ao usuário visualizar a potência
em Watts que está sendo consumida em seus locais em tempo real. O gráfico de consumo em
tempo real é apresentado na figura 3.6
39
Figura 3.6: Gráfico de Consumo em Tempo Real
40
Locais
A página de Locais apresenta todos os locais cadastrados no Banco de Dados. Permite inserir
novos locais, ordenar, buscar, editar e excluir locais existentes e acessar a página de detalhes
dos locais. Pode-se visualizar a página de locais na figura 3.7
Figura 3.7: Página de Locais
41
Locais - Detalhes
Na página de detalhes de um local, é possível visualizar o consumo por período e em tempo
real do local, além da lista dos pontos cadastradas ao local. É possível também, nessa página,
incluir novos pontos manualmente ao local. Os gráficos funcionam da mesma forma que os
da página Visão Geral. Pode-se visualizar a página de detalhes de um determinado local na
figura 3.8
Figura 3.8: Página Locais - Detalhes
42
Pontos
A página de Pontos apresenta todos os Pontos, ou tomadas, cadastrados no Banco de Dados e
suas informações, como tensão e local. Permite inserir novos pontos, ordenar, buscar, editar
e excluir pontos existentes. Pode-se visualizar a página de pontos na figura 3.9
Figura 3.9: Página de Pontos
43
Pontos - Edição
Na página de edição dos pontos, é possível modificar o comportamento do ponto selecionado
em todos os perfis existentes. É possível fazer com que um ponto permaneça ligado ou
desligado constantemente ou em um determinado período. A página de edição de pontos,
pode ser visualizada na figura 3.10
Figura 3.10: Página de Pontos - Edição
44
Usuários
A página de Usuários apresenta todos os usuários cadastrados no Banco de Dados. Permite
inserir novos usuários, ordenar, buscar, editar e excluir usuários existentes. Pode-se visualizar
a página de usuários na figura 3.11
Figura 3.11: Página de Usuários
45
Perfis
Na página de perfis, o usuário pode incluir, alterar ou excluir os perfis de utilzação, além de
poder escolher qual o perfil ativo. Pode-se visualizar a página de perfis na figura 3.12.
Figura 3.12: Página de Perfis
46
Estrutura do Banco de dados e Lógica de inserção de medições
O Banco de dados é estruturado da seguinte forma:
• A tabela Usuários é descrita como na Tabela 3.1.
Tabela 3.1: Tabela UsuariosCampo Tipo Chave
id int primária
nome varchar
login varchar
senha varchar
• A tabela Locais é descrita como na Tabela 3.2.
Tabela 3.2: Tabela LocaisCampo Tipo Chave
id int primária
descrição varchar
• A tabela Pontos é descrita como na Tabela 3.3.
Tabela 3.3: Tabela PontosCampo Tipo Chave
id int primária
idlocal int estrangeira
descrição varchar
identificador varchar
ativo int
tensão int
consumo_atual decimal
consumo_atual_datahora timestamp
• A tabela Consumos é descrita como na Tabela 3.4:
• A tabela Perfis é descrita como na Tabela 3.5:
47
Tabela 3.4: Tabela ConsumosCampo Tipo Chave
id int primária
idponto int estrangeira
consumo decimal
datainicial timestamp
datafinal timestamp
somatória decimal
quantidade int
tempo_decorrido int
Tabela 3.5: Tabela PerfisCampo Tipo Chave
id int primária
descrição varchar
Tabela 3.6: Tabela Pontos Perfis AtivosCampo Tipo Chave
idperfil int estrangeira
idponto int estrangeira
idponto int
ativo int
horainicial varchar
horafinal varchar
48
• A tabela Pontos_Perfis_Ativos, que armazena os períodos de funcionamento de cada
ponto em cada perfil é descrita como na Tabela 3.6:
Cada medição incluída no banco de dados por meio da API passa pela seguinte lógica:
• É comparada a hora da medição com a hora da última medição do mesmo ponto;
Caso a medição anterior tenha ocorrido menos de 10 segundos antes e esteja dentro
da mesma hora, a medição atual é agrupada com a anterior e a média de consumo no
período é recalculada;
Caso a medição anterior tenha ocorrido mais de 10 segundos antes ou esteja em
uma hora diferente, é criada uma nova linha no banco de dados e a medição atual é
incluída.
Com essa lógica, é possível detectar cortes no consumo de energia dentro de uma hora e
reduzir o número total de linhas no banco de dados.
Os códigos fontes do website estão disponíveis no endereço www.opencore.eesc.usp.
br/evandro/TCC_2016/Progis
49
Capítulo 4
Resultados e Discussões
4.1 Resultados
O trabalho atingiu os resultados especificados na definição do projeto, funcionando como um
protótipo de um sistema que permite ao usuário o controle e monitoramento do consumo de
energia elétrica, individualizado por tomada, em uma residência. A seguir, serão discutidas
especifidades do trabalho com cada ferramenta e material.
4.1.1 ESP-12, Comunicação Wi-Fi e LUA
Inicialmente, foi utilizado o ESP-01 como módulo wireless, porém, devido ao comporta-
mento inconsistente do módulo, decidiu-se utilizar um componente mais robusto, da mesma
família e de aplicação semelhante, o ESP-12 . O firmware para aplicações IOT NodeMCU
atendeu completamente os requisitos do projeto, sendo facilmente configurável e programá-
vel. Utilizando a linguagem LUA, foi possível testar e desenvolver o código que recebe os
valores lidos do medidor de potência e os transmite para a Raspberry Pi.
4.1.2 Raspberry PI, Python, Comunicação com Banco de Dados por meio das APIs
Por possuir-se mais familiaridade com a linguagem Python e o dispositivo, a Raspberry Pi
não se apresentou como empecilho e pode-se explorar todo o potencial do dispositivo. A
Raspberry Pi é um dispositivo superdimensionado para a aplicação. O componente foi utili-
zado devido à disponibilidade e por atender os requisitos do projeto, poderiam ser utilizados
quaisquer microcontroladores ARMs com WiFi ou Ethernet, sem necessidade de alteraçÕes
nos códigos ou configurações adicionais. O código Python da Raspberry Pi utiliza APIs para
incluir informações no banco de dados. A inclusão do valor medido em todas as tomadas
50
capturadas pela Raspberry Pi é feita a cada 1s e tratada pelo servidor PHP. Esse período foi
definido para que seja mantida a precisão no tempo da medida porém a rede não seja sobre-
carregada.
4.1.3 Website em PHP no DigitalOcean, Banco de dados MySQL
O website foi desenvolvido utilizando um Framework PHP, o que facilitou no desenvolvi-
mento, porém não eliminou todas as dificuldades. A criação das páginas utilizando-se HTML,
CSS e Javascript exigiu muito estudo das ferramentas e foi suportada pela ampla quantidade
de material disponível para consulta na internet. A comunicação com o banco de dados utili-
zando Vood ORM foi eficaz. As escolhas de agrupamento e escala dos gráficos permitem ao
usuário a detecção de picos de consumo de energia elétrica em horas específicas do dia, em
um dia específico ou em uma hora qualquer de um dia específico. Foi definida a amostragem
de uma hora para visualização nos gráficos, pois foi considerado que, para o usuário final, não
seria necessária amostragem maior. Outro fator determinante para a escolha da amostragem
foi que, ao testar-se com valor maior, o banco de dados passou a demorar mais de 1s para
executar algumas queries; preferiu-se então a manutenção da performance do sistema sobre
o aumento da amostragem.
4.2 Discussões
4.2.1 Limitações da Aplicação
A aplicação possui limitações nos seguintes pontos:
• Para o funcionamento do sistema, é necessário que o módulo medidor de potência trans-
mita os dados via serial para o ESP-12 a taxa de 9600bpm;
• A máxima amostragem dos dados de consumo suportada pelo projeto é uma hora; Para
aumentar a amostragem, seria necessário alterar a forma de armazenamento no banco
de dados e consequentemente utilizar um servidor de banco de dados com processador
mais pontente e mais memória RAM;
• É necessário pré-configurar os módulos de medição individualmente; Essa limitação é
inerente da utilização de módulos ESP-12;
51
4.2.2 Impactos da aplicação na rede elétrica
O projeto apresenta impactos na rede elétrica, consumindo energia. O consumo dos módu-
los não é medido pela aplicação. O consumo médio dos dispositivos é explicitado em seus
datasheets[17]:
• ESP-12
O ESP-12 possui corrente de entrada média de operação de 150mA durante a transmis-
são de dados, consumindo assim em média 495mWh
Considerando as impedâncias da fonte e dos fios utilizados, o módulo completo consume
aproximadamente 550mWh. Em um mês, ligado em tempo integral o módulo consumiria
396Wh ou aproximadamente R$0,10 nas tarifas atuais. Em uma aplicação com 20 módulos,
o gasto total mensal não passaria de R$2,50.
52
53
Capítulo 5
Conclusões
O desenvolvimento de um sistema na nuvem para controle residencial de consumo de energia
elétrica mostrou-se viável do ponto de vista técnico e útil do ponto de vista social. Com um
pequeno investimento, o cidadão poderá acompanhar o gasto de energia em pontos determi-
nados e empreender ações que visem à economia de energia elétrica, como troca de aparelhos
elétricos ou racionalização do seu uso. O nome do website resume bem o objetivo do aparelho
ora proposto: WISE - WHAT’S INDEED SPENDING ELECTRICITY? Em Português: O
que realmente está gastando energia? O projeto foi desenvolvido utilizando conceitos apren-
didos na graduação e novos conceitos necessários para a composição do trabalho; o trabalho
em si serviu como incentivo para o aprendizado de diversas ferramentas como PHP, HTML,
CSS, Javascript, LUA.
O custo dos componentes utilizados na confecção do módulo protótipo é apresentado na
Tabela 5.1
Tabela 5.1: Tabela Custos por Módulo
Componente Custo(US$)
ESP-12 7
Fonte 5
Placa Perfurada 2
Fios e Adaptadores 2
Total 16
A Raspberry Pi possui custo aproximado de US$50,00
54
5.0.1 Expansões do trabalho
Como possíveis expansões do trabalho, poderiam ser incluídas funcionalidades como:
• Desenvolvimento de módulos que utilizem outros tipos sensores e o mesmo sistema
web de monitoramento. São exemplos dessa expansão: Sensores de alarme, portões
eletrônicos, câmeras de segurança, interfones, etc;
• Migração do sistema web para plataforma com múltiplos clientes;
• Utilização do Azure Machine Learning ou outro algoritmo estatístico para análise dos
dados capturados e predição do consumo futuro.
55
Referências Bibliográficas
[1] Bc ve alta de 51,7% na energia em 2015 e de 15% na gasolina. http:
//g1.globo.com/economia/noticia/2015/10/bc-ve-alta-de-517-na-
energia-em-2015-e-de-15-na-gasolina.html, Acesso em: 19 de janeiro de
2016.
[2] IndieGoGo - Curb. https://www.indiegogo.com/projects/curb-power-your-
life-smarter#/, Acesso em: 19 de janeiro de 2016.
[3] Microcontroladores. http://www.bosontreinamentos.com.br/eletronica/
eletronica-geral/introducao-aos-microcontroladores/, Acesso em: 23 de
fevereiro de 2016.
[4] Sistemas embarcados. http://www.embarc.com.br/p1600.aspx, Acesso em: 23 de
fevereiro de 2016.
[5] Esp-12. https://www.adafruit.com/product/2491, Acesso em: 25 de fevereiro de
2016.
[6] Nodemcu. http://nodemcu.com/index_en.html, Acesso em: 12 de maio de 2016.
[7] Cloud cmputing. http://www.gartner.com/newsroom/id/707508, Acesso em: 12
de maio de 2016.
[8] Network world. http://www.networkworld.com/article/2161274/cloud-
computing/gartner-s-iaas-magic-quadrant--a-who-s-who-of-cloud-
market.html, Acesso em: 12 de maio de 2016.
[9] Internet of things. http://www.itu.int/en/ITU-T/gsi/iot/Pages/default.
aspx, Acesso em: 12 de maio de 2016.
56
[10] Ftdi. http://www.ftdichip.com/FTCorporate.htm, Acesso em: 24 de fevereiro de
2016.
[11] What’s a raspberry pi? https://www.raspberrypi.org/help/what-is-a-
raspberry-pi/, Acesso em: 24 de fevereiro de 2016.
[12] Lua. https://www.lua.org/start.html, Acesso em: 12 de maio de 2016.
[13] Python. https://www.python.org/, Acesso em: 12 de maio de 2016.
[14] Php. http://php.net/manual/pt/, Acesso em: 12 de maio de 2016.
[15] Mysql. http://www.mysql.com/why-mysql/, Acesso em: 12 de maio de 2016.
[16] chart.js. http://www.chartjs.org/docs/, Acesso em: 12 de maio de 2016.
[17] Esp-12 datasheet. http://www.seeedstudio.com/wiki/images/7/7d/ESP-12E_
brief_spec.pdf, Acesso em: 12 de maio de 2016.
57
Apêndice A
Algoritmos do Projeto
A.1 Algoritmos LUA no ESP-12
A.1.1 init.lua
w i f i . se tmode ( w i f i . STATION)
w i f i . s t a . c o n f i g ( " PROGISNET" , " 1 2 4 2 0 0 3 1 5 " )
w i f i . s t a . c o n n e c t ( )
tmr . a l a rm ( 0 , 2000 , 1 , f u n c t i o n ( )
l o c a l i p = w i f i . s t a . g e t i p ( )
i f i p t h e n
tmr . s t o p ( 0 )
p r i n t ( i p )
d o f i l e ( " g e n e r a t e _ s e n d . l u a " )
e l s e
p r i n t ( " C o n n e c t i n g t o WIFI . . . " )
end
end )
A.1.2 generatesend.lua
f u n c t i o n c o n n e c t _ s o c k e t ( sk )
sk : on ( " c o n n e c t i o n " , f u n c t i o n ( sck , c )
macAdd = w i f i . ap . getmac ( )
sk : send ( " i d : " . . macAdd )
c o n n e c t e d = t r u e
end )
sk : on ( " r e c e i v e " , f u n c t i o n ( sck , c )
i f s t r i n g . f i n d ( c , " 0 " ) t h e n
s t a t u s _ s e n s o r = ’0 ’
e l s e i f s t r i n g . f i n d ( c , " 1 " ) t h e n
s t a t u s _ s e n s o r = ’1 ’
end
i f s t r i n g . f i n d ( c , " SendData " ) t h e n
p r i n t ( " S t a t u s S en so r : " . . s t a t u s _ s e n s o r )
i f p c a l l ( g e n e r a t e , sk , s t a t u s _ s e n s o r ) t h e n
main ( s t a t u s _ s e n s o r )
e l s e
c o n n e c t e d = f a l s e
end
end
end )
end
58
f u n c t i o n g e n e r a t e ( sk , s t a t u s _ s e n s o r )
da taToSend = " meas : " . . 2 5 + math . random ( 1 , 5 )
sk : send ( da taToSend )
sk : on ( " s e n t " , f u n c t i o n ( sk )
p r i n t ( " D a t a S e n t " . . da taToSend )
end )
end
f u n c t i o n main ( s t a t u s _ s e n s o r )
tmr . a l a rm ( 0 , 1000 , 1 , f u n c t i o n ( )
i f w i f i . s t a . g e t i p ( ) == n i l t h e n
−−p r i n t ( " No IP " )
d o f i l e ( ’ i n i t . lua ’ )
e l s e
i f c o n n e c t e d == f a l s e t h e n
−−p r i n t ( " C o n n e c t i n g t o S oc ke t S e r v e r . . . " )
sk= n e t . c r e a t e C o n n e c t i o n ( n e t . TCP , 0 )
sk : c o n n e c t ( 9 9 9 9 , " 1 9 2 . 1 6 8 . 0 . 1 6 " )
end
c o n n e c t _ s o c k e t ( sk )
end
end )
end
c o n n e c t e d = f a l s e
s t a t u s _ s e n s o r = ’1 ’
main ( s t a t u s _ s e n s o r )
A.2 Algoritmo Python na Raspberry Pi
A.2.1 socketserver.py
i m p o r t s o c k e t
i m p o r t s y s
i m p o r t t h r e a d i n g
i m p o r t t ime
i m p o r t d a t e t i m e
i m p o r t j s o n
i m p o r t r e q u e s t s
HOST = ’ ’
PORT = 9999
s = s o c k e t . s o c k e t ( s o c k e t . AF_INET , s o c k e t .SOCK_STREAM)
p r i n t ( ’ S oc ke t c r e a t e d ’ )
# Bind s o c k e t t o l o c a l h o s t and p o r t
t r y :
s . b ind ( ( HOST, PORT ) )
e x c e p t s o c k e t . e r r o r a s msg :
p r i n t ’ Bind f a i l e d . E r r o r Code : ’ + s t r ( msg [ 0 ] ) + ’ Message ’ + msg [ 1 ]
s y s . e x i t ( )
p r i n t ’ S oc ke t b ind comple te ’
# S t a r t l i s t e n i n g on s o c k e t
s . l i s t e n ( 1 0 )
p r i n t ’ S oc ke t now l i s t e n i n g ’
d e f c l i e n t t h r e a d ( conn , add r ) :
i = None
a t i v o _ s t r = ’ Off ’
w h i l e True :
g l o b a l l i s t _ s e n s o r s
t r y :
a t i v o _ s t r = s t r ( l i s t _ s e n s o r s [ i ] [ " a t i v o " ] )
e x c e p t E x c e p t i o n as e r r :
59
p r i n t e r r
p r i n t ’ Ainda nao tem S t a t u s \ n ’
p a s s
conn . s e n d a l l ( ’ SendData ’ + a t i v o _ s t r )
p r i n t ’ Sen t t o ESP : ’ + a t i v o _ s t r
# R e c e i v i n g from c l i e n t
d a t a = conn . r e c v ( 1 0 2 4 )
i f d a t a :
i f d a t a [ : 3 ] == ’ i d : ’ :
# p r i n t d a t a [ 4 : ]
i = g e t _ i n d e x ( l i s t _ s e n s o r s , d a t a [ 4 : ] )
p r i n t ’ Old Index : ’ + s t r ( i )
i f i == None :
p r i n t ’ Not found , Adding . . . \ n ’
l i s t _ s e n s o r s . append ( { " i d e n t i f i c a d o r " : d a t a [ 4 : ] , " d a t a h o r a " : 0 , " v a l o r " : 0 } )
i = g e t _ i n d e x ( l i s t _ s e n s o r s , d a t a [ 4 : ] )
p r i n t ’New Index : ’ + s t r ( i )
e l i f d a t a [ : 4 ] == ’ meas ’ :
# p r i n t " g o t : " + d a t a [ 5 : ]
l i s t _ s e n s o r s [ i ] [ " d a t a h o r a " ] = d a t e t i m e . d a t e t i m e . now ( ) . s t r f t i m e ("%Y−%m−%d %H:%M:%S " )
t r y :
l i s t _ s e n s o r s [ i ] [ " v a l o r " ] = ( f l o a t ( d a t a [ 5 : ] . s t r i p ( " \ n " ) ) ∗ l i s t _ s e n s o r s [ i ] [ " t e n s a o " ] ) / 1 0
e x c e p t E x c e p t i o n as e r r :
p r i n t e r r
p r i n t " e s p e r a n d o t e n s a o "
t ime . s l e e p ( 0 . 5 )
# conn . s e n d a l l ( r e p l y )
p r i n t ( ’ # came o u t o f loop ’ )
conn . c l o s e ( )
#now keep t a l k i n g wi th t h e c l i e n t
d e f g e t _ i n d e x ( l i s t _ s e n s o r s , d a t a ) :
f o r index , d i c t _ s e n s o r i n enumera t e ( l i s t _ s e n s o r s ) :
i f d i c t _ s e n s o r [ " i d e n t i f i c a d o r " ] == d a t a :
r e t u r n i n d e x
d e f g e t A c t i v e ( u r l G e t ) :
t r y :
r = r e q u e s t s . g e t ( u r l G e t )
d i c t = j s o n . l o a d s ( r . c o n t e n t )
r e t u r n d i c t [ " p o n t o s " ]
e x c e p t E x c e p t i o n as e r r :
p r i n t e r r
p r i n t ’ r e q u e s t s ge t ’
p a s s
d e f r e q u e s t T h r e a d ( u r l S t r , u r l G e t ) :
w h i l e True :
g l o b a l t h r e a d _ r u n n i n g
t h r e a d _ r u n n i n g = 1
t _ e n d = t ime . t ime ( ) + 10
w h i l e t ime . t ime ( ) < t _ e n d :
g l o b a l l i s t _ s e n s o r s
t r y :
l i s t _ a c t i v e s = g e t A c t i v e ( u r l G e t )
f o r a c t i v e i n l i s t _ a c t i v e s :
f o r s e n s o r i n l i s t _ s e n s o r s :
i f ( s e n s o r [ " i d e n t i f i c a d o r " ] == a c t i v e [ " i d e n t i f i c a d o r " ] ) :
s e n s o r [ " t e n s a o " ] = a c t i v e [ " t e n s a o " ]
s e n s o r [ " a t i v o " ] = a c t i v e [ " a t i v o " ]
e x c e p t E x c e p t i o n as e r r :
p r i n t e r r
p a s s
t _ w a i t = t ime . t ime ( ) + 1
w h i l e t ime . t ime ( ) < t _ w a i t :
60
t r y :
p a r s e d _ j s o n = j s o n . dumps ( l i s t _ s e n s o r s )
p r i n t p a r s e d _ j s o n
r = r e q u e s t s . p o s t ( u r l S t r , d a t a ={ ’ bulk ’ : p a r s e d _ j s o n } )
wi th open ( ’ d a t a . t x t ’ , ’w’ ) a s o u t f i l e :
j s o n . dump ( l i s t _ s e n s o r s , o u t f i l e )
e x c e p t E x c e p t i o n as e r r :
p r i n t e r r
p r i n t " w a i t i n g d a t a "
p a s s
t r y :
t ime . s l e e p ( t _ w a i t − t ime . t ime ( ) )
e x c e p t E x c e p t i o n as e r r :
p r i n t e r r
p a s s
i f __name__ == ’ __main__ ’ :
m a i n _ t h r e a d = t h r e a d i n g . c u r r e n t _ t h r e a d ( )
u r l S t r = ’ h t t p : / / 1 0 7 . 1 7 0 . 3 6 . 1 7 6 / consumos / a d i c i o n a r / bu lk ? k=3 d5d088eb89f3b209b763e88e80871c7d9e717d6 ’
u r l G e t = ’ h t t p : / / 1 0 7 . 1 7 0 . 3 6 . 1 7 6 / consumos / a t i v o s ? k=3 d5d088eb89f3b209b763e88e80871c7d9e717d6 ’
l i s t _ s e n s o r s = [ ]
t h r e a d _ r u n n i n g = 0
t h r e a d s = [ ]
w h i l e True :
i f t h r e a d _ r u n n i n g == 0 :
t _ r e q u e s t = t h r e a d i n g . Thread ( t a r g e t = r e q u e s t T h r e a d , a r g s =( u r l S t r , u r l G e t ) )
t _ r e q u e s t . daemon = True
t h r e a d s . append ( t _ r e q u e s t )
t _ r e q u e s t . s t a r t ( )
# w a i t t o a c c e p t a c o n n e c t i o n − b l o c k i n g c a l l
conn , add r = s . a c c e p t ( )
p r i n t ’ Connec ted wi th ’ + add r [ 0 ] + ’ : ’ + s t r ( add r [ 1 ] )
t _ c l i e n t = t h r e a d i n g . Thread ( t a r g e t = c l i e n t t h r e a d , a r g s =( conn , add r ) )
t _ c l i e n t . daemon = True
t h r e a d s . append ( t _ c l i e n t )
t _ c l i e n t . s t a r t ( )
s . c l o s e ( )
top related