Monitor de energia inteligente Raspberry Pi baseado em IoT
Monitor-de-energia-inteligente-Raspberry-Pi-baseado-em-IoTblog_image_banner

Monitor de energia inteligente Raspberry Pi baseado em IoT


Os Monitores de Energia, sejam eles cobrindo todo o apartamento ou implantados para monitorar apenas um eletrodoméstico, são uma forma de você acompanhar o seu consumo e fazer os ajustes necessários. Embora estejam cada vez mais disponíveis no mercado, o fabricante em mim ainda acha que será uma ótima ideia construir uma versão DIY que possa ser adaptada para atender a requisitos pessoais específicos.

Como tal, para o tutorial de hoje, construiremos um monitor de consumo de energia Raspberry Pi capaz de obter o consumo de energia e fazer o upload para Adafruit.io.


Diagrama de blocos do medidor de energia inteligente Raspberry Pi

Um diagrama de blocos mostrando como o sistema funciona é mostrado abaixo.


Para escolher as unidades uma após a outra;

Unidade de detecção de corrente: A unidade de detecção de corrente é composta pelo sensor de corrente SCT -013 que pode medir até 100A, dependendo da versão que você comprar. O sensor transforma a corrente que passa pelo fio no qual está preso em uma pequena corrente que é alimentada no ADC por meio de uma rede de divisores de tensão.


Unidade de detecção de voltagem: Embora eu não tenha conseguido colocar minhas mãos em um módulo sensor de voltagem, vamos construir um DIY, um sensor de voltagem sem transformador que mede a voltagem usando o princípio dos divisores de voltagem. O sensor de tensão DIY envolve o estágio divisor de tensão onde a alta tensão é transformada em um valor adequado para entrada no ADC.


Unidade de Processamento: A unidade de processamento compreende o ADC e o Raspberry pi. O ADC pega o sinal analógico e o envia para o framboesa pi, que então calcula a quantidade exata de energia que está sendo consumida e a envia para uma nuvem de dispositivo designada. Para o propósito deste tutorial, usaremos Adafruit.io como nossa nuvem de dispositivo. Também construímos outros


Isenção de responsabilidade: antes de começar, é importante mencionar que este projeto envolve a conexão a uma fonte de alimentação CA que é perigosa e pode ser fatal se não for manuseada com segurança. Certifique-se de ter experiência em trabalhar com CA antes de tentar isso.

Preparados? Vamos lá!


Componentes Requeridos


Os seguintes componentes são necessários para construir este projeto.


Raspberry Pi 3 ou 4 (o processo deve ser o mesmo para o RPI2 com um Dongle WiFi)

ADS1115 16bit I2C ADC

YHDC SCT-013-000

Adaptador de alimentação MicroUSB 2,5 A 5 V

Resistor 2W 10K (1)

Resistor 1 / 2W 10K (2)

Resistor de 33 ohms (1)

Resistor 2W 3,3k (1)

Diodo IN4007 (4)

Diodo Zener 3,6v (1)

Potenciômetro de 10k (ou predefinição) (1)

Capacitor 50v 1uf

Capacitor 50v 10uf (2)

BreadBoard

Jumper Wire

Outros acessórios para uso do Raspberry Pi.


Além dos componentes de hardware listados acima, o projeto também requer algumas dependências de software e bibliotecas que iremos instalar à medida que avançamos.


Embora este tutorial funcione independentemente do sistema operacional Raspberry Pi usado, estarei usando o sistema operacional Raspberry Pi buster em um Pi 3 (também deve funcionar em um Pi 4) e presumo que você esteja familiarizado com a configuração do Raspberry Pi com o Raspbian Buster OS (praticamente o mesmo processo das versões anteriores), e você sabe como fazer SSH nele usando um software de terminal como o hyper. Se você tiver problemas com qualquer um desses, há toneladas de tutoriais do Raspberry Pi neste site que podem ajudar

Preparando o Pi


Antes de começarmos a conectar os componentes e codificar, existem algumas tarefas simples que precisamos realizar no raspberry pi para ter certeza de que estamos prontos para começar.


Etapa 1: Habilitando o Pi I2C

No centro do projeto de hoje não está apenas o raspberry pi, mas o ADC baseado em I2C de 16 bits ADS1115. O ADC nos permite conectar sensores analógicos ao Raspberry Pi, uma vez que o próprio Pi não tem um ADC embutido. Ele recebe os dados por meio de seu próprio ADC e os encaminha para o raspberry pi via I2C. Como tal, precisamos habilitar a comunicação I2C no Pi para que ele possa se comunicar com ele.


