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);
}
}