Dúvidas Monitor de Energia com Arduino

Olá Manoel (@mlemos) , estou com problema e gostaria da sua ajuda…

É o seguinte, fizemos o monitor de energia baseado neste projeto e a principio nosso projeto funciona, é desenvolvido em PHP, com uma base de dados MySql em um servidor WAMP.

Gostaríamos de fazer uma conexão com android, onde o app iria ler as informações do banco de dados, e exibir as informações (a potencia, corrente, e até o valor em R$, mas isso poderíamos fazer depois).

O problema está que não consigo fazer a comunicação do android com o servidor WAMP que está rodando o banco de dados MySql, sendo assim resolvi fazer o seguinte, tentar conectar o android em uma outra base de dados, diferente do MySq e acabei conseguindo fazer essa conexão em um BD SQL Server, só que o nosso código em PHP só serve para o MySql, para eu gravar no SQL Server ele não funciona. Ai chegamos em um outro problema, que é fazer o código php, entender o novo banco de dados SQL Server, e para isso o servidor wamp, não está colaborando…

Gostaria da sua ajuda e da sua opinião, essa é a melhor forma de chegar no resultado que queremos? Ou se fizéssemos o aplicativo conectar direto com a ethernet shield, e o próprio app fizesse o calculo que precisamos e exibisse a potencia seria uma alternativa mais fácil? (O problema dessa opção é que não faço idéia de como o app pode comunicar com a placa ethernet)

@mlemos ou @lucaswmsilva, algum de vocês faz ideia de como mostrar no gráfico o consumo para mais de que 24 horas? Não entendo muito de php, mas pelo visto provavelmente deve-se ter de mudar na parte do código que chama os dados de “-1 day”.

" $link = mysql_connect(‘localhost’, ‘root’, ‘root’);
@mysql_select_db(‘energy’) or die( “Unable to select database”);
$yday = date(‘Y-m-d h:i:s’, strtotime("-1 day"));
$query = “SELECT * FROM medidas WHERE horario > ‘$yday’”; "

Posso eu alterar para “-30” para mostrar o consumo mensal?