O bus I2C do Pi pode ser ativado ou desativado através da página de configuração do Raspberry Pi. Para iniciá-lo, clique no ícone Pi na área de trabalho e selecione as preferências, seguido de configuração do Raspberry pi.

Isso deve abrir a página de configuração. Verifique o botão de rádio habilitado para o I2C e clique em OK para salvá-lo e reinicie o Pi para efetuar as alterações.


Se você estiver executando o Pi no modo headless, a página de configuração do Raspbian pode ser acessada executando sudo raspi-config.


Etapa 2: Instalando a biblioteca ADS11xx da Adafruit

A segunda coisa que precisamos fazer é instalar a biblioteca python ADS11xx, que contém funções e rotinas que facilitam a escrita de um script python para buscar valores do ADC.

Siga as etapas abaixo para fazer isso.


Atualize seu pi executando; sudo apt-get update seguido por sudo apt-get upgrade atualizará o pi garantindo que não haja problemas de compatibilidade para qualquer novo software que você decida instalar.

Em seguida, execute o comando cd ~ para garantir que você está no diretório inicial.

Em seguida, instale os fundamentos da compilação executando; sudo apt-get install build-essential python-dev python-smbus git

Em seguida, clone a pasta Adafruit git que contém a biblioteca ADS executando; git clone https://github.com/adafruit/Adafruit_Python_ADS1x15.git

Mude para o diretório do arquivo clonado e execute o arquivo de configuração usando; cd Adafruit_Python_ADS1x1z seguido por sudo python setup.py install


Feito isso, a instalação deve estar concluída.


Você pode testar a instalação da biblioteca conectando o ADS1115 conforme mostrado na seção de esquemas abaixo e executar o código de amostra que veio com a biblioteca primeiro, mudando para sua pasta usando; exemplos de cd e executando o exemplo usando; python simpletest.py


Etapa 3: instalar o módulo Adafruit.IO Python

Conforme mencionado durante as introduções, publicaremos leituras dos sensores de tensão e corrente para a Adafruit IO Cloud, a partir da qual pode ser visto de todo o mundo ou conectado com IFTTT para realizar quaisquer ações que você desejar.


O módulo python Adafruit.IO contém sub-rotinas e funções que aproveitaremos para transmitir dados facilmente para a nuvem. Siga as etapas abaixo para instalar o módulo.


Execute o cd ~ para retornar ao diretório inicial.

Em seguida, execute o comando; sudo pip3 instalar adafruit-io. Deve instalar o módulo python Adafruit IO.


Etapa 4: configure sua conta Adafruit.io

Para usar o Adafruit IO, definitivamente será necessário primeiro criar uma conta e obter uma chave AIO. Essa chave AIO junto com seu nome de usuário será usada por seu script Python para acessar o serviço de nuvem Adafruit IO. Para criar uma conta, visite; https://io.adafruit.com/, clique no botão começar gratuitamente e preencha todos os parâmetros necessários.

Com a inscrição concluída, você verá o botão View AIO Key à direita da sua página inicial.


Clique nele para obter sua chave AIO.


Com a chave copiada, estamos prontos para começar. No entanto, para facilitar o processo de envio de dados para o serviço em nuvem, você também pode criar os feeds para os quais os dados serão enviados. (mais informações sobre o que são feeds AIO podem ser encontradas aqui). Como basicamente enviaremos o consumo de energia, criaremos um feed de energia. Para criar um feed, clique em “feeds” no topo da página AIO e clique em adicionar novo feed.


Dê a ele o nome que quiser, mas para manter as coisas simples, vou chamá-lo de consumo de energia. Você também pode decidir criar feeds para tensão e corrente e adaptar o código para publicar dados neles.


Com tudo isso implementado, agora estamos prontos para começar a construir o projeto.


Diagrama de circuito do medidor de energia Pi

O esquema do projeto Raspberry Pi Energy Monitor é relativamente complexo e envolve a conexão a uma tensão CA conforme mencionado anteriormente. Por favor, certifique-se de tomar todas as precauções necessárias para evitar choque elétrico. Se você não está familiarizado com o manuseio seguro de tensões CA, deixe a alegria de implementar isso em uma placa de ensaio, sem ligá-la, será satisfatória.



Os esquemas envolvem conectar a unidade de sensores de tensão e corrente ao ADC, que então envia os dados dos sensores para o Raspberry Pi. Para tornar as conexões mais fáceis de seguir, os esquemas para cada unidade são apresentados individualmente.



Esquema do sensor atual


Conecte os componentes do sensor de corrente conforme mostrado nos esquemas abaixo.


Esquemáticos da unidade de processamento