E uma outra dúvida, fazendo isto (http://www.lucaspeperaio.com.br/blog/aprenda-configurar-o-wamp-server-como-um-servidor-online) liberando a porta do meu modem para acesso externo à porta 80 e ao site relacionado à ela, consigo fazer meu site ficar acessível para toda web?

Ola, estou montando um medidor e queria saber como fazer a programaçao em tempo real do consumo em KWh e o valor gasto, tendo em maos o valor da potenci… obrigado

Boa noite@darlanf, por favor, siga os tutoriais já mencionados neste fórum, no blog, e no site fazedores, está tudo detalhado acima neste tópico, por gentileza verifique com mais atenção.

Abraços.

Olá @lucaswmsilva,

Obrigado pelas dicas, me ajudaram muito. No meu caso estou testando o circuito de medição de corrente, com o circuito de medição de tensão não tive muitos problemas. Mas este circuito de corrente é muito sensível, qualquer diferença na tensão de alimentação ou na entrada do sinal do sensor resulta em erro. Consegui eliminar um pouco do erro colocando ao invés de 1 resistor de cada, colocar 2 de cada em paralelo, e também notei que ao fazer a medição somente com o arduino alimentado pela USB do computador, também não deu certo, tive que ligar o Arduino em uma fonte de 9V para ter uma medição mais precisa, irei colocando aqui algumas dicas que ajudem a melhorar a precisão, se alguém também tiver algumas dicas poste por favor.
O meu circuito de medição de corrente está com o seguinte código:

#include "EmonLib.h"                   // Include Emon Library
EnergyMonitor emon1;                   // Create an instance
void setup()
{  
    Serial.begin(9600);
    emon1.current(3, 60.6);             // Current: input pin, calibration.
}
void loop()
{
    double Irms = emon1.calcIrms(1480);  // Calculate Irms only
    Serial.print(Irms*127.0);           // Apparent power
    Serial.print(" ");
    Serial.println(Irms);               // Irms
}

está calibrado para tensão de 127V, utilizei 4 resistores de 470k (2 em paralelo), 2 resistor de carga de 33 (em paralelo), este circuito está apresentando na saída, quando não tem carga nenhuma “0.59W” e 0A.

Att,
Diego

@diego

Estou fazendo também o Medidor de Energia mas estou utilizando o sensor SCT-013 20A e estou com dificuldade na calibração do sensor, está com os seguintes valores:
Corrente (A): 0,003A
Potência (W): 1,00W
Sem nenhum equipamento ligado ao sensor.
Estou utilizando 02 resistores de 10kohms e 01 capacitor de 100uF.
O meu código está da seguinte forma:


Você poderia me explicar como você efetuou o cálculo de calibração do sensor?

Obrigada

Olá,

@MariaCeciliaReno

O primeiro problema foi com a alimentação do arduino, a medida ficou estabilizada apenas quando o Arduino foi alimentado com uma fonte de 9V. Quando alimentado pela USB do notebook a precisão dele diminui e não estabilizava no zero.
No projeto acima está sendo usando um capacitor de 100 uf, no caso foi utilizado um capacitor de 10 uf, quanto maior o valor do capacitor mais tempo ele demora para estabilizar.
A saída do sensor SCT-013-000 é em corrente, a saída do sensor SCT-013-020 é em tensão.
Quanto a calibração vai depender de 2 informações: relação de transformação do transformador e valor do resistor de carga.
Por exemplo para o sensor SCT-013 100A, 100A é o valor máximo do sensor, 0,05A (50mA) é a escala, estes dados estão escritos no sensor, e usando um resistor de carga de 33 ohms.
CT Ratio / Burden resistance = (100A / 0.05A) / 33 Ohms = 60.6
Ou também pode ser usado no CT Ratio a relação de transformação 2000:1
CT Ratio / Burden resistance = 2000 / 33 Ohms = 60.6
No site do OpenEnergy eles recomendam usar o sensor de SCT-013-000. O cálculo no código acima está correto, na relação de transformação (1800) e no resistor de carga (62).
CT Ratio / Burden resistance = 1800 / 62 Ohms = 29
Observação: no circuito não deve ser colocado o resistor de carga, porque o SCT-013-020 já tem um resistor de carga e a saída dele é em tensão e não em corrente.
No site do OpenEnergy eles dizem que a precisão é menor que 4 %, (1% do resistor + 3% do sensor), não é exata, mas é uma boa precisão, comparado com os medidores de energia residenciais brasileiros que tem uma precisão menor que 2% para os eletromecânicos e menor que 1% para os eletrônicos.

Att,
Diego

@diego

Obrigada Diego pelas dicas e explicação. Realmente efetuei a retirada do resistor de carga e mudei o capacitor para um de 10uF 50V. Também passei a utilizar a fonte de 9V para alimentar o circuito.
O resultado foi bom consegui 0 a minha corrente, mas a potência ainda permanece entre 1W. Acredito que com 1W de potência ainda não estou com o circuito estalizado seria bom se alcançasse abaixo de 0.5. Você poderia me ajudar?

Abraço.

Olá @MariaCeciliaReno
O erro da potência pode ser do cálculo da biblioteca Emonlib, ou pode ser também dos componentes. O que poderia ser feito, é corrigir através do código por software, por exemplo quando a leitura da corrente for 0, coloque 0 no valor da potência e ignore o valor da leitura.

Ola, estou realizando um projeto de um medidor com um shield GSM, modelo sim900, gostaria de saber se alguem pode me ajudar, queria saber como faço pra receber uma sms nele, ou seja queria mandar uma msg do meu celular para o shield e o conteudo da msg aparecer no monitor serial do arduino alguem pode me ajudar ??

Olá @darlanf, com o shield GSM não posso ajudar, não tenho ele. Mas posso te ajudar na comunicação do Arduino com um shield ethernet, ele irá enviar os dados através do roteador por um cabo normal de rede.

Att,
Diego

Olá @diego

Você poderia me ajudar com a comunicação do arduino mega 2560 com o ethernet shield W5100? Estou com dificuldades.

Obrigada.

Olá @MariaCeciliaReno ,

Eu tenho este módulo W5100, mas infelizmente o meu veio com defeito e não consegui fazer ele funcionar,
mas se você tiver dúvidas a respeito da ligação física ou do código, eu posso tentar te ajudar.
O que eu consegui fazer funcionar foi o shield ethernet ENC28J60, embaixo está o código que montei,
neste código ele se exibe as informações em um LCD, exibe no Serial Monitor do Arduino e envia os dados
coletados para o servidor do Emoncms através de WebApi.Para fazer funcionar o LCD, apenas tive de trocar os pinos. Os únicos requisitos é que deve ser instalado em um computador o servidor emoncms de acordo com o tutorial do Open Energy, o tutorial é bem simples e ele praticamente se auto instala, instalar ele no Windows é simples, no Linux também, mas no Linux deu um pouco mais de trabalho, e também o endereço IP onde está o servidor deve ser fixo, o do shield ethernet não precisa, mas no código abaixo ele está fixo.

    // Objetivo: Monitorar dados de consumo de energia e enviar os dados
    //           através da ethernet por webAPI.
    // Autor: Diego A. R.
    // Versão: 6.1
    // Data inicial: 01/05/2015
    // Última alteração: 21/07/2015
    // Placa alvo: Arduino Mega
     
    
    /*---------------------------------------------------------------
    
       Conexão para os pinos do shield ENC28J60,
       a comunicação é feita através dos pinos da interface SPI
       o pino CS, pode ser configurado para qualquer pino digital
       os outros são fixos.
    
        ENC28J60   Arduino UNO/Due  Arduino MEGA
          CS             D10            D53
          SI             D11            D51
          SO             D12            D50
          SCK            D13            D52
          RESET          RESET          RESET
          INT            D2             D2      (opcional)
          VCC            3V3            3V3
          GND            GND            GND
    
    ------------------------------------------------------------------
    */
    
    // Programa : Teste LCD 16x2 com Keypad
    // Autor : Arduino e Cia
      
    #include <LiquidCrystal.h>         // Biblioteca para o display LCD   
                                       // Referência: 
    #include "EmonLib.h"               // Biblioteca EmonLib para coleta de valores de tensão e corrente
                                       // Referência: http://openenergymonitor.org
    #include "EtherCard.h"             // Biblioteca Ethercard, utilizada para comunicação Ethernet, 
                                       // através do shield ENC28J60
                                       // Referência: http://jeelabs.net/pub/docs/ethercard/index.html
    
    //---------------------------------------------------------------------
    // Classe auxiliar que controla o pacote de internet
    // Gera uma string no formato json para enviar via ethernet
    //---------------------------------------------------------------------
    class PacketBuffer : public Print {
      public:
        PacketBuffer () : fill (0) {}
        const char* buffer() {
          return buf;
        }
        byte length() {
          return fill;
        }
        void reset()
        {
          memset(buf, NULL, sizeof(buf));
          fill = 0;
        }
        virtual size_t write (uint8_t ch)
        {
          if (fill < sizeof buf) buf[fill++] = ch;
        }
        byte fill;
        char buf[300];
      private:
    };
    
    
    // CRIAÇÃO DE OBJETOS
    EnergyMonitor en;             // Cria um tipo para controlar as medições
     
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  
    
    static byte meuMac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };   // endereço MAC da placa Ethernet
                                                                     // 74-69-69-2D-30-31 
    
    static byte myip[] = { 192, 168, 1, 9 };  // endereço ip Arduino
                                                 // 192.168.1.9 
    
    static byte hisip[] = { 192, 168, 1, 5 };  // endereço ip do servidor
                                                 // 192.168.1.108  
    
    static byte gwip[] = { 192, 168, 1, 1 };  // endereço gateway
                                                 // 192.168.1.1 
    
    // informe a chave da API, para comunicação REST,
    // no emoncms é a chave read&write
    char apikey[] = "7c5bd312798492dba9d305119fa55b01";
    
    //informe o numero do Nó
    int numeroNo = 1;                  // número do nó, somente mudar se for ter vários sensores
    
    
    // CORRENTE
    int pinCon = 8;                    // Pino do sensor de corrente
    float calCon = 60.6f;              // Calibração do sensor de corrente
    
    // TENSÃO
    int pinTen = 9;                    // Pino do sensor de tensão
    float calTen =  117.4f;            // Calibração do sensor de tensão
    float mudTen = 1.7f;               // Mudança de fase da tensão
    
    //exibe a saida formatada
    char* saFo;
    char* msg;
    
    int tempoEnvio = 5000;             // Tempo de envio entre os dados em milisegundos 
    
    #define BUFFER_SIZE 700                    // Configura tamanho do buffer Ethernet, não colocar menor que 350                                              
    byte Ethernet::buffer[BUFFER_SIZE];        // Cria um tipo para controlar as operações de Ethernet
    
    PacketBuffer str;                           // cria um tipo packet buffer
    
    static uint32_t timer;
    
      
    void setup()   
    { 
      lcd.begin(16, 2);  
      Serial.begin(57600);              // Abre a porta serial e configura sua velocidade em 57600 bits/s
      en.current(pinCon, 60.6);
    
      msg = "Iniciando...";
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(msg);
      Serial.println(msg);
      delay(1000);
    
      // Inicia a placa Ethernet com o tamanho do Buffer, o endereço MAC,
      // e o pino para o CS (cable select), neste caso o pino 10
      if (ether.begin(sizeof Ethernet::buffer, meuMac, 53) == 0)
      {
        Serial.println("Falha Ethernet");
      }
    
     // Tenta obter um endereço do servidor DHCP
     // if (!ether.dhcpSetup())
     // {
     //   Serial.println("Falha DHCP");
     // }
    
       if (!ether.staticSetup(myip, gwip))
        Serial.println("Falha IP");
      
      ether.printIp("IP:", ether.myip);  // endereço IP atribuído ao controlador, obtém através do DHCP
      ether.printIp("GAT:", ether.gwip); // endereço IP do Gateway, é o endereço do roteador
      ether.copyIp(ether.hisip, hisip);  //Configura o endereço do servidor
      ether.printIp("SER:",ether.hisip); // endereço IP do servidor 
      delay(2000);
      
      // sensor de corrente conectado ao pino analógico 1
      en.current(pinCon, calCon);        // Corrente: pino de entrada, calibração. 
      //sensor de tensão conectado ao pino analógico 2
      en.voltage(pinTen, calTen, mudTen);  // Tensão: pino de entrada, calibração, mudança de fase
    
      // Para informações sobre a calibração dos sensores de tensão e corrente:
      // http://openenergymonitor.org/emon/buildingblocks/ct-and-ac-power-adaptor-installation-and-calibration-theory
      
      // sensor de corrente conectado ao pino analógico 1
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Pin I:");
      lcd.setCursor(7,0);
      lcd.print(pinCon);
      lcd.setCursor(0,1);
      Serial.print(calCon,2); 
      lcd.print(calCon,2);
      delay(2500);
      
      //sensor de tensão conectado ao pino analógico 2
      en.voltage(pinTen, calTen, mudTen);  // Tensão: pino de entrada, calibração, mudança de fase
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Pin U:");
      lcd.setCursor(7,0);
      lcd.print(pinTen);
      lcd.setCursor(0,1);
      Serial.print(calTen,2); 
      lcd.print(calTen,2);
      delay(2500);
    
      // Para informações sobre a calibração dos sensores de tensão e corrente:
      // http://openenergymonitor.org/emon/buildingblocks/ct-and-ac-power-adaptor-installation-and-calibration-theory
    
      /*
       * Exemplo de saída no LCD
       * V: 127.20  I:30.06
       * kW: 3823.63
       */
      lcd.clear();
      Serial.println();
      lcd.setCursor(0,0);
      lcd.print("V:");
      lcd.setCursor(8,0);
      lcd.print("I:");
    
      // a segunda linha exibe o valor da corrente
      lcd.setCursor(0,1);
      lcd.print("W:");
    }  
    
    // chamado toda vez que o cliente faz um pedido(request) para o servidor
    // é a resposta ao pedido http
    static void my_callback (byte status, word off, word len) {
      Serial.println(">>>");
      Ethernet::buffer[off+300] = 0;
      Serial.print((const char*) Ethernet::buffer + off);
      Serial.println("...");
    }
    
    
      
    void loop()  
    {  
      ether.packetLoop(ether.packetReceive());
    
      if (millis() > timer) {
        timer = millis() + tempoEnvio;
    
        //double Irms = en.calcIrms(1480);  // Calculate Irms only
    
        en.calcVI(20, 2000);                          // Calcula número de ondas, tempo de leitura
        float pat    = en.realPower;        // Coloca o valor da potência ativa na variável
        float pap = en.apparentPower;    // Coloca o valor da potência aparente na variável
        float fp  = en.powerFactor;      // Coloca o valor do fator de potência na variável
        float tRMS        = en.Vrms;             // Coloca o valor da tensão RMS na variável
        float cRMS      = en.Irms;             // Coloca o valor da corrente RMS na variável
       
        // potência ativa kW
        Serial.print(pat);
        Serial.print("W ");
    
        // potência aparente kVA
        Serial.print(pap);
        Serial.print("VA ");
    
         // tensão
        Serial.print(tRMS);
        Serial.print("V ");  
    
        // corrente    
        Serial.print(cRMS);  
        Serial.print("A ");
    
        // fator de potência
        Serial.print(fp);
        Serial.print("fp ");
    
        // gera os parametros da string em formato json
        // post.json?apikey=7c5bd312798492dba9d305119fa55b01&node=1&json={W:1.00,VA:1.00,V:1.00,I:1.00,fp:1.00}\0
        str.reset();  
        str.print("post.json?");
        str.print("apikey=");
        str.print(apikey);        
        str.print("&node=");
        str.print(numeroNo);
        str.print("&json={");
        str.print("Ims:");
        str.print(cRMS);        
        str.print("}\0");
      
        // encaminha a solitação de página POST
        // 192.168.1.108/input/post.json?apikey=7c5bd312798492dba9d305119fa55b01&node=1&json={W:1.00,VA:1.00,V:1.00,I:1.00,fp:1.00}\0
        Serial.println();
        Serial.print("<<< REQ ");    
        ether.browseUrl(PSTR("/input/"), str.buf, "192.168.1.5", my_callback);
      
       //imprime o valor da tensão
        Serial.println();
        lcd.setCursor(2, 0);
        lcd.print(tRMS);  
    
        //imprime o valor da corrente
        lcd.setCursor(10, 0);
        lcd.print(cRMS,4);
    
        //imprime a potência atual
        lcd.setCursor(4, 1);
        lcd.print(cRMS*tRMS);
      }
      
    }