Conecte tudo junto com o ADC (ADS1115) conectado ao raspberry pi e a saída dos sensores de corrente e tensão conectados aos pinos A0 e A1 do ADS1115 respectivamente.


Certifique-se de que os pinos GND de ambas as unidades de detecção estão conectados ao GND do ADC ou ao raspberry pi.


Para tornar as coisas um pouco menos instáveis, implementei os sensores de tensão e corrente em um Protoboard. Além disso, não é recomendado construir um circuito de alimentação CA na placa de ensaio. Se você fizer o mesmo, sua configuração final pode ser parecida com a imagem abaixo


Com as conexões concluídas, agora estamos prontos para escrever o código do projeto.


Código Python para medidor de energia Pi

Como de costume com nossos projetos raspberry pi, desenvolvemos o código para o projeto usando python. Clique no ícone raspberry pi na área de trabalho, selecione a programação e inicie a versão de python que deseja usar. Usarei Python 3 e algumas das funções em Python 3 podem não funcionar para Python 2.7. Portanto, pode ser necessário fazer algumas alterações significativas no código se você quiser usar o python 2.7.

Farei uma divisão do código em pequenos trechos e compartilharei o código completo com você no final.



Preparado? Legal


O algoritmo por trás do código é simples. Nosso script python consulta o ADS1115 (sobre I2C) para leituras de tensão e corrente. O valor analógico recebido é recebido, mostrado e o valor da raiz quadrada média da tensão e da corrente são obtidos. A potência em quilowatts é calculada e enviada para a alimentação Adafruit IO após intervalos específicos.


Iniciamos o script incluindo todas as bibliotecas que usaremos. Isso inclui bibliotecas embutidas, como a biblioteca de tempo e matemática e as outras bibliotecas que instalamos anteriormente.


import time

import Adafruit_ADS1x15

from Adafruit_IO import *

import math


A seguir, criamos uma instância da biblioteca ADS1115 que será usada para endereçar o ADC físico daqui para frente.


# Create an ADS1115 ADC (16-bit) instance..

adc1 = Adafruit_ADS1x15.ADS1115()


Em seguida, forneça seu nome de usuário adafruit IO e a chave “AIO”.


username = ‘enter your username in between this quotes’

AIO_KEY = 'your aio key' 

aio = Client(username, AIO_KEY)


Por favor, mantenha a chave segura. Ele pode ser usado para acessar sua conta adafruit io sem sua permissão.



Em seguida, criamos algumas variáveis como o ganho para o ADC, o número de amostras que queremos e definimos o arredondamento que definitivamente não é crítico.



GAIN = 1         # see ads1015/1115 documentation for potential values.

samples = 200      # number of samples taken from ads1115

places = int(2)    # set rounding


Em seguida, criamos um loop while para monitorar a corrente e a tensão e enviar os dados para o Adafruit io em intervalos. O loop while começa definindo todas as variáveis como zero.


while True:

    # reset variables

    count = int(0)

    datai = []

    datav = []

    maxIValue = 0 #max current value within sample

    maxVValue = 0 #max voltage value within sample

    IrmsA0 = 0 #root mean square current 

    VrmsA1 = 0 # root mean square voltage

    ampsA0 = 0 #current peak

    voltsA1 =0  #voltage

    kilowatts = float(0)


Como estamos trabalhando com circuitos AC, a saída do SCT-013 e o sensor de tensão serão uma onda senoidal, portanto, para calcular a corrente e a tensão da onda senoidal, precisaremos obter os valores de pico. Para obter os valores de pico, vamos amostrar tensão e corrente (200 amostras) e encontrar os valores mais altos (valores de pico).


for count in range(samples):       

        datai.insert(count, (abs(adc1.read_adc(0, gain=GAIN))))

        datav.insert(count, (abs(adc1.read_adc(1, gain=GAIN))))

        # see if you have a new maxValue

        print (datai[count])

        if datai[count] > maxIValue:

            maxIValue = datai[count]           

        if datav[count] > maxVValue: 

            maxVValue = datav[count]


Em seguida, padronizamos os valores convertendo os valores ADC para o valor real, após o que usamos a equação da raiz quadrada da média para encontrar a tensão e a corrente RMS.


#calculate current using the sampled data

    # the sct-013 being used is calibrated for 1000mV output @ 30A.

    IrmsA0 = float(maxIValue / float(2047) * 30)

    IrmsA0 = round(IrmsA0, places)

    ampsA0 = IrmsA0 / math.sqrt(2)  

    ampsA0 = round(ampsA0, places)

    # Calculate voltage 

    VrmsA1 = float(maxVValue * 1100/ float(2047))

    VrmsA1 = round(VrmsA1, places)

    voltsA1 = VrmsA1 / math.sqrt(2)  

    voltsA1 = round(voltsA1, places)

    print('Voltage: {0}'.format(voltsA1))

    print('Current: {0}'.format(ampsA0))