1 curtida

Olá eu achei muito interessante a elaboração do monitor de energia elétrica com o Arduino. Eu decidi montá-lo utilizando a linguagem de programação Ruby com o servidor Sinatra, pois na minha opinião este é um método eficiente e simples de se trabalhar. Elaborei o projeto de acordo com o tutorial do site, que por sua vez é excelente. Também fiz a instalação das Gems necessárias para o funcionamento do servidor, e do pacote Sqlite. Em relação ao código do projeto está ok. A única dificuldade é em relação à conexão do servidor com a página web através da porta TCP/IP. Geralmente por padrão, a porta adotada pelo Sinatra é a porta 4567. Mas como eu estou utilizando um roteador que será o ponto de acesso entre o servidor (PC que está instalado os pacotes do Sinatra e o Ruby e que irá hospedar a página web) e os clientes, como outros dispositivos conectados à rede Wireless. No caso do computador servidor ele está com o endereço ip 192.168.1.100 distribuído via DHCP pelo roteador. Então no código set :bind, eu informei este endereço ip. Mas a minha dúvida é em questão da porta TCP/IP. Neste caso, seria necessário configurar a porta via MySQL, ou apenas liberar uma porta TCP no roteador ?
Obs: Eu estou utilizando a IDE Aptana para a visualização dos códigos. E as Gems eu instalei através do PowerShell no Windows.
Estou contando com a ajuda de vocês.
Desde já muito Obrigado