Feito isso, a potência é calculada e os dados publicados no adafruit.io


#calculate power

    power = round(ampsA0 * voltsA1,places)

    print('Power: {0}'.format(power)) 

   #post data to adafruit.io  

   EnergyUsage = aio.feeds('EnergyUsage')

  aio.send_data('EnergyUsage’, power)


Para contas gratuitas, adafruit exige que haja algum atraso entre as solicitações ou o upload dos dados.


# Wait before repeating loop

    time.sleep(0)


O código completo do projeto está disponível no final desta página


Demo


Com o código completo, salve-o e clique no botão Executar no IDE do python. Antes disso, certifique-se de que o Pi está conectado à internet via WiFi ou LAN e que sua chave aio e nome de usuário estão corretos. Depois de um tempo, você deve começar a ver os dados de energia (potência) exibidos no feed do Adafruit.io. Minha configuração de hardware durante a demonstração foi assim


Para ir mais longe, você pode criar um painel em adafruit.io e adicionar um componente gráfico para obter uma visão gráfica dos dados, conforme mostrado na imagem abaixo.


É isso pessoal, agora você pode monitorar seu consumo de energia de qualquer lugar do mundo. É importante observar que definitivamente há muito mais ajustes e calibrações a serem feitos para transformá-lo em uma solução realmente precisa, mas acredito que isso lhe dá quase tudo de que você precisa para prosseguir.


#!/usr/bin/env python3

import time

import Adafruit_ADS1x15

from Adafruit_IO import *

import math

# Create an ADS1115 ADC (16-bit) instance..

adc1 = Adafruit_ADS1x15.ADS1115()

username = ‘your-user-name'

AIO_KEY = 'your-aio-key’

aio = Client(username, AIO_KEY)

GAIN = 1             # see ads1015/1115 documentation for potential values.

samples = 5          # number of samples taken from ads1115

places = int(2)        # set rounding

# create a while loop to monitor the current and voltage and send to Adafruit io.

while True:

    # reset variables

    count = int(0)

    datai = []

    datav = []

    maxIValue = 0

    maxVValue = 0

    IrmsA0 = 0

    VrmsA1 = 0

    ampsA0 = 0

    voltsA1 =0

    kilowatts = float(0)

    # since we are measuring an AC circuit the output of SCT-013 wand the voltage sensor will be a sinewave.

    # in order to calculate amps from sinewave we will need to get the peak voltage

    # from each input and use root mean square formula (RMS)

    # this loop will take 200 samples from each input and give you the highest (peak)

    for count in range(5):            

        datai.insert(count, (abs(adc1.read_adc(0, gain=GAIN))))

        datav.insert(count, (abs(adc1.read_adc(1, gain=GAIN))))

        # see if you have a new maxValue

        print (datai[count])

        if datai[count] > maxIValue:

            maxIValue = datai[count]               

        if datav[count] > maxVValue:

            maxVValue = datav[count]

            print("new maxv value:")

            print(maxVValue)                   

    #calculate current using the sampled data

    # I used a sct-013 that is calibrated for 1000mV output @ 30A. Usually has 30A/1V printed on it.

    print("proceeding")

    IrmsA0 = float(maxIValue / float(2047) * 30)

    IrmsA0 = round(IrmsA0, places)

    ampsA0 = IrmsA0 / math.sqrt(2)  # RMS formula to get current reading to match what an ammeter shows.

    ampsA0 = round(ampsA0, places)

    # Calculate voltage

    VrmsA1 = float(maxVValue * 1100/ float(2047))

    VrmsA1 = round(VrmsA1, places)

    voltsA1 = VrmsA1 / math.sqrt(2)  # RMS formula to get voltage reading to match what an voltmeter shows.

    voltsA1 = round(voltsA1, places)

    print('Voltage: {0}'.format(voltsA1))

    print('Current: {0}'.format(ampsA0))

    #calculate power

    power = round(ampsA0 * voltsA1,places)

    print('Power: {0}'.format(power))

    #post data to adafruit.io

    energyconsumption = aio.feeds('energyconsumption')

    aio.send_data('energyconsumption', power)

    # Wait before repeating loop

    time.sleep(30)


ENTRE EM CONTATO COM A LOJAMUNDI.

Assine nossa Newsletter! É gratuito!

Cadastre seu nome e email para receber novidades e materiais gratuitos da Lojamundi.