@Johnny sobre Ruby quem poderá te dar um help é o nosso Mestre @mlemos, ele manja do assunto, abraços !!!

@Diego,

Legal muito obrigada.

Mas então como você definiu o ip do arduino? Quero usar DHCP também mais estou com dificuldades. Não consigo configurar meu modem. Quero poder acessar a base de dados de qualquer lugar que eu estiver.

Você poderia me ajudar?

Grata.

Olá @mlemos eu estou com uma dúvida em relação em fazer a conexão do Arduino com o Servidor. Como eu estou utilizando o Sinatra com o código que você disponibilizou no Github, eu estava pensando em usar a instrução set :bind, ‘0.0.0.0’ ao invés de localhost para a página ser reconhecida pelos outros dispositivos. E em relação a porta eu estou utilizando a padrão (4567) e a liberei no roteador nas configurações de TCP/IP para não haver problemas. Com o notebook conectado ao roteador e o Arduino com a Shield configurada de acordo com a faixa de endereço IP, os outros dispositivos conectados na minha rede local irão ter acesso à página web normalmente?
E mais uma dúvida, assim que eu conectar o Arduino com a Shield Ethernet, as variáveis informadas no código serão enviadas para o servidor automaticamente ou eu teria que executar algum arquivo específico, ou apenas de acessar com a URL ( http://0.0.0.0:4567/dashboard) os valores já estarão sendo enviados para o servidor ?

Desde já muito obrigado

Procure pela biblioteca “Emonlib.h”.
Irá medir o fator de potência com precisão. Porém, esta biblioteca não utiliza a potência aparente (S) e a potência ativa § para se conseguir encontrar o cosseno do ângulo (fator de potência).
Dê uma pesquisada. Vale a pena. Estou utilizando e as mediços são muito próximas do real.

Abraços

Olá Senhores. Estou montando um projeto para medição de um circuito trifásico. No código eu abro 3 instâncias de medição. Quando visualizo no monitor serial, os valores de potência real e fator de potência estão muito diferentes. Estou testando com um motor trifásico, com um amperímetro já da pra ver que o mesmo não está balanceado, porém os valores das potências estão muito fora do normal. Com relação a potência aparente, tensão e corrente estão bem próximos. A alimentação do arduino está pela USB. Há algo que possa estar errado?

Boa noite, estou testando este passo a passo , corrigir os pequenos erros do PHP e mysql, mas acredito que ainda esta faltando algo, pois não esta aparecendo o gráfico, alguém tem alguma sugestão ?
estou utilizando o wamp.

Desde já agradeço